2011-05-11 244 views
8

可能顯示的文件:
How to subtract a vector from each row of a matrix?
How can I divide each row of a matrix by a fixed row?Matlab的 - 快速減去[1×N個]從[M×N個]矩陣元素陣列

我有M行和4列的矩陣(M1) 。我有另一個陣列(M2)1行4列。我想用M2中的各列元素減去M1中的每個元素。換言之,需要M1的每列通過在M2相同的列位置的標量被subtraced。我可以打電話repmat(M2,M,1),這會造成尺寸爲M×N,一個新的矩陣,其中在一列中的每個元件是一樣的,並然後由元件減法做一個元件:

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

,然而,這是兩行代碼並在內存中創建一個新元素。什麼是執行此操作的最快和最少的內存密集型方法?

+1

重複:[?如何減去從矩陣的每一行向量(http://stackoverflow.com/questions/5342857/how-to-subtract-a-vector-from-each-row-of-一個矩陣)......這是在把這些重複(用不同的算術運算):我如何除以在MATLAB列和矩陣元素(http://stackoverflow.com/questions/1773099/如何-DO-I-除以矩陣元素逐列總和合MATLAB),[I如何通過一個固定的行劃分的矩陣的每一行?](http://stackoverflow.com/questions/ 4723824 /如何-可以-I-除以每行對的一矩陣由-A-固定行)...似乎是一個非常普遍的問題。 ;) – gnovice 2011-05-11 17:08:02

回答

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,你就全部設置好了。

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 

讓實際的使用情況,並探查決定實際使用的功能。