【发布时间】:2016-07-01 17:07:34
【问题描述】:
问题 目前我正在处理大约 1800 万个点数据集,这些数据集通过不同的流程运行。通过配置文件查看器,我发现我的瓶颈之一是这部分代码,因此我想知道是否可以向量化多个 if 语句。
代码
WA=zeros(size(NB_list_z,1),3);
for i=1:size(NB_list_z,1);
if (NB_list_z(i,2)==0||NB_list_z(i,3)==0);
WA(i,1)=BMLS(NB_list_z(i,1),5);
else
if (BMLS(NB_list_z(i,3),5)>=COG);
WA(i,1)=(BMLS(NB_list_z(i,3),5)+BMLS(NB_list_z(i,2),5)+BMLS(NB_list_z(i,1),5))/3;
if (WA(i,1)<COG);
if (BMLS(NB_list_z(i,2),5)>=COG);
WA(i)=(BMLS(NB_list_z(i,2),5)+BMLS(NB_list_z(i,1),5))/2;
if (WA(i,1)<COG);
WA(i,1)=BMLS(NB_list_z(i,1),5);
end
else
WA(i,1)=BMLS(NB_list_z(i,1),5);
end
end
else
if (BMLS(NB_list_z(i,2),5)>=COG);
WA(i,1)=(BMLS(NB_list_z(i,2),5)+BMLS(NB_list_z(i,1),5))/2;
if (WA(i,1)<COG);
WA(i,1)=BMLS(NB_list_z(i,1),5);
end
else
WA(i,1)=BMLS(NB_list_z(i,1),5);
end
end
end
end
代码说明
NB_list_z 包含第一列中点的邻居的索引(在 z 方向 - 每个点最多可以有两个点以上。)
BMLS 包含我要检查的阈值。
COG 是阈值。
考虑最低的块 = Block1 ,上面的块 = Block2 ,上面的块 = Block3。
如果上面不存在邻居,则第一个 if 子句将值设置为 Block1 的值。
之后,我想以对我来说最有利可图的方式组合块。 这意味着如果块 3+2+1 高于阈值,我想将它们全部包括在内,但最高块(此处为块 3)也必须单独超过阈值。 如果不是,则 2+1 条件相同,如果不是,则只有 1。 上面的代码在小数据集上工作得很好,但对于更大的数据集开始需要很多时间。
问题
我刚开始接触“代码优化”和“矢量化”。我发现了一些关于删除 for 循环等的条目,但我找不到任何要删除的内容或只是多个 if 子句。因此问题是是否可以向量化嵌套的 if 子句?
【问题讨论】:
标签: performance matlab vectorization