如何使用向量化代码在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 1
和1 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