我有一个 for 循环,我正在对其进行矢量化处理。问题是,一旦矢量化,代码会慢 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);
探查器说找到,squeeze和sum是最耗时的函数。我相信可以做一些事情来从 if 语句中获取信息,但是如果不更改索引,我找不到更简单的方法。