【问题标题】:Cartesian product in MATLABMATLAB 中的笛卡尔积
【发布时间】:2012-04-07 17:18:23
【问题描述】:

这是我遇到的问题的简化版本。假设我有一个向量

p=[1 5 10] 

还有一个

q=[.75 .85 .95]

我想得出以下矩阵:

res=[1, .75;
     1, .85;
     1, .95;
     5, .75;
     5, .85;
     5, .95;
    10, .75;
    10, .85;
    10, .95]

这也称为笛卡尔积。 我该怎么做?

【问题讨论】:

标签: matlab matrix cartesian-product


【解决方案1】:

这是一种方法:

[X,Y] = meshgrid(p,q);
result = [X(:) Y(:)];

输出是:

result =

    1.0000    0.7500
    1.0000    0.8500
    1.0000    0.9500
    5.0000    0.7500
    5.0000    0.8500
    5.0000    0.9500
   10.0000    0.7500
   10.0000    0.8500
   10.0000    0.9500

【讨论】:

  • 虽然这确实是笛卡尔积,但这不是 OP 所要求的。它需要额外的result=sum(result,2) 步骤才能获得资格。
  • 我认为这不是真的。如果仔细观察,OP 问题中的结果矩阵似乎是 2×9,而不是 1×9。第一行是“1, 0.75”(注意“1 .75”中的空格),而不是 1.75。链接的 FileExchange 脚本进一步证实了这一点,他说这完全正确。我同意这令人困惑——我不得不眯着眼睛看看发生了什么!
  • 你完全正确。为了清楚起见,我会更正他的帖子。
【解决方案2】:

@nibot 描述的类似方法可以在matlab central file-exchange 中找到。

它将解决方案推广到任意数量的输入集。这将是代码的简化版本:

function C = cartesian(varargin)
    args = varargin;
    n = nargin;

    [F{1:n}] = ndgrid(args{:});

    for i=n:-1:1
        G(:,i) = F{i}(:);
    end

    C = unique(G , 'rows');
end

例如:

cartesian(['c','d','e'],[1,2],[50,70])

ans =

    99     1    50
    99     1    70
    99     2    50
    99     2    70
   100     1    50
   100     1    70
   100     2    50
   100     2    70
   101     1    50
   101     1    70
   101     2    50
   101     2    70

【讨论】:

    【解决方案3】:

    这是一个函数cartesian_product,它可以处理任何类型的输入,包括字符串数组,并返回一个列名与输入变量名称匹配的表。非变量的输入被命名为var1var2等。

    function tbl = cartesian_product(varargin)
        names = arrayfun(@inputname, 1:nargin, 'UniformOutput', false);
        
        for i = 1:nargin
            if isempty(names{i})
                names{i} = ['var' num2str(i)];
            end
        end
        
        rev_args = flip(varargin);
        
        [A{1:nargin}] = ndgrid(rev_args{:});
    
        B = cellfun(@(x) x(:), A, 'UniformOutput', false);
        C = flip(B);
        
        tbl = table(C{:}, 'VariableNames', names);
    end
    
    >> x = ["a" "b"];
    >> y = 1:3;
    >> z = 4:5;
    >> cartesian_product(x, y, z)
    
    ans =
    
      12×3 table
    
         x     y    z
        ___    _    _
    
        "a"    1    4
        "a"    1    5
        "a"    2    4
        "a"    2    5
        "a"    3    4
        "a"    3    5
        "b"    1    4
        "b"    1    5
        "b"    2    4
        "b"    2    5
        "b"    3    4
        "b"    3    5
    
    >> cartesian_product(1:2, 3:4)
    
    ans =
    
      4×2 table
    
        var1    var2
        ____    ____
    
         1       3  
         1       4  
         2       3  
         2       4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-29
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 2011-01-29
      相关资源
      最近更新 更多