首页 > 解决方案 > 在matlab中检查没有for循环的数组中的成员资格

问题描述

我想简化此代码以在没有 for 循环的情况下工作。

for i=1:N
    for j=1:N
        if ismember(j,A)

           PID(i,i)=TFP(i,j)+ PID(i,i);

        end
    end
end

其中A是一个包含一些标签的矩阵。我之前TFP是以 N*N 稀疏双精度的形式存储的。所以,我想出了以下解决方案,但我找不到一种方法来实现成员资格条件(由?指定)。

PID = sum(TFP).*(?);

它可以在没有循环的情况下实现吗?

标签: matlabloopsfor-loopvectorization

解决方案


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));

推荐阅读