在matlab中找到所有可能的组合

时间:2013-05-07 02:07:24

标签: matlab matrix

我试图找到等于某个矩阵的所有可能的和的组合。假设我有:

a = [1 0 0; 0 1 0 ; 0 0 1];
b = [5 0 0; 0 5 0 ; 0 0 5];

我从矩阵a开始,想要使用br1的矩阵添加来生成矩阵r2例如:< / p>

r1 = [1 0 0; 0 1 0 ; 0 0 1];
r2 = [2 0 0; 0 2 0 ; 0 0 2];

我希望它显示所有组合的矩阵,加法和结果矩阵,我的意思是:4r1(1 + 1 + 1 + 1 + 1),1r1 + 1r2 + 1r1(1 + 1 + 2) +1),1r2 + 1r1 + 1r1(1 + 2 + 1 + 1)和2r2(1 + 2 + 2)。

这是我到目前为止所得到的,但我无法通过所有组合:

function v = test_r2(a, b)
    if isequal(a,b)==1
        v = [];
        disp('same')
        return
    end
        v= test_r3(a,b);
    end 

function v = test_r3(a, b)`
    r1 = [1 0 0; 0 1 0 ; 0 0 1];
    r2 = [2 0 0; 0 2 0 ; 0 0 2];

    r=[{r1} {r2}];

    if isequal(a,b)==1
        v = b;
    else % recursive call

        for k = 1:numel(r)
        for i = nchoosek(1:numel(r),k)'
            r_matrix = r{1,i};
            if(isequal(a + r_matrix,b) ==1)
                disp([a(:)', r_matrix(:)'])
            end      
        end    
    end

基本上我希望它通过单元格数组找到所有可能的组合,这些组合将允许我从矩阵a到矩阵b。有什么帮助吗?

1 个答案:

答案 0 :(得分:1)

基本上你要为x 1 和x 2 解决以下系统:

  

x 1 r 1 + x 2 r 2 = b - a

在MATLAB中,您可以通过官方文档中的these instructions来完成此操作:

y = reshape(b - a, [], 1);
R = [r1(:), r2(:)];
x0 = R \ y;                     %// Basic solution
Z = null(R, 'r');               %// Null space of R

表单的任何解决方案:x = x0 + Z * p(对于任意向量p)应满足:y = R * x。请注意,由于浮点运算,这可能会给您带来微小的错误,因此请考虑设置容差阈值并对其进行舍入:

idx = (x0 - round(x0) < 100 * eps);
x0(idx) = round(x0(idx));

现在让我们找到x0 + Z * p形式的所有正整数组合:

if isempty(Z)                   %// Only one solution exists
    X = x0;
else
    N = max([ceil(x0); Z(:)]);  %// Set a search range
    U = cell(size(Z, 2), 1);
    [U{:}] = ndgrid(-N:N);
    U = cellfun(@(x)x(:), U, 'UniformOutput', false);
    P = [U{:}];                 %// All possible values for p within search range
    X = bsxfun(@plus, x0(:).', P * Z.');
    X = unique(X(all(X >= 0, 2), :), 'rows');
end

%// Keep only the positive combinations
X = unique(X(all(X >= 0, 2), :), 'rows');

实施例

让我们先设定初始条件:

a = eye(3);
b = 5 * eye(3);
r1 = eye(3);
r2 = 2 * eye(3);

运行代码的第一部分后,我们应该得到:

x0 =
     0
     2

Z =
    -2
     1

代码的第二部分应该产生所有可能的正整数组合:

X =
     0     2
     2     1
     4     0

对应于总和:0 r 1 + 2 r 2 ,2 r 1 + 1 r 2 和4 r 1 + 0 r 2