matlab如何生成矢量图,组合-如何使用矢量化代码从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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值