8

可能的重复:
如何从矩阵的每一行中减去一个向量?
如何将矩阵的每一行除以固定行?

我有 M 行和 4 列的矩阵 (M1)。我有另一个 1 行 4 列的数组(M2)。我想用 M2 中的相应列元素减去 M1 中的每个元素。换句话说,M1 的每一列都需要被 M2 中相同列位置的标量减去。我可以调用repmat(M2,M,1),这将创建一个大小为 MxN 的新矩阵,其中列中的每个元素都是相同的,然后逐个元素进行减法:

M2new = repmat(M2,M,1)
final = M1 - M2new

但是,这是两行代码,并在内存中创建了一个新元素。执行此操作的最快且内存占用最少的方式是什么?

4

2 回答 2

14

bsxfun像下面的例子一样使用。

x=magic(4);
y=x(1,:);
z=bsxfun(@minus,x,y)

z =

     0     0     0     0
   -11     9     7    -5
    -7     5     3    -1
   -12    12    12   -12

z是通过从每一行中减去第一行而获得的。只需x用您的矩阵和y行向量替换,就可以了。

于 2011-05-11T17:05:33.250 回答
14

bsxfun(.)可能会更有效率,但作为一个老前辈,我建议不要完全忽略基于线性代数的解决方案,比如:

> M1= magic(4)
M1 =
   16    2    3   13
    5   11   10    8
    9    7    6   12
    4   14   15    1
> M2= M1(1, :)
M2 =
   16    2    3   13
> M1- ones(4, 1)* M2
ans =
    0    0    0    0
  -11    9    7   -5
   -7    5    3   -1
  -12   12   12  -12

让实际用例和分析器来决定实际使用的功能。

于 2011-05-11T17:20:42.380 回答