现在不止一次,我需要在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?
n.b。 nchoosek
不执行我需要的反转对(即2 1
以及1 2
),我不能反转并附加nchoosek
输出,因为对称对将包括两次。
答案 0 :(得分:89)
尝试
[p,q] = meshgrid(vec1, vec2);
pairs = [p(:) q(:)];
请参阅MESHGRID documentation。虽然这不完全是那个功能的用途,但是如果你眯着眼睛看它很有趣,你所要求的就是它的功能。
答案 1 :(得分:12)
您可以使用
a = 1:4;
b = 1:3;
result = combvec(a,b);
result = result'
答案 2 :(得分:3)
您可以使用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
当然,你可以摆脱上面例子中的所有中间变量。
答案 3 :(得分:3)
收集的另一个解决方案:
[idx2, idx1] = find(true(numel(vec2),numel(vec1)));
pairs = [reshape(vec1(idx1), [], 1), reshape(vec2(idx2), [], 1)];
答案 4 :(得分:2)
您可以使用普通的旧矩阵运算,例如在
x = [3,2,1];
y = [11,22,33,44,55];
v = [(ones(length(y),1) * x)(:), (ones(length(x), 1) * y)'(:)]
编辑:这是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
答案 5 :(得分:1)
这里有一个更加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)]'
答案 6 :(得分:1)
从版本R2015a开始,您可以使用repelem
和repmat
:
>> vec1 = 1:4;
>> vec2 = 1:3;
>> pairs = [repelem(vec1(:), numel(vec2)) ...
repmat(vec2(:), numel(vec1), 1)]
pairs =
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
3 3
4 1
4 2
4 3
这种类型的解决方案避免了某些其他解决方案(例如基于meshgrid
的解决方案)所需要的其他中间变量,这些变量可能导致较大向量的内存问题。
答案 7 :(得分:0)
您要找的是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