我正在尝试从向量数组中获取所有可能的元素组合。例如,假设我有一个细胞阵列
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
1条答案
按热度按时间2j4z5cfb1#
假设您有一个单元数组
C
,其中有N个向量。要从每个向量中获得一个元素的所有组合,需要将第一个向量中的每个元素与其余向量的所有组合组合在一起:如果
C
只有一个元素,那么所有组合就是该元素(让我们将其转换为一个单元格数组,每个单元格中有一个数字,以匹配预期的输出格式):这会处理递归部分。现在我们需要做的就是找到两个集合
a
和b
的所有组合:要理解上面的答案,重要的是跟踪哪些元素是单元数组,哪些不是单元数组,以及如何索引单元数组(
{}
用于从数组中提取元素,()
用于索引单元数组的部分,从而创建新的单元数组)。我还在所有地方使用
numel
,而不是length
。numel
效率更高,如果您输入的是一维以上的数组,而不是向量,则允许上面的代码同样良好地工作。更健壮的函数将测试输入的
C
是至少具有一个元素的单元数组,并且它将测试该单元数组的每个元素是数值数组(或向量)。