MATLAB中如何将一个矩阵加上另一个矩阵

3
我将尝试在MATLAB中将一个矩阵与另一个矩阵相加。
第一个矩阵如下所示:
0.0963928845397177  1.30250820960714
-0.830468497619261  1.40991150001902
-0.352252185662263  -1.66254297035808
-0.174775039544099  1.94368447839214
-0.480653419481013  -1.08469845223762
0.836836711417678   0.226818975021420
2.53834934138902    1.09892920248474
-1.32333425148040   0.147188752472257
0.128340263343307   2.29566581301284
-1.44237915336114   2.75255787759549

第二个矩阵长这样:
[1 2]

我希望将第二个矩阵与第一个矩阵相加 => 意思是0.0963928845397177+1和1.30250820960714+2。我想在第一列加1,在第二列加2。

我尝试过:

secondmatrix .+ firstmatrix

但是它没有起作用...

需要一些指导...

6个回答

3

如果您要将此方法用于大型矩阵,请为了效率而尽量避免使用repmat。同样的,对于[A(:,1)+b(1) A(:,2)+b(2)]方式也是如此。我推荐使用bsxfun

bsxfun(@plus, A, b)

1
Second matrix中只有两个元素可能有点过头了。不过还是很高兴看到你是一个bsxfun的粉丝! :) - Divakar
是的,没错。不过我的本能反应是在适用的地方随处使用bsxfun和类似的方法 :). 快速测试显示,对于小的Absxfun的表现与repmat差不多;当size(A,1) > 1000左右时,bsxfun会稍微领先一些。 - Sean
当然,对于相当大的输入,bsxfun肯定会胜过repmat,但我的意思是它可能仍然比C = [A(:,1)+B(1,1) A(:,2)+B(1,2)]解决方案慢。 - Divakar
1
+1 对我也是。我自己也是 bsxfun 的粉丝。 - rayryeng
1
谁能不是bsxfun的粉丝呢? :-) - Luis Mendo

2
要么按照Jommy所建议的做法,要么可以复制较小的矩阵使其与大矩阵大小相同,然后进行如下操作:
C = A + repmat(B,[size(A,1),1]);

2

试试这个

 sum_ = first_matrix + repmat(second_matrix,size(first_matrix,1),1);

3
在MATLAB中,将变量命名为 sum 是一种不良的做法,因为这是一个函数名。请更换其他变量名。 - Dev-iL
感谢指出。 - Nishant

2
您可以选择以下任一方式:
A = ones(5,2)
B=[1,2]
C = A+repmat(B,size(A,1),1)

或者

C = [A(:,1)+B(1,1) A(:,2)+B(1,2)]

2

Matlab提供了一个函数,可以实现你想要做的操作,bsxfun,它可以“对启用单例扩展的两个数组应用逐元素二进制运算”。

示例代码:

result_matrix = bsxfun(@plus, firstmatrix, secondmatrix);

Second matrix中只有两个元素可能有些过度设计。 - Divakar
2
对于小矩阵,它所需的时间与repmat或类似函数相同。在我看来,无论矩阵大小如何,这都是更清晰的代码。 - Juanjo Martin
同意更清晰的代码理念! - Divakar
1
+1 对我也适用。我同意这是更干净的代码,而且我自己也是 bsxfun 的粉丝。我要感谢 @Divakar! - rayryeng

1
如果A是大矩阵,B是小矩阵,您可以这样写:
C = [A(:,1)+B(1) A(:,2)+B(2)];

另一种可能性是:
C = A + repmat(B, [length(A) 1]);

2
使用 length() 时要小心,因为在 A 中列数多于行数的类似情况下它将无法工作。 - Dev-iL
我以前从未注意到这种行为。谢谢! - Jommy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接