いくつかの行列演算を実行する必要がある 0 ~ 1 の値のベクトルがあります。それらはあまりスパースではありません (値の半分だけが 0 です) が、double ではなく論理変数としてそれらを保存すると、メモリが 8 倍節約されます。論理変数の場合は 1 バイト、倍精度浮動小数点の場合は 8 バイトです。
両方を double として使用するよりも、logical ベクトルと double 行列の行列乗算を行う方が遅くなりますか? 以下の予備結果を参照してください。
>> x = [0 1 0 1 0 1 0 1]; A = rand(numel(x)); xl = logical(x);
>> tic; for k = 1:10000; x * A * x'; end; toc %'
Elapsed time is 0.017682 seconds.
>> tic; for k = 1:10000; xl * A * xl'; end; toc %'
Elapsed time is 0.026810 seconds.
>> xs = sparse(x);
>> tic; for k = 1:10000; xs * A * xs'; end; toc %'
Elapsed time is 0.039566 seconds.
論理表現を使用すると、はるかに遅くなるようです (スパースはさらに遅くなります)。誰かが理由を説明できますか?タイプキャスティングの時間ですか?CPU/FPU命令セットの制限ですか?
編集:私のシステムは、Mac OS X 10.8.3、Intel Core i7 3.4 GHz の MATLAB R2012b です。
EDIT2: いくつかのコメントは、これは Mac OS X のみの問題であることを示しています。可能であれば、さまざまなアーキテクチャと OS からの結果をコンパイルしたいと思います。
EDIT3: 私の実際の問題では、可能なすべての可能なバイナリ ベクトルの長さの大部分を計算する必要がありますm
。ここでm
は、大きすぎ8 * m * 2^m
てメモリに収まらない場合があります。