我有一个矢量化函数,可以计算到一大组点的距离。为了提高性能,我通过仅选择必要的数量来限制点数。因此,我使用distanceToPoint(points.x)
代替distanceToPoint(points.x(IDX))
。当我绘制所需的计算时间时,我可以看到,当索引部分超过数据的%75时,实际需要花费更多时间。我该怎么做才能克服这个问题,或者将性能提升推到%85?
编辑:我在切换到逻辑索引后添加结果,显然更好。似乎在低%10端有性能损失(如果您在彼此之上查看图像,则可见)
答案 0 :(得分:1)
我很确定这里发生的事情是您的索引方案需要花费少量时间。无论你选择什么方法,都需要一些时间,尽管有更好的方法。逻辑总是比使用find语句更好,但更好的方法就是直接使用索引。这是我用来测试内容的一些示例代码,以及结果。注意,我使用2010运行它,我认为在更高的值中会出现某种优化,但我不确定那里到底发生了什么......很明显直接索引似乎比使用逻辑更快,并且应该比某种查找语句快得多。
function time_test
time_full_test=zeros(1e3,1);
time_part_test=zeros(1e3,1);
time_direct_indexing_full=zeros(1e3,1);
time_direct_indexing_part=zeros(1e3,1);
data=rand(1e5,1);
for i=1:1e3
time_full_test(i)=complex_stuff(data);
time_part_test(i)=complex_stuff(data,i*100);
time_direct_indexing_full(i)=complex_stuff2(data);
time_direct_indexing_part(i)=complex_stuff2(data,i*100);
end
figure;plot(time_full_test);hold all;plot(time_part_test);plot(time_direct_indexing_full);plot(time_direct_indexing_part)
legend('Full Time Logic','Part Time Logic','Full Time Direct','Part Time Direct')
function time=complex_stuff(input,max_val)
tic
if ~exist('max_val','var')
mask=true(size(input));
else
mask=false(size(input));
mask(1:max_val)=true;
end
sin(input(mask).^2/4356.342).^63/345;
time=toc;
function time=complex_stuff2(input,max_val)
tic
if ~exist('max_val','var')
max_val=length(input);
end
sin(input(1:max_val).^2/4356.342).^63/345;
time=toc;