MATLAB中的笛卡尔积

时间:2012-03-23 04:41:48

标签: 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]。

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

非常感谢

3 个答案:

答案 0 :(得分:43)

这是一种方式:

[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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

这是一个函数 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