2013-05-08 161 views
1

我有兩個for循環嵌入代碼,重複多次。我想加快速度:如何矢量化在MATLAB中指數爲矩陣的矩陣?

for i = 1:10 
for j = 1:10 
    A(i,j) = B(i,j,D(i,j))*C(i,j); 
end 
end 

這裏ð由它們對指數沒有B.在d依賴整數的for循環可以通過按元素矩陣乘法來代替。 問題是如何以優雅的方式評估B.我搜索了SO和mathworks頁面,並嘗試使用線性索引,但是這會產生錯誤:

d = reshape(D, 100, []); 
b = reshape(B, 100, []); 
arrayfun(@(x) b(x,d(x)), 1:100); 

我在做什麼錯?有沒有辦法替換兩個for-loops?

+0

的問題不僅評估'B'在一個優雅的方式,要覆蓋'A'所有這一切意味着,唯一的結果你會時間get是最後一層,即當'i = 10'和'j = '10'時 – Oleg 2013-05-08 17:34:39

+0

@OlegKomarov感謝評論!我的代碼實際上是可以的,並且執行它應該做的事:通過乘以「B」和「C」的元素來創建元素明確的矩陣「A」。棘手的部分是從'D'查找索引。 – 2013-05-08 18:47:21

回答

1

您可以將D成線性指標:

[rows,cols]=ndgrid(1:10,1:10); 
idx = sub2ind(size(B),rows(:),cols(:),D(:)); 

A = zeros(10,10); %# initialize A to the right size 
A(:) = B(idx).*C(:); 
+0

太棒了!你的代碼片段導致我的解決方案比我的for-loops運行速度快得多。由於'B'是一個三維數組,你的第二行代碼必須是'idx = sub2ind(size(B),rows(:),cols(:),D(:));'謝謝! – 2013-05-08 21:36:53

+0

@ BQ92-PwDD3:我解決了這個問題。很高興幫助! – Jonas 2013-05-09 07:19:42

0

您可以使用B的elementwise乘法抵抗指數在D(下令A層注意,沿行,然後列的第一循環,這意味着你一直走到這行的末尾,然後到下一行等...這就是爲什麼我轉置並重塑到列D)。

一個簡單的方法是使用bsxfun()

out = bsxfun(@times, A(:,:,reshape(D',[],1)), B); 

哪裏出的每一層是:

out(:,:,1) = A(:,:,D(1,1)).*B(:,:) 
out(:,:,2) = A(:,:,D(1,2)).*B(:,:) 
... 
out(:,:,ncols*(i-1) + j) = A(:,:,D(i,j)).*B(:,:) 

如果這不是你想要的東西,是我不好。我將刪除答案。

+0

感謝您的建議。變量混亂。除此之外,我無法弄清楚這個建議如何解決問題... – 2013-05-08 18:53:35