最小化矢量索引开销

时间:2012-02-24 17:05:55

标签: matlab optimization vector indexing vectorization

我有一个矢量化函数,可以计算到一大组点的距离。为了提高性能,我通过仅选择必要的数量来限制点数。因此,我使用distanceToPoint(points.x)代替distanceToPoint(points.x(IDX))。当我绘制所需的计算时间时,我可以看到,当索引部分超过数据的%75时,实际需要花费更多时间。我该怎么做才能克服这个问题,或者将性能提升推到%85? enter image description here

编辑:我在切换到逻辑索引后添加结果,显然更好。似乎在低%10端有性能损失(如果您在彼此之上查看图像,则可见) enter image description here

1 个答案:

答案 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;

enter image description here