2012-02-24 2 views
8

У меня есть векторная функция, которая вычисляет расстояние до большого набора точек. Чтобы улучшить производительность, я ограничиваю количество очков, выбирая только нужные. Итак, вместо distanceToPoint(points.x) Я использую distanceToPoint(points.x(IDX)). Когда я занимаю нужное время вычисления, я вижу, что, когда индексированная часть составляет более 75% данных, она занимает больше времени. Что я могу сделать, чтобы преодолеть это, или увеличить производительность, чтобы сказать% 85? enter image description hereМинимизировать накладные расходы индексации

EDIT: Я добавляю результаты после переключения логического индексирования, очевидно, лучше. Кажется, что есть потеря производительности на низком% 10, однако (видимо, если вы просматриваете изображения друг над другом) enter image description here

+0

Ваш 'IDX' состоит из целых чисел, представляющих позиции в вашем' points.x' или это логический массив? – foglerit

+0

- это целые числа позиций, возвращаемые функцией 'find (criteria)' – zamazalotta

+5

Вместо 'find', попробуйте' IDX = points.x == критерии' (или любую другую логику, определенную 'IDX'). Таким образом вы создадите логический массив, который во многих случаях приведет к более быстрой индексации – foglerit

ответ

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