我想生成给定数量向量的元素的所有可能组合。
例如,对于,[1 2]
我想生成元素:[1 2]
[4 5]
[1 1 4; 1 1 5; 1 2 4; 1 2 5; 2 1 4; 2 1 5; 2 2 4; 2 2 5]
问题是我不知道需要计算组合的向量数量。在这种情况下可能有 3 个,或者可能有 10 个,我需要一个概括。你能在 MATLAB 中帮我解决这个问题吗?是否已经有可以执行此任务的预定义函数?
我想生成给定数量向量的元素的所有可能组合。
例如,对于,[1 2]
我想生成元素:[1 2]
[4 5]
[1 1 4; 1 1 5; 1 2 4; 1 2 5; 2 1 4; 2 1 5; 2 2 4; 2 2 5]
问题是我不知道需要计算组合的向量数量。在这种情况下可能有 3 个,或者可能有 10 个,我需要一个概括。你能在 MATLAB 中帮我解决这个问题吗?是否已经有可以执行此任务的预定义函数?
考虑使用NDGRID函数的解决方案:
sets = {[1 2], [1 2], [4 5]};
[x y z] = ndgrid(sets{:});
cartProd = [x(:) y(:) z(:)];
cartProd =
1 1 4
2 1 4
1 2 4
2 2 4
1 1 5
2 1 5
1 2 5
2 2 5
或者,如果您想为任意数量的集合提供通用解决方案(无需手动创建变量),请使用此函数定义:
function result = cartesianProduct(sets)
c = cell(1, numel(sets));
[c{:}] = ndgrid( sets{:} );
result = cell2mat( cellfun(@(v)v(:), c, 'UniformOutput',false) );
end
请注意,如果您愿意,可以对结果进行排序:
cartProd = sortrows(cartProd, 1:numel(sets));
此外,上面的代码不会检查集合是否没有重复值(例如:){[1 1] [1 2] [4 5]}
。如果您想添加这一行:
sets = cellfun(@unique, sets, 'UniformOutput',false);
在 FileExchange 上尝试ALLCOMB功能。
如果将向量存储在元胞数组中,则可以像这样运行它:
a = {[1 2], [1 2], [4 5]};
allcomb(a{:})
ans =
1 1 4
1 1 5
1 2 4
1 2 5
2 1 4
2 1 5
2 2 4
2 2 5
这个较晚的答案提供了两个额外的解决方案,其中第二个是解决方案(在我看来)以及ndgrid
通过应用 MATLAB 强大的逗号分隔列表而不是单元格数组来改进 Amro 的答案解决方案以获得高性能,
combvec
正如 Amro 在他的回答中所做的那样,逗号分隔的列表语法 ( v{:}
) 同时提供了ndgrid
. 不同之处(第四行)是它避免cellfun
并cell2mat
通过应用逗号分隔的列表,再次,现在作为输入cat
:
N = numel(a);
v = cell(N,1);
[v{:}] = ndgrid(a{:});
res = reshape(cat(N+1,v{:}),[],N);
的使用cat
和reshape
执行时间几乎减少了一半。这种方法在我对另一个问题的回答中得到了证明,Luis Mendo 更正式地回答了这个问题。
我们也可以在 matlab 中使用 'combvec' 指令
no_inp=3 % number of inputs we want...in this case we have 3 inputs
a=[1 2 3]
b=[1 2 3]
c=[1 2 3]
pre_final=combvec(c,b,a)';
final=zeros(size(pre_final));
for i=1:no_inp
final(:,i)=pre_final(:,no_inp-i+1);
end
final
希望能帮助到你。祝你好运。