2014-10-28 130 views
0

爲了減少Matlab代碼中循環的使用,我嘗試使用元素乘法來計算矩陣值。以下是我最初的代碼Matlab基於元素的矩陣乘法

for doc = 1:docs 
    for word = 1:words 
     den =0; 
     for topic = 1:topics 
      posterior(topic,doc,word) =prior(1,topic)*expDoc(doc,topic)*expWord(word,topic); 
      den = den + posterior(topic,doc,word) ; 
     end  
    end 
end 

參照similar問題。以下是我的嘗試

posterior(1:topics,1:docs,1:words) = prior(1,1:topics).*expDoc(1:docs,1:topics).*expWord(1:words,1:topics); 
den = sum(posterior(:,:,:)); 
posterior(:,:,:) = posterior(:,:,:)/(den); 

但是,按照元素操作的要求,如何確保乘法使用相同維數的矩陣完成?

+0

你的嘗試不會工作,因爲'prior','expDoc'和'expWord'都是二維數組,所以你不能使用元素乘法來獲得一個3D數組。仔細想想什麼是在一起倍增。 – David 2014-10-28 03:33:07

+0

好吧,那麼如何優化for循環呢? – 2014-10-28 03:50:18

回答

1

您可以通過仔細使用bsxfunpermute來獲得此功能。 permute用於重新排列矩陣的維數的順序 - 我們將使用這個來重新排列變量,使它們按照正確的順序使用bsxfun來乘以它們。

從我可以告訴,你有三個變量:

prior, size == [1,topics]; 
expDoc, size == [docs,topics]; 
expWord, size == [words,topics]; 

和你想獲得最終的變數:

posterior, size == [topics,docs,words] 

認爲你應該能夠得到矩陣posterior通過使用以下方法:

prior_perm = prior.'; 
expDoc_perm = expDoc.'; 
expWord_perm = permute(expWord,[2,3,1]); 

posterior = bsxfun(@times,prior_perm,bsxfun(@times,expDoc_perm,expWord_perm)); 

den = sum(posterior(:)); 

你會想確保測試這個產生正確的輸出,但我沒有。

+1

那些'permute(.. [2 1])'可以被'transposes'替代,而且那些必須更便宜。否則好解決方案! +1 – Divakar 2014-10-28 05:04:10

+0

@Divakar啊是的,真的。我非常喜歡整體解決方案,我錯過了這一點。乾杯! – MrAzzaman 2014-10-28 05:08:13

+0

順便通過測試,它的工作原理! – Divakar 2014-10-28 05:09:43