Matlab - 从[MxN]矩阵元素中快速减去[1xN]数组

时间:2011-05-11 17:01:55

标签: matlab memory subtraction

  

可能重复:
  How to subtract a vector from each row of a matrix?
  How can I divide each row of a matrix by a fixed row?

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

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

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

2 个答案:

答案 0 :(得分: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替换为行向量,然后全部设置。

答案 1 :(得分: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

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