ベクトル化に取り組んでいるforループが1つあります。問題は、ベクトル化されると、コードが3倍遅くなることです。熱力学的アルゴリズムの一部である元のコードは次のとおりです。
Matrix=rand(10,10,20);
someMatrix=rand(50);
m=5; n=6; CONSTj=9; CONSTk=10; maxGrid=5;
Total=0;
for var=0:maxGrid
Factor=1;
p=CONSTj-var;
q=CONSTk-var;
if p>=1 && q>=1
Factor=Matrix(n,m,p)*Matrix(m,n,q);
elseif p>=1 && q<1
Factor=Matrix(n,m,p);
elseif p<1 && q>=1
Factor=Matrix(m,n,q);
end
Total=Total+Factor*(someMatrix(m)^var);
end
私はそれを次のようにベクトル化しました:
Matrix=rand(10,10,20);
someMatrix=rand(50);
m=5; n=6; CONSTj=9; CONSTk=10; maxGrid=5;
var=(0:maxGrid)';
Factor=ones(maxGrid+1,1);
tempoJ=zeros(maxGrid+1,1);
tempoK=zeros(maxGrid+1,1);
p=CONSTj-var;
q=CONSTk-var;
index1 = find(p>=1 & q>=1);
index2 = find(p>=1 & q<1 );
index3 = find(p<1 & q>=1);
tempoJ(index1)=squeeze(Matrix(n,m,p(index1)));
tempoJ(index2)=squeeze(Matrix(n,m,p(index2)));
tempoK(index1)=squeeze(Matrix(m,n,q(index1)));
tempoK(index3)=squeeze(Matrix(m,n,q(index3)));
Factor(index1)=tempoJ(index1).*tempoK(index1);
Factor(index2)=tempoJ(index2);
Factor(index3)=tempoK(index3);
Total=Factor.*(someMatrix(m).^var);
Total=sum(Total);
プロファイラーによると、find、squeeze、sumは最も時間を消費する関数です。ifステートメントから情報を取得するために何かできると思いますが、インデックスを変更せずに簡単な方法を見つけることはできません。