私はMATLABを使用しています。非常に大きな 疎行列があり、この行列の各列に対してlogicalorを実行したいと考えています。疎行列を埋めるための単一の操作で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