matlab 一种递归函数,用于列出单元格数组中的每个元素

jjhzyzn0  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(155)

我正在尝试从向量数组中获取所有可能的元素组合。例如,假设我有一个细胞阵列

C = {[1 2 3 4 5], [6:13], [14 15]}

则输出应该类似于

out = {[1 6 14], [1 6 15], [1 7 14], [1 7 15],....,[5 13 15]}

我试图使用递归函数来实现这一点,但下面的代码似乎不起作用。我如何才能获得所有这些组合的列表?

function [out,i] = permuteTest2(a,i,N,l,out)
    if nargin == 0
        a={[1 2],[4 5],[7 8]};
        N = length(a);
        i = 1;
        out = [];
    end
    if i == N
        out = [out, a{i}(l)];
        return;
    else
        for k=i:N
            L = length(a{k});
            for l=1:L
                out =[out a{k}(l)];
                [out,i] =permuteTest2(a, i+1, N,l,out);
            end
        end
    end
2j4z5cfb

2j4z5cfb1#

假设您有一个单元数组C,其中有N个向量。要从每个向量中获得一个元素的所有组合,需要将第一个向量中的每个元素与其余向量的所有组合组合在一起:

function combs = all_combinations(C)
   a = C{1};
   b = all_combinations(C(2:end));
   % ... get all the combinations of a and b here

如果C只有一个元素,那么所有组合就是该元素(让我们将其转换为一个单元格数组,每个单元格中有一个数字,以匹配预期的输出格式):

function combs = all_combinations(C)
   a = C{1};
   if numel(C) == 1
      combs = num2cell(a);
      return;
   end
   b = all_combinations(C(2:end));
   % ... get all the combinations of a and b here

这会处理递归部分。现在我们需要做的就是找到两个集合ab的所有组合:

function combs = all_combinations(C)
   a = C{1};
   if numel(C) == 1
      combs = num2cell(a);
      return;
   end
   b = all_combinations(C(2:end));
   combs = cell(numel(a), numel(b));
   for ii = 1:numel(a)
      for jj = 1:numel(b)
         combs{ii, jj} = [a(ii), b{jj}];
      end
   end
   combs = combs(:);

要理解上面的答案,重要的是跟踪哪些元素是单元数组,哪些不是单元数组,以及如何索引单元数组({}用于从数组中提取元素,()用于索引单元数组的部分,从而创建新的单元数组)。
我还在所有地方使用numel,而不是lengthnumel效率更高,如果您输入的是一维以上的数组,而不是向量,则允许上面的代码同样良好地工作。
更健壮的函数将测试输入的C是至少具有一个元素的单元数组,并且它将测试该单元数组的每个元素是数值数组(或向量)。

相关问题