如何在递归函数中保存多个输出

时间:2017-04-03 06:06:21

标签: matlab recursion save

给定矩阵A,我必须对A的条目进行所有可能的组合,使得每行只选择一个数字。我做了一个成功运行的递归程序。但我无法保存输出向量。因此,例如在下面的矩阵A中,将有27个这样的组合,我想将它们保存在3x27的矩阵中。

{{1}}

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

希望,这有帮助