Your ismember(j,A)
相当于只使用的值A
到索引。所以你可以使用它并完全避免ismember
函数(这是迄今为止代码中最慢的部分)。
所以优化的第一步是
A2=unique(A); % just in case you do not do this already
for i=1:N
for j=A2
PID(i,i)=TFP(i,j)+ PID(i,i);
end
end
这应该已经非常快了。循环在 MATLAB 中还不错,并且经过 JIT 编译器的大力优化。
优化的下一步是将所有索引放在一起并删除辅助循环。您可以通过线性索引来做到这一点,所以
A2=unique(A); % just in case you do not do this already
for i=1:N
PID(i,i)=sum(TFP(i,A2));
end
最后,您可以通过对角化所需列的总和来摆脱这个问题:
A2=unique(A); % just in case you do not do this already
PID=diag(sum(TFP(:,A2),2));