2014-02-16 55 views

回答

4

我想這是你想要什麼:

mat1=randi(10,[4 5]); 
vec1=randi(10,[1 5]); 
result=mat1.*repmat(vec1,[size(mat1,1),1]); 

rempat將複製vec1沿mat1行。然後,我們可以執行元素方式乘法(.*)以「將M × N矩陣的每一列乘以大小爲N的向量的對應元素」。

編輯:只是添加到計算方面。有一個替代repmat,我希望你知道。矩陣索引可以實現與repmat相同的行爲並且速度更快。我從here採用了這種技術。

觀察到

repmat(vec1,[size(mat1,1),1]); 

vec1([1:size(vec1,1)]'*ones(1,size(mat1,1)),:); 

如果你看仔細,表達歸結爲vec1([1]'*[1 1 1 1]),:);,你可以寫下面的語句是再次:

vec1([1 1 1 1]),:); 

從而達到與repmat相同的行爲並且速度更快。我跑三種溶液100000倍,即,

  1. 解決方案使用repmat:0.824518秒
  2. 溶液中使用索引技術上面解釋:0.734435秒使用bsxfun
  3. 解由@LuisMendo提供:0.683331秒

你可以觀察到bsxfun稍快。

+1

+1它可以更好地使用'bsxfun'(見我的回答) –

+0

@LuisMendo是,'bsxfun'是最快的方法。 –

3

儘管您可以使用repmat(如@Parag's answer),但通常使用more efficient來使用bsxfun。它還具有代碼(最後一行)對於行和列向量相同的優點。

%// Example data 
M = 4; 
N = 5; 
matrix = rand(M,N); 
vector = rand(1,N); %// or size M,1 

%// Computation 
result = bsxfun(@times, matrix, vector); %// bsxfun does an "implicit" repmat 
+0

如果bsxfun執行「隱式」repmat,那麼效率是多少? – Mehraban

+0

@SAM見[這裏](http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/)。我的猜測是'bsxfun'「知道」元素是相同的,所以它在內部不會像'repmat'那樣複製它們 –