A = [1 2 3; 7 6 5]
B = [3 7];
A-B = [1-3 2-3 3-3; 7-7 6-7 5-7];
ans =[-2 -1 0; 0 -1 -2]
这就是我想要做的操作。除了迭代解之外,我还能用矩阵函数做什么呢?
发布于 2012-11-16 01:39:30
最方便的方法是使用bsxfun
,它会自动扩展数组以匹配大小(这样就不需要使用repmat
)。注意,我需要转置B
,以便它是一个2乘1的数组。
A = [1 2 3; 7 6 5]
B = [3 7];
result = bsxfun(@minus,A,B')
result =
-2 -1 0
0 -1 -2
发布于 2012-11-16 05:03:28
我认为Jonas的答案是最好的。但仅供记录,下面是使用显式repmat
的解决方案
A = [1 2 3; 7 6 5];
B = [3 7];
sz = size(A);
C = A - repmat(B', [1 sz(2:end)]);
Jonas的答案不仅更简单,而且在我的机器上,对于大型矩阵,它的速度实际上快了2倍。
有趣的是,在A是n-d数组的情况下,这两种解决方案都做了一些非常合理的事情。矩阵C
将具有以下属性:
C(k,:,...,:) == A(k,:,...,:) - B(k)
事实上,在B是m-d的情况下,只要A
和B'
的初始尺寸相同,Jonas的答案就会运行,并且很可能会做你想要的事情。您可以更改repmat解决方案来模拟这一点...在这一点上,您开始重新实现bsxfun
!
发布于 2012-11-16 01:27:25
通常你不能。迭代的解决方案将是必要的,因为这个问题定义得很差。仅为相同维度的矩阵定义矩阵加/减。
即:
A = | 1 2 3 |
| 7 6 5 |
B = | 3 7 |
从2x3矩阵中减去1x2矩阵是没有意义的。
但是,如果您将B乘以某个中间矩阵,以使结果成为2x3矩阵,则可以工作,即:
B' * Y = | 3 3 3 |
| 7 7 7 |
例如:
B' = diag(B)
= | 3 0 |
| 0 7 |
B' * Y = | 3 3 3 |
| 7 7 7 |
Y = | 1 1 1 |
| 1 1 1 |
因此,A-B'*Y
给出了一个有效的、非迭代的解决方案。
A-(B'*Y) = | 1 2 3 | - | 3 3 3 |
| 7 6 5 | | 7 7 7 |
= A - (diag(B) * Y )
这里唯一的“骗局”是使用diag()
函数,该函数将向量转换为严格对角矩阵。有一种方法可以手动分解一组矩阵/向量乘法运算,以手动重新创建diag()
函数,但这将比我的解决方案本身更多的工作。
祝好运!
https://stackoverflow.com/questions/13402637
复制相似问题