2013-07-15 59 views
0

我有一個大單元格,每個元素都攜帶一個大矩陣(M)的索引集合。我有這些索引指定的M的元素的一些操作,例如尋找快速處理細胞矩陣的方法

N=1000; 
P=100; 
M=rand(N, N); 
K=zeros(N, P); 
for n=1:N 
    IND{n} = [randi(N, 1, randi(200))]; 
end 

tic 
for m=1:P 
    for n=1:N 
    K(n, m) = sum(sum(M(IND{n}))); 
    end 
end 
toc 

tic 
for m=1:P 
    Z = cellfun(@(idx) sum(M(idx)), IND, 'UniformOutput', false); 
    K(:, m) = [Z{:}]; 
end 
toc 

最後一個循環,如果相當緩慢。有沒有辦法使用一個語句而不是循環來做同樣的事情?謝謝。

+0

檢查[cellfun](http://goo.gl/0jj3z)。 – Marcin

+0

謝謝。我遵循幫助,並得到以下代碼Z = cellfun(@(x)sum(sum(M(x))),IND,'UniformOutput',false); K = [Z {:}];但它比循環代碼更慢:( – user1285419

+0

你的最小代碼不起作用......「函數'subsindex'沒有爲類'cell'的值定義。」你能告訴我們你真的做了什麼嗎? – bla

回答

1

因爲Z從來沒有真正改變,cellfun確實會返回一個統一的輸出,所以下面的速度要快100倍。

K=repmat(cellfun(@(idx) sum(M(idx)), IND)',1,P); 
+0

哇,太棒了,它真的很快。我已將我的代碼修改爲使用您的案例,它解決了問題。 – user1285419

+0

但我只是想到另一個問題可能會導致上述陳述失敗(對不起,但實際上我有兩個問題,但我沒有意識到這是一個問題在開始時)。如果M必須在循環中更改(對於m = 1:P ...結束),則上面的語句不再有效,對嗎? – user1285419

+0

%repmat現在只是進入cellfun,例如。 M = arrayfun(@ rand,N * ones(P,1),'UniformOutput',false); (M(idx,M)sum(M(idx)),repmat(IND',1,P),repmat(M',N,1)); – Philliproso