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
通常你不能。迭代解决方案将是必要的,因为问题定义不明确。矩阵加法/减法仅为相同维度的矩阵定义。
即:
A = | 1 2 3 |
| 7 6 5 |
B = | 3 7 |
这是没有意义的减去2×3矩阵的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()
函数,该函数的矢量转换为一个严格的对角矩阵的。有一种方法可以手动分解一组矩阵/向量乘法操作来手动重新创建函数,但这比我的解决方案更有效。
祝你好运!
Dogbert,他明确表示他想“从另一个矩阵的对应行中减去矩阵的每个项目”。如果您正在讨论从二维矩阵中“减去”一维矩阵(这似乎是他想到的情况),那么对我而言,这似乎很好定义。 –
在我看来,我所选择的解决方案是本质上最“数学”的,而不是“程序化的”(即:可以更简单地表达为一组公式,而不是一套程序和if/else语句)。我认为这是一个合理的近似值,因为这个问题的父母并没有具体说明如果B是2×2矩阵而不是1×2,情况会是怎样。另外,由于他/她提到了矩阵函数的使用,我假设其意图是使用矩阵代数,而不是算法:) – DevNull
我认为乔纳斯的答案是最好的。但只是为了记录在案,这里是使用显式repmat
解决方案:
A = [1 2 3; 7 6 5];
B = [3 7];
sz = size(A);
C = A - repmat(B', [1 sz(2:end)]);
不仅是乔纳斯的回答简单,它实际上是更快通过2我的机器上大型矩阵的一个因素。
值得注意的是,在A是一个n-d数组的情况下,这两个解决方案都会做一些非常合理的事情。矩阵C
将具有以下属性:
C(k,:,...,:) == A(k,:,...,:) - B(k)
事实上,乔纳斯的回答将运行,而且很有可能你想要做什么,在B的MD中的情况下,只要A
初始尺寸和B'
具有相同的尺寸。你可以改变repmat解决方案来模仿这个......在这一点上你开始重新实现bsxfun
!
也许你已经看到了它,但@Jonas给出了一个很好的答案[我的问题](http://stackoverflow.com/questions/12951453/in-matlab-when-is-it-optimal-to-use-bsxfun)正是关于'bsxfun'与'repmat'类型解决方案的主题。 –
没有看到,感谢指针! –
有人会很快发布解决方案,但同时查看'repmat'(http://www.mathworks.com/help/matlab/ref/repmat.html)。一个非常有用的功能。 –