组合"/>
matlab如何生成矢量图,组合
组合-如何使用矢量化代码从MATLAB中的两个矢量生成所有对?
现在我不止一次需要在MATLAB中生成两个向量的所有可能的对,这是我用for循环完成的,它占用了几行代码,即
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?
n.b. nchoosek不执行我需要的反向对(即2 1和1 2),我不能仅反向并附加nchoosek输出,因为对称对将被包含两次。
Brendan asked 2020-06-21T08:34:40Z
8个解决方案
92 votes
尝试
[p,q] = meshgrid(vec1, vec2);
pairs = [p(:) q(:)];
请参阅MESHGRID文档。 尽管这并不是该功能的确切用途,但是如果您斜视它很有趣,那么您所要求的正是该功能。
Lambdageek answered 2020-06-21T08:35:07Z
12 votes
您可以使用
a = 1:4;
b = 1:3;
result = combvec(a,b);
result = result'
efirvida answered 2020-06-21T08:35:27Z
3 votes
另一个收集解决方案:
[idx2, idx1] = find(true(numel(vec2),numel(vec1)));
pairs = [reshape(vec1(idx1), [], 1), reshape(vec2(idx2), [], 1)];
yuk answered 2020-06-21T08:35:48Z
3 votes
您可以通过使用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
当然,您可以摆脱上面示例中的所有中间变量。
Praetorian answered 2020-06-21T08:36:13Z
2 votes
您可以使用普通的旧矩阵运算,例如 在
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
jihor answered 2020-06-21T08:36:41Z
1 votes
您正在寻找的是笛卡尔积
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
elviejo79 answered 2020-06-21T08:37:06Z
1 votes
这是一种更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)]'
pAtrick answered 2020-06-21T08:37:26Z
1 votes
从版本R2015a开始,您可以使用meshgrid和meshgrid进行此操作:
>> 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的解决方案)所需的其他中间变量,这些变量可能导致较大向量的内存问题。
gnovice answered 2020-06-21T08:37:51Z
更多推荐
matlab如何生成矢量图,组合
发布评论