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]
这是我想做的操作。除了迭代解决方案之外,我怎么能通过矩阵函数来做到这一点?
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]
这是我想做的操作。除了迭代解决方案之外,我怎么能通过矩阵函数来做到这一点?
使用 最方便地执行此操作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
我认为乔纳斯的回答是最好的。但只是为了记录,这里是使用显式的解决方案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 是一个 nd 数组的情况下,这两种解决方案都做了一些非常合理的事情。该矩阵C
将具有以下属性:
C(k,:,...,:) == A(k,:,...,:) - B(k)
事实上,在 B 是 md 的情况下,Jonas 的答案会运行,并且很可能会做你想做的事,只要 和 的初始尺寸A
具有B'
相同的大小。您可以更改 repmat 解决方案以模仿这一点......此时您开始重新实现bsxfun
!
通常你不能。迭代解决方案将是必要的,因为问题定义不明确。矩阵加法/减法仅针对相同维度的矩阵定义。
IE:
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()
函数,但这比我上面的解决方案本身更有效。
祝你好运!