给定矩阵A,我必须对A的条目进行所有可能的组合,使得每行只选择一个数字。我做了一个成功运行的递归程序。但我无法保存输出向量。因此,例如在下面的矩阵A中,将有27个这样的组合,我想将它们保存在3x27的矩阵中。
{{1}}
答案 0 :(得分:0)
这是可能的方法之一:
要使变量在所有上下文中都可见,您需要声明一个全局变量:
global OUT;
%rest of the code
然后,您只需将主文件中的OUT
定义为空变量:
OUT = [];
在函数脚本中,只要满足if语句,就会指示将X
附加到OUT
:
if (n > 3)
OUT = [OUT,X];
return
end
结果代码如下:
global OUT;
OUT = [];
A = [3 4 0; 2 3 7; 45 7 0];
n = 1;
X = zeros(3,1);
comb_SO(n, X, A);
OUT
function X = comb_SO(n, X, A)
global OUT;
if (n > 3)
OUT = [OUT,X];
return
end
for i = 1:3
X(n) = A(n, i);
comb_SO(n + 1, X, A);
end
end
所寻求的结果位于OUT
变量:
3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 0 0 0 0 0 0 0 0 0
2 2 2 3 3 3 7 7 7 2 2 2 3 3 3 7 7 7 2 2 2 3 3 3 7 7 7
45 7 0 45 7 0 45 7 0 45 7 0 45 7 0 45 7 0 45 7 0 45 7 0 45 7 0
但是,MATLAB功能可以在没有任何递归的情况下实现您的目标:
A = [3 4 0; 2 3 7; 45 7 0];
OUT = combvec(A(1,:),A(2,:),A(3,:))
或者,即使没有combvec
,任意大小的A:
A = reshape(1:20,4,5);
[n,m] = size(A);
Q = repmat({1:m},n,1);
B = cell(n,1);
[B{:}] = ndgrid(Q{:})
tmp = [];
OUT = [];
for k = 1:n
tmp = [tmp,B{k}(:)];
OUT = [OUT;A(k,tmp(:,k))];
end
希望,这有帮助