首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从另一个矩阵的每个核心响应行中减去矩阵的每一项

如何从另一个矩阵的每个核心响应行中减去矩阵的每一项
EN

Stack Overflow用户
提问于 2012-11-16 01:08:50
回答 3查看 5.8K关注 0票数 1
代码语言:javascript
运行
复制
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]

这就是我想要做的操作。除了迭代解之外,我还能用矩阵函数做什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-16 01:39:30

最方便的方法是使用bsxfun,它会自动扩展数组以匹配大小(这样就不需要使用repmat)。注意,我需要转置B,以便它是一个2乘1的数组。

代码语言:javascript
运行
复制
A = [1 2 3; 7 6 5]
B = [3 7];

result = bsxfun(@minus,A,B')

result =

-2    -1     0
 0    -1    -2
票数 3
EN

Stack Overflow用户

发布于 2012-11-16 05:03:28

我认为Jonas的答案是最好的。但仅供记录,下面是使用显式repmat的解决方案

代码语言:javascript
运行
复制
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将具有以下属性:

代码语言:javascript
运行
复制
C(k,:,...,:) == A(k,:,...,:) - B(k)

事实上,在B是m-d的情况下,只要AB'的初始尺寸相同,Jonas的答案就会运行,并且很可能会做你想要的事情。您可以更改repmat解决方案来模拟这一点...在这一点上,您开始重新实现bsxfun

票数 2
EN

Stack Overflow用户

发布于 2012-11-16 01:27:25

通常你不能。迭代的解决方案将是必要的,因为这个问题定义得很差。仅为相同维度的矩阵定义矩阵加/减。

即:

代码语言:javascript
运行
复制
A =         | 1 2 3 |
            | 7 6 5 |

B =         | 3 7 |

从2x3矩阵中减去1x2矩阵是没有意义的。

但是,如果您将B乘以某个中间矩阵,以使结果成为2x3矩阵,则可以工作,即:

代码语言:javascript
运行
复制
B' * Y =    | 3 3 3 |
            | 7 7 7 |

例如:

代码语言:javascript
运行
复制
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给出了一个有效的、非迭代的解决方案。

代码语言:javascript
运行
复制
A-(B'*Y) =      | 1 2 3 |  -  | 3 3 3 |
                | 7 6 5 |     | 7 7 7 |

         = A - (diag(B) * Y )

这里唯一的“骗局”是使用diag()函数,该函数将向量转换为严格对角矩阵。有一种方法可以手动分解一组矩阵/向量乘法运算,以手动重新创建diag()函数,但这将比我的解决方案本身更多的工作。

祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13402637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档