この例ではどうなっていますか?(非)対角行列で非ゼロ要素を見つけるスピード
完全行列を見ると、非対角行列上での検索操作が高速になります。 逆に、疎な表現を得るのが対角行列上で高速です(これは妥当と思われます)。 スパース行列の検索操作はほぼ同じです。
ここでは何が起こっているのか誰かに教えてもらえますか?対角行列でそれらを見つけるよりも、完全な行列上の非ゼロ要素を見つける方が早いのはなぜですか?
printf("Diagonal Mat:\n\n")
A = eye(10000);
printf("Full mat: ")
tic
find(A);
toc
printf("Building sparse representation: ")
tic
As = sparse(A);
toc
printf("Sparse mat: ")
tic
find(As);
toc
printf("\n\nNon-Diagonally flagged Mat:\n\n")
A = A | A; # This removes the "Diagonal Matrix" flag from A
printf("Full mat: ")
tic
find(A);
toc
printf("Building sparse representation: ")
tic
As = sparse(A);
toc
printf("Sparse mat: ")
tic
find(As);
toc
printf("\n\nActually Non-Diagonal Mat:\n\n")
A(:,:) = 0;
A(:,1) = 1;
printf("Full mat: ")
tic
find(A);
toc
printf("Building sparse representation: ")
tic
As = sparse(A);
toc
printf("Sparse mat: ")
tic
find(As);
toc
出力:
Diagonal Mat:
Full mat: Elapsed time is 0.204636 seconds.
Building sparse representation: Elapsed time is 5.19753e-05 seconds.
Sparse mat: Elapsed time is 7.60555e-05 seconds.
Non-Diagonally flagged Mat:
Full mat: Elapsed time is 0.0800331 seconds.
Building sparse representation: Elapsed time is 0.0924602 seconds.
Sparse mat: Elapsed time is 7.48634e-05 seconds.
Actually Non-Diagonal Mat:
Full mat: Elapsed time is 0.0799708 seconds.
Building sparse representation: Elapsed time is 0.092248 seconds.
Sparse mat: Elapsed time is 7.70092e-05 seconds.
これはバグレポートで再現されていますので、これを正しい回答として設定します。 – nils