matlab - 在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).*(?);
它可以在没有循环的情况下实现吗?
解决方案
你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));
推荐阅读
- google-sheets - 如何在表格中获取具有一个匹配条件的所有行?
- r - 使用 R 的气泡图 - x 轴变量不是数字顺序 + 轴缩放
- doctrine - 具有附加聚合字段的 Doctrine 实体存储库
- tensorflow - 如何在 TF 2 中通过自定义函数使用 tf.data.Dataset.interleave()?
- javascript - 在 IF 函数中使用 OR 运算符时,比较条件的顺序是否重要?
- javascript - 反应类组件中的重定向页面
- c# - AutoMapper - 映射多对多关系
- javascript - 当ajax响应相同5秒时如何删除span的文本内容
- c++ - 对复合赋值中的“const”感到困惑
- javascript - 为什么我在 React 中的简单名称更改功能不起作用?