私はMATLABを使用しています。非常に大きな 疎行列があり、この行列の各列に対してlogical
orを実行したいと考えています。疎行列を埋めるための単一の操作でbsxfun
ある単一のfor
ループがあります。logical
ここでは、何をしようとしているのかを確認するために、いくつかの偽の小さなデータを含むサンプル関数を含めます。
関数 maskMat() graph_temp = round(rand(10,10)); チック; com_mat = round(rand(10,10)); com = ラウンド (ランド (10,1)); ii=1 の場合: 長さ (graph_temp) com_mat(:,ii) = 論理(com ~= com(ii)); %bsxfun も動作しますが、少し遅いです %com_mat(:,ii) = bsxfun(@ne,com,com(ii)); 終わり 目次; com_mat = graph_temp .* com_mat;
graph_temp
約1Mの行と列com_mat
ではるかに大きく、コードはループに対して非常に遅くなります。SOには別の関連する質問がありますが、その背後にある理論を理解していないため、これらのソリューションをこの問題にも適用できるかどうかを確認できません。for
for ループのボトルネックを回避するために、C++ 関数を作成するか、mex
何らかのネストを作成arrayfun
して、各logical
/操作がより大きな関数のサブルーチンとして呼び出されるようにすることを考えていました。bsxfun