如何在递归函数中保存多个输出
Posted
技术标签:
【中文标题】如何在递归函数中保存多个输出【英文标题】:How to save multiple output in recursive function 【发布时间】:2017-04-03 06:06:20 【问题描述】:给定一个矩阵 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)
if (n > 3)
X
return
end
for i = 1:3
X(n) = A(n, i);
comb(n + 1, X, A);
end
end
【问题讨论】:
你能告诉我们(重要的部分)你的代码吗?无法保存是什么意思? n=1; X=零(3,1);梳(n,X,A); %function 计算所有组合。 function X =comb(n,X, A) if (n>3) X return end for i=1:3 X(n)= A(n,i);梳(n+1,X,A);结束结束 我的代码存在一些格式问题。但是如果你只是将它复制粘贴到matlab中它会正常运行。 Soltius,现在显示代码。我想保存每个输出向量 X。在矩阵 A 的这种特殊情况下,将有 27 个输出向量。然后我想保存在一个 3x27 的矩阵中。 【参考方案1】:这是一种可能的方法:
要使您的变量在所有上下文中可见,您需要声明一个全局变量:
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,Bk(:)];
OUT = [OUT;A(k,tmp(:,k))];
end
希望对你有帮助
【讨论】:
以上是关于如何在递归函数中保存多个输出的主要内容,如果未能解决你的问题,请参考以下文章