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

gal*_*ine 8 memory matlab subtraction

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

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

M2new = repmat(M2,M,1)
final = M1 - M2new
Run Code Online (Sandbox Code Playgroud)

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

abc*_*bcd 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
Run Code Online (Sandbox Code Playgroud)

z是通过从每行减去第一行得到的.只需x用你的矩阵替换y你的行向量,你就可以了.


eat*_*eat 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
Run Code Online (Sandbox Code Playgroud)

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