gpt4 book ai didi

performance - 使用嵌套的 if 子句向量化循环

转载 作者:太空宇宙 更新时间:2023-11-03 20:33:25 28 4
gpt4 key购买 nike

问题

我正在尝试优化我的代码的运行时间,并且在包含几个嵌套的 if 语句之前问过一个类似的问题。 Vectorizing nested if-statements

由于我在那里发布的希望我可能实现的一些想法的代码有点长,而且我仍在为嵌套循环的矢量化实现而苦苦挣扎,我想用一些更简单的代码再次提问:

代码

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

但它并没有真正按照我的意愿去做。

希望得到一些帮助!

最佳答案

如果我正确理解输入格式,您可以使用 bsxfun 进行广播对于像这样的矢量化解决方案 -

% Perform broadcasted comparison corresponding to the iterative comparison
% in original code to get a boolean array/mask.
% Get the row, col indices for the mask, which will correspond to the index
% values and positions where those values are to be stored in the output.
[R,C] = find(bsxfun(@eq,BML(:,2),BML(:,2).'+x_blockdimension) & ...
bsxfun(@eq,BML(:,3),BML(:,3).'));

% Setup output array and store the indices at respcetive positions.
NB_list_z_out = zeros(size(BML,1),numel(NB_list));
NB_list_z_out(C,1) = R;

请注意,输出似乎只编辑输出数组中的第一列元素,因此在最后一步使用 NB_list_z_out(C,1) 进行索引。


可以建议一种替代方法,重点关注内存效率和额外的性能,并获得 RC,它们可以在以后使用,就像它们在前面列出的方法。实现看起来像这样 -

% Filter out with "bsxfun(@eq,BML(:,3),BML(:,3).'))".
[~,~,idx] = unique(BML(:,3),'stable');
vidx = find(ismember(idx,find(accumarray(idx(:),1)>1)));

% Filter out on remaining ones with valid indices (vidx)
[R1,C1] = find(bsxfun(@eq,BML(vidx,2),BML(vidx,2).'+x_blockdimension));
R = vidx(R1);
C = vidx(C1);

关于performance - 使用嵌套的 if 子句向量化循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38142352/

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