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

不止一次,现在我需要在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?

nb nchoosek不做反转对,这是我需要的(即2 11 2 ),我不能扭转和追加nchoosek输出,因为对称对将被包括两次。

尝试

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

请参阅MESHGRID文档 。 虽然这不完全是这个function的意思,但是如果你把它搞笑,你所要求的正是它的function。

你可以使用

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

另一个收集解决scheme:

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

您可以通过使用repmat复制matrix,然后使用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 = [cd] 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 

当然,你可以从上面的例子中去掉所有的中间variables。

这里有一个更加MATLAB的方式来查找组合。 这个也可以很容易地扩展到2个以上的vector(也是非数字组合):

 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)]' 

你可以使用简单的旧matrix操作,例如

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

编辑:这是八度语法,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 

你在找什么是笛卡尔产品

cartprod是实现它的function。 你可以在linear-algebra包中find它,所以你需要做:

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