我试图找到等于某个矩阵的所有可能的和的组合。假设我有:
a = [1 0 0; 0 1 0 ; 0 0 1];
b = [5 0 0; 0 5 0 ; 0 0 5];
我从矩阵a
开始,想要使用b
和r1
的矩阵添加来生成矩阵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
。有什么帮助吗?
答案 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 。