问题
我正在尝试优化我的代码运行时间,并且之前已经提出过一个类似的问题,其中包含了几个嵌套的 if 语句。向量化嵌套的 if 语句
由于我在那里发布的代码有些冗长,而且我仍然在努力实现嵌套循环的向量化,所以我想再次发问,这次我将提供一些更简单的代码:
代码
NB_list_all=zeros(length(BML),4);
for NB=1:length(BML);
NB_list=zeros(4,1);
%in +x direction
if isempty(find(BML(:,2)==BML(NB,2)+x_blockdimension & BML(:,3)==BML(NB,3), 1));
NB_list(1,1)=0;
else
NB_list(1,1)=find(BML(:,2)==(BML(NB,2)+x_blockdimension)& BML(:,3)==BML(NB,3));
end
NB_list_z(NB,:)=NB_list;
end
% BML(:,2) stores the x-coordinate
% BML(:,3) stores the y-coordinate
一些示例数据
BML=
1 1005 115
2 1100 115
3 1419 120
4 1424 120
5 660 115
6 655 115
注意,BML的大小为170,000 x 7。
代码描述:
我尝试使用这段代码来查找我的点云中距离“x_blockdimension”一定距离的下一个点。如果没有找到任何点,则将该条目设置为零。由于这需要大量时间处理1800万个点(而且我不仅仅是在一个方向上查找),因此我正在寻找一种通过使用向量化或逻辑索引来优化此过程的方法。如果有其他方法可以改善运行时间,我会很高兴得到任何提示。
我尝试过:
if isempty(find(BML(:,2)==BML(:,2)+x_blockdimension & BML(:,3)==BML(:,3), 1));
NB_list(1,1)=0;
else
NB_list(1,1)=find(BML(:,2)==(BML(:,2)+x_blockdimension)& BML(:,3)==BML(:,3));
end
但它并没有真正做我想要的事情。 我希望能得到一些帮助!
z
上使用条件的方式。但是,bsxfun
部分将扩展以包括BML(vidx,4)
。 - Divakarvidx
,它基本上意味着有效的索引来遍历行。因此,您可以坚持使用循环代码并使用vidx
。因此,for NB=1:length(BML)
可以替换为for NB=1:length(vidx)
并继续使用您的循环代码,这将为您提供R1
和C1
的等效项。在所有操作结束时,我们需要使用vidx(R1)
等进行索引。 - Divakar