首页 文章

如何使用矢量化代码在MATLAB中从两个向量生成所有对?

提问于
浏览
44

不止一次,我需要在MATLAB中生成所有可能的两个向量对,我用它来做几个代码行的循环,即

vec1 = 1:4;
vec2 = 1:3;
i = 0;
pairs = zeros([4*3 2]);
for val1 = vec1
    for val2 = vec2
         i = i + 1;
         pairs(i,1) = val1;
         pairs(i,2) = val2;
    end
end

生成......

1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
4 1 
4 2
4 3

必须有一个更好的方法来做这个更多的MATLAB'esque?

注: nchoosek 不执行我需要的反转对(即 2 1 以及 1 2 ),我不能反转并附加 nchoosek 输出,因为对称对将包含两次 .

7 回答

  • 87

    您可以使用普通的旧矩阵运算,例如在

    x = [3,2,1];
    y = [11,22,33,44,55];
    v = [(ones(length(y),1) * x)(:), (ones(length(x), 1) * y)'(:)]
    

    Edit: 这是Octave语法,MATLAB将如下所示:

    x = [3,2,1];
    y = [11,22,33,44,55];
    A = ones(length(y),1) * x;
    B = (ones(length(x), 1) * y)';
    v = [A(:) B(:)]
    

    在这两种情况下,结果都是

    v =
     3    11
     3    22
     3    33
     3    44
     3    55
     2    11
     2    22
     2    33
     2    44
     2    55
     1    11
     1    22
     1    33
     1    44
     1    55
    
  • 3

    尝试

    [p,q] = meshgrid(vec1, vec2);
    pairs = [p(:) q(:)];
    

    MESHGRID documentation . 虽然这不完全是那个功能的用途,但是如果你眯着眼睛看它很有趣,你所要求的就是它的功能 .

  • 1

    你可以用

    a = 1:4;
    b = 1:3;
    result = combvec(a,b);
    result = result'
    
  • 3

    另一个收集解决方案:

    [idx2, idx1] = find(true(numel(vec2),numel(vec1)));
    pairs = [reshape(vec1(idx1), [], 1), reshape(vec2(idx2), [], 1)];
    
  • 11

    您可以通过使用 repmat 复制矩阵然后使用 reshape 将结果转换为列向量来完成此操作 .

    a = 1:4;
    b = 1:3;
    c = reshape( repmat(a, numel(b), 1), numel(a) * numel(b), 1 );
    d = repmat(b(:), length(a), 1);
    e = [c d]
    
    e =
    
         1     1
         1     2
         1     3
         2     1
         2     2
         2     3
         3     1
         3     2
         3     3
         4     1
         4     2
         4     3
    

    当然,您可以从上面的示例中删除所有中间变量 .

  • 0

    这里有一个更MATLAB'的方式来找到组合 . 这个也可以很容易地扩展到2个以上的向量(以及非数字组合):

    v1 =   1:  1:  3;
    v2 =  11: 11: 44;
    v3 = 111:111:555;
    
    dimensions = cellfun(@numel, {v1,v2,v3});
    
    [i1,i2,i3] = ind2sub(dimensions, 1:prod(dimensions));
    
    combinations = [v1(i1); v2(i2); v3(i3)]'
    
  • 1

    您要找的是cartesian product

    cartprod是实现它的函数 . 你可以在线性代数包中找到它,所以你需要这样做:

    >> pkg install -forge linear-algebra
       >> pkg load linear-algebra 
       >> sortrows(cartprod(1:4,1:3))                                            
        ans =                                                                                           
           1   1                                                                  
           1   2                                                                  
           1   3                                                                  
           2   1                                                                  
           2   2                                                                  
           2   3                                                                  
           3   1                                                                  
           3   2                                                                  
           3   3                                                                  
           4   1                                                                  
           4   2                                                                  
           4   3
    

相关问题