2

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

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

我从矩阵开始a,想通过使用和的矩阵加法来生成b矩阵,例如r1r2

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

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

4

1 回答 1

1

基本上,您希望为 x 1和 x 2解决以下系统:

x 1 ∙<b>r 1 + x 2 ∙<b>r 2 = b - a

在 MATLAB 中,您可以按照官方文档中的这些说明进行操作:

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

于 2013-05-12T13:08:50.643 回答