MATLAB中的笛卡尔积

emp*_*per 16 matlab matrix cartesian-product

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

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].

这也称为笛卡尔积.我怎样才能做到这一点?

非常感谢

nib*_*bot 43

这是一种方式:

[X,Y] = meshgrid(p,q);
result = [X(:) Y(:)];
Run Code Online (Sandbox Code Playgroud)

输出是:

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
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不是真的.如果仔细观察,OP问题中的结果矩阵似乎是2×9,而不是1×9.第一行是"1,0.75"(注意"1.75"中的空格),而不是1.75.链接的FileExchange脚本进一步证实了这一点,他说这样做是完全正确的.我同意这令人困惑 - 我不得不眯着眼睛看看发生了什么! (3认同)

jru*_*ren 5

与 @nibot 描述的方法类似的方法可以在matlabcentral 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
Run Code Online (Sandbox Code Playgroud)

例如:

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
Run Code Online (Sandbox Code Playgroud)