Matlab 如何在递归函数中保存多个输出
给定一个矩阵a,我必须对a的所有可能的条目进行组合,以便每行只选择一个数字。我已经做了一个递归程序,正在成功运行。但我无法保存输出向量。例如,在下面的矩阵A中,有27个这样的组合,我想把它们保存在3x27阶的矩阵中Matlab 如何在递归函数中保存多个输出,matlab,recursion,save,Matlab,Recursion,Save,给定一个矩阵a,我必须对a的所有可能的条目进行组合,以便每行只选择一个数字。我已经做了一个递归程序,正在成功运行。但我无法保存输出向量。例如,在下面的矩阵A中,有27个这样的组合,我想把它们保存在3x27阶的矩阵中 A = [3 4 0; 2 3 7; 45 7 0] n = 1; X = zeros(3,1); comb(n, X, A); %function to calculate all combinations. function X = comb(n, X, A) i
A = [3 4 0; 2 3 7; 45 7 0]
n = 1;
X = zeros(3,1);
comb(n, X, A);
%function to calculate all combinations.
function X = comb(n, X, A)
if (n > 3)
X
return
end
for i = 1:3
X(n) = A(n, i);
comb(n + 1, X, A);
end
end
以下是一种可能的方法: 要使变量在所有上下文中都可见,您需要声明一个全局变量:
global OUT;
%rest of the code
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
然后,您只需在主文件中将OUT
定义为空变量:
global OUT;
%rest of the code
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
在函数脚本中,只要满足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
所寻求的结果是inOUT
变量:
global OUT;
%rest of the code
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 = 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
希望,这会有所帮助您能向我们展示您的代码(重要部分)吗?你说不能储蓄是什么意思?n=1;X=零(3,1);梳(n,X,A);%函数计算所有组合。函数X=comb(n,X,A),如果(n>3)X返回端i=1:3 X(n)=A(n,i);梳(n+1,X,A);结束结束我的代码中存在一些格式问题。但是如果你只是在matlab中复制粘贴它,它就会正常运行。我想保存每个输出向量X。在矩阵A的这种特殊情况下,将有27个输出向量。我想把它保存在一个3x27阶的矩阵中。