为了账号安全,请及时绑定邮箱和手机立即绑定

生成某些向量元素的所有可能组合(笛卡尔积)

生成某些向量元素的所有可能组合(笛卡尔积)

生成某些向量元素的所有可能组合(笛卡尔积)我想要生成给定数量的向量元素的所有可能组合。例如,对于[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吗?是否已经有可执行此任务的预定义函数?
查看完整描述

3 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

试一试ALLCOMB函数在FileExchange。

如果将向量存储在单元格数组中,则可以这样运行:

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


查看完整回答
反对 回复 2019-07-05
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

使用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);


查看完整回答
反对 回复 2019-07-05
?
杨魅力

TA贡献1811条经验 获得超5个赞

这个迟来的答案提供了两个额外的解决方案,第二个解决方案是(我认为)并改进了Amro的答案ndgrid通过应用MATLAB强大的逗号分隔列表而不是单元数组来实现高性能,

  1. 如果您有神经网络工具箱:使用

    combvec

  2. 如果你做了

    拥有工具箱,就像通常的情况一样:下面是将笛卡儿积推广到任意数量集合的另一种方法。

正如Amro在回答中所做的那样,逗号分隔的List语法(v{:})的投入和产出ndgrid..不同之处(第四行)是它避免了cellfuncell2mat通过将逗号分隔的列表应用到cat:

N = numel(a);v = cell(N,1);[v{:}] = ndgrid(a{:});res = reshape(cat(N+1,v{:}),[],N);

使用catreshape几乎把执行时间缩短了一半。这一方法在我对另一个问题的回答,和路易斯·门多(Luis Mendo)更正式地.


查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 682 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信