私があなたに与えることができる最速は、現時点で(私のマシンで)4秒です。あなたがこれを試したかどうかは 100% わかりませんが、とりあえず行ってみましょう。
randbool.m
テストデータを生成するために、これらのコンテンツを含む m ファイルがあります。
function x = randbool(m,n)
x = logical(rand(m,n) < 0.5);
テスト用のデータを生成します。
>> u = randbool(1,20000);
>> M = randbool(30,20000);
M の行をループする 3 つの方法 ( を使用bsxfun
、repmat
を使用、ループを使用) と、必要な要素を取り出す 2 つの方法 (結合&
、または を使用した点ごとの乗算.*
) を考えることができます。最も速いのは、 と の組み合わせですbsxfun
。
Bsxfun / コンジャンクション
>> tic, for i=1:1000, bsxfun(@and,u,M); end, toc
Elapsed time is 4.068684 seconds.
Bsxfun / 乗算
>> tic, for i=1:1000, bsxfun(@times,u,M); end, toc
Elapsed time is 4.856784 seconds.
レプマット/コンジャンクション
>> tic, for i=1:1000, utmp=repmat(u,30,1); M&utmp; end, toc
Elapsed time is 7.305158 seconds.
レプマット/乗算
>> tic, for i=1:1000, utmp=repmat(u,30,1); M.*utmp; end, toc
Elapsed time is 8.117164 seconds.
ループ/結合
>> tic, for i=1:1000, for j = 1:30, out(j,:)=u&M(j,:); end; end, toc
Elapsed time is 7.110872 seconds.
ループ/乗算
>> tic, for i=1:1000, for j = 1:30, out(j,:)=u.*M(j,:); end; end, toc
Elapsed time is 8.322888 seconds.