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

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,我必须对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

以下是一种可能的方法:

要使变量在所有上下文中都可见,您需要声明一个全局变量:

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
所寻求的结果是in
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
但是,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阶的矩阵中。