function result = cartesianProduct(sets)
c = cell(1, numel(sets));
[c{:}] = ndgrid( sets{:} );
result = cell2mat( cellfun(@(v)v(:), c, 'UniformOutput',false) );
end
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
5条答案
按热度按时间3vpjnl9f1#
考虑使用NDGRID函数的解决方案:
或者,如果你想要一个任意数量的集合的通用解决方案(而不必手动创建变量),使用这个函数定义:
请注意,如果您愿意,您可以对结果进行排序:
此外,上面的代码不会检查集合是否没有重复的值(例如:
{[1 1] [1 2] [4 5]}
)。添加这一行,如果你想:5n0oy7gb2#
在FileExchange中尝试ALLCOMB功能。
如果你把向量存储在单元数组中,你可以这样运行它:
k3fezbri3#
这个迟到的答案提供了两个额外的解决方案,其中第二个是 * 解决方案 *(在我看来)和改进Amro的答案解决方案与
ndgrid
通过应用MATLAB的强大的逗号分隔列表,而不是高性能的单元阵列,1.如果你有神经网络接口:使用
combvec
1.如果你没有工具箱,通常情况下:下面是另一种将笛卡尔积推广到任意集合数的方法。
正如Amro在他的回答中所做的那样,逗号分隔列表语法(
v{:}
)提供了ndgrid
的输入和输出。不同之处(第四行)在于,它通过应用逗号分隔的列表来避免cellfun
和cell2mat
,现在再次作为cat
的输入:cat
和reshape
的使用将执行时间缩短了近一半。这种方法在my answer to an different question和more formally by Luis Mendo中得到了演示。kxkpmulp4#
从MATLAB 2023a开始,您可以使用
combinations
函数,该函数支持向量,矩阵,单元阵列及其混合:输出的格式为table,它支持混合类型。如果输出只需要一个类型,可以使用
table2array
将输出转换为矩阵:值得一提的是,我写了一个shim,它在旧版本的MATLAB中模拟
combinations
的行为(直到2013b版),包括对混合类型的支持:pobjuy325#
我们也可以使用matlab中的'combvec'指令
希望有帮助。祝你好运