gpt4 book ai didi

matlab - 在matlab中检查没有for循环的数组中的成员资格

转载 作者:行者123 更新时间:2023-12-01 22:58:45 25 4
gpt4 key购买 nike

我想将此代码简化为无需 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 稀疏 double 的形式。所以,我想出了以下解决方案,但我找不到在其中实现成员资格条件(由?指定)的方法。
PID = sum(TFP).*(?);

可以不用循环实现吗?

最佳答案

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

关于matlab - 在matlab中检查没有for循环的数组中的成员资格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60302296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com