スパースなベクトルがN
kx1
あり、それらのそれぞれに転置を掛けて N 平方行列を作成し、それを合計する必要があります。目的の出力はk
byk
行列です。これをループで実行し、arrayfun を使用しようとしましたが、どちらのソリューションも遅すぎます。おそらく、あなたのいずれかがより速いものを思い付くことができます。以下は、私が思いついた最適なソリューションに関する具体的な詳細です。
mdev_big
各ベクトルを含む疎行列k
によるものです。N
N
fun_sigma_i = @(i) mdev_big(:,i)*mdev_big(:,i)';
sigma_i = arrayfun(fun_sigma_i,1:N,'UniformOutput',false);
sigma = sum(reshape(full([sigma_i{:}]),k,k,N),3);
このプロセスの遅い部分はsigma_i
いっぱいになることですが、それ以外の方法で 3D 配列に再形成することはできません。また、reshape の代わりに cat (遅い)、full の代わりに ndSparse (かなり遅い) fun_sigma_i
、スパース行列ではなく完全な行列を返す (遅い) ことも試しました。
助けてくれてありがとう!、