如何从另一个矩阵的每个对应行中减去矩阵的每个项目

时间:2012-11-15 17:08:50

标签: matlab matrix subtraction

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]

这是我想要完成的操作。除了迭代解决方案之外,我怎么能用矩阵函数来做呢?

3 个答案:

答案 0 :(得分:3)

您可以使用bsxfun最方便地执行此操作,它会自动扩展数组以匹配大小(这样您就不需要使用repmat)。请注意,我需要转置B,以便它是一个2 x 1阵列。

A = [1 2 3; 7 6 5]
B = [3 7];

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

result =

-2    -1     0
 0    -1    -2

答案 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是n-d数组的情况下,这两种解决方案都做了一些非常合理的事情。矩阵C将具有以下属性:

C(k,:,...,:) == A(k,:,...,:) - B(k)

事实上,只要AB'的初始尺寸具有相同的尺寸,Jonas的答案就会运行,很可能会做出你想要的,在B是md的情况下。您可以更改repmat解决方案以模仿此...此时您将开始重新实现bsxfun

答案 2 :(得分:1)

通常你不能。迭代解决方案将是必要的,因为问题定义不明确。矩阵加法/减法仅针对相同维度的矩阵定义。

即:

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()函数,但这比我自己的解决方案更有效。

祝你好运!