【问题标题】:Matlab - Quickly subtract [1xN] array from [MxN] matrix elements [duplicate]Matlab - 从[MxN]矩阵元素中快速减去[1xN]数组[重复]
【发布时间】:2011-08-23 12:01:42
【问题描述】:

可能的重复:
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

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

【问题讨论】:

标签: matlab memory subtraction


【解决方案1】:

使用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 替换为您的行向量,一切就绪。

【讨论】:

    【解决方案2】:

    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
    

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

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      相关资源
      最近更新 更多