2012-04-26 32 views
3

我是Octave/Matlab的新手,所以到目前爲止我知道,您可以應用矩陣運算(如*)或單元格運算(如.*)。Matlab/Octave支持對矩陣切片進行操作嗎?

現在我有這兩種模式之間存在的問題。

例如(這只是示例)我有一個矩陣(10,10)和一個向量(10,1)。我想在切片中使用這個矩陣(在這種情況下是列切片)並向它們添加矢量。因此,將矢量添加到第一列,將矢量添加到第二列,....,將矢量添加到最後一列。當然在結果獲取矩陣(10,10)。

到目前爲止,我想出了兩種方法:

  1. 手動遍歷列,並添加矢量

  2. 重複的載體,然後加入全部重複矢量(所以現在矩陣真的)到矩陣

第二個使用矢量化方法,但是消耗很多內存,在第一種情況下,沒有矢量化方法(手動循環),但內存不會被過度使用。

問題 - 有沒有一些不錯的第三種方式,切片模式?我可以說,將矩陣視爲切片,向切片添加矢量,並放棄這些視圖,並像往常一樣對待矩陣?

回答

5

您可以使用Matlab的bult進行二進制單例擴展(bsxfun)以高效的內存方式實現您期望的結果。

x = ones(10); %// 10x10 matrix 
y = 1:10; %// 10x1 matrix 
z = bsxfun(@plus, x, y) 

這將給以下輸出中

z = 

2  3  4  5  6  7  8  9 10 11 
2  3  4  5  6  7  8  9 10 11 
2  3  4  5  6  7  8  9 10 11 
2  3  4  5  6  7  8  9 10 11 
2  3  4  5  6  7  8  9 10 11 
2  3  4  5  6  7  8  9 10 11 
2  3  4  5  6  7  8  9 10 11 
2  3  4  5  6  7  8  9 10 11 
2  3  4  5  6  7  8  9 10 11 
2  3  4  5  6  7  8  9 10 11 

使用repmat命令的一般是浪費(如你在你的問題中指出),並通常是可以避免的。請參閱本文bsxfun的詳細說明與repmat

http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/

對於乘法至少,可以實現使用涉及對角矩陣一招的結果。您可以使用關鍵字稀疏,減少內存使用量爲對角矩陣的臨時存儲

x = ones(10); %// 10x10 matrix 
y = 1:10; %// 10x1 matrix 
yd = sparse(diag(y)); %// 10x10 matrix, but memory is only used to store data and its indicies 

z = yd * x %// 10x10 matrix 

然而,bsxfun解決方案通常優於。

+1

sparse(diag(y))仍然構建完整的矩陣diag(y)。如果你真的想減少內存使用量,請使用:sparse(1:10,1:10,y) – 2012-04-26 11:12:49

+0

很好的答案,非常感謝! – greenoldman 2012-04-26 11:50:21

+0

我的榮幸。 :) – learnvst 2012-04-26 13:01:27