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

かなり遅い場合は最後のループ。ループの代わりに 1 つのステートメントを使用して同じことを行う方法はありますか? ありがとう。

4

1 に答える 1

1

Z が実際に変化することはなく、 cellfun は均一な出力を返すため、以下は ~ 100 倍高速です。

K=repmat(cellfun(@(idx) sum(M(idx)), IND)',1,P);
于 2013-07-15T09:04:47.767 に答える