1

私は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

4

2 に答える 2

6

私はあなたのコードにずっと従ったかどうかわかりません。だから、確かに、にcom_mat(ii,jj)等しいcom(ii) ~= com(jj)ですか?

その場合は、次のオプションを試してください

com_mat = bsxfun( @ne, com, com' ); %' creates entire matrix at once
com_mat = graph_temp .* com_mat;  % do the masking

スパース行列を扱っているので、それを利用してみませんか

[ii jj] = find( graph_temp );
[m n] = size( graph_temp );
com_mat = sparse( ii, jj, com(ii) ~= com(jj), m, n );
于 2013-04-25T13:01:56.700 に答える
1

この方法を試してみますが、現時点では Matlab にアクセスできません。

arrayfun(@(i) ~isequal(A(:,i),B),1:10,'UniformOutput',false)

于 2013-04-25T12:51:48.977 に答える