2015-01-09 120 views
1

我很想知道是否有一種更有效的方法來乘以多維矩陣的特定元素,而不需要'for'循環。有效乘以多維矩陣

我有一個區域*時間矩陣爲個人(比如50個區域和1000個時間點),我想在每個時間點乘以每對區域創建每個區域對的產品在每個時間的新矩陣點(50 x 50 x 1000)。我目前正在運行它的方式是:

for t = 1:1000 
    for i = 1:50 
     for j = 1:50 
      new(i,j,t) = old(i,t) .* old(j,t) 

正如我確信你可以想象,這是超級慢。任何想法,我如何修復它,使其運行速度更快?

+0

好像你正在做的元素方式乘法。舊的(i,t)和舊的(j,t)都是二維矩陣還是隻有一個元素(即單個數字)? – ha9u63ar 2015-01-09 21:50:59

+0

他們都是二維矩陣。事實上,它們都是相同的矩陣,但是將它們標記爲(i,t)和(j,t)並且迭代t,i和j是我可以想出創建我想要的輸出的唯一方式(在二維矩陣(i * j)的每個單元中成對乘法的三維矩陣沿着第三維延伸,t。 – 2015-01-09 22:02:37

回答

3
%some example data easy to trace 
old=[1:5]' 
old(:,2)=old*i 
%multiplicatiion 
a=permute(old,[1,3,2]) 
b=permute(old,[3,1,2]) 
bsxfun(@times,a,b) 

permute用於使三維矩陣,其尺寸和n*1*m1*n*mn*m輸入矩陣的。以這種方式更改尺寸,new(i,j,k)可以使用new(i,j,k)=a(i,1,k)*b(1,j,k)來計算。逐個元素地應用這種操作是bsxfun的設計目的。

關於bsxfun,試着去理解簡單的2D-例子一樣bsxfun(@times,[1:7],[1,10,100]')第一

+0

太棒了!快得多,我不確定排列函數是如何工作的。 [1,3,2]和[3,1,2]部分的意義? – 2015-01-09 22:26:07

+0

另外,如果我需要將相反元素相乘,我將如何運行bsxfun版本?例如(t,i)*(t ,j)? – 2015-01-09 22:36:35

+0

我更新了我的答案,以解釋它是如何工作的。關於swaped索引:您必須以不同的順序排列尺寸 – Daniel 2015-01-10 01:41:26