2015-07-08 6 views
3

Мне нужно создать несколько перетаскиваемых точек на оси. Однако, это, кажется, очень медленный процесс, на моей машине с немного больше, чем второй, когда делается так:Ускорить создание неподходящих объектов

x = rand(100,1); 
y = rand(100,1); 

tic; 
for i = 1:100 
    h(i) = impoint(gca, x(i), y(i)); 
end 
toc; 

Любые идеи о скорости до будет высоко оценен.

Идея состоит в том, чтобы предоставить пользователю возможность корректировать позиции на фигуре, которая была предварительно рассчитана Matlab, здесь приведены случайные числа.

+2

Поскольку 72% времени работы потребляется функцией 'impoint', вряд ли существует какой-либо запас для ее оптимизации. Пожалуйста, предоставьте еще несколько примеров, чтобы увидеть, есть ли другой подход с нуля. – thewaywewalk

+2

Итак, сколько из этих 100 пунктов перемещено впоследствии? Я мог бы вообразить, чтобы построить точки условно, а затем использовать datatips и функцию обратного вызова, чтобы просто создать точку перетаскивания, если вы действительно хотите ее перетащить. – thewaywewalk

+0

Это звучит для меня очень хорошая идея, как бы вы решительно выбрали то, что вы меняете? – lhcgeneva

ответ

1

Вы можете использовать курсор ginput в цикле while, чтобы отметить все точки, которые вы хотите отредактировать. Затем просто нажмите за пределами осей, чтобы выйти из цикла, переместить точки и принять любую клавишу.

f = figure(1); 
scatter(x,y); 
ax = gca; 
i = 1; 
while 1 
     [u,v] = ginput(1); 
     if ~inpolygon(u,v,ax.XLim,ax.YLim); break; end; 
     [~, ind] = min(hypot(x-u,y-v)); 
     h(i).handle = impoint(gca, x(ind), y(ind)); 
     h(i).index = ind; 
     i = i + 1; 
end 

enter image description here


В зависимости от того, как вы обновляете свой график вы можете получить общее ускорение с помощью функций, как clf (ясный рисунок) и cla (четкие оси) вместо того, чтобы всегда как открыть новое окно с цифрами, как описано в this answer, может оказаться полезным.


В качестве альтернативы, это очень грубое представление о том, что я имел в виду в комментариях. Он вызывает различные ошибки, и у меня нет времени отлаживать его прямо сейчас. Но, возможно, это помогает в качестве отправной точки.

1) Обычные зарисовки данных и активизация datacursormode

x = rand(100,1); 
y = rand(100,1); 
xlim([0 1]); ylim([0 1]) 

f = figure(1) 
scatter(x,y) 

datacursormode on 
dcm = datacursormode(f); 
set(dcm,'DisplayStyle','datatip','Enable','on','UpdateFcn',@customUpdateFunction) 

2) Пользовательская функция обновления оценки выбранной всплывающей подсказки и создание impoint

function txt = customUpdateFunction(empt,event_obj) 

pos = get(event_obj,'Position'); 
ax = get(event_obj.Target,'parent'); 
sc = get(ax,'children'); 

x = sc.XData; 
y = sc.YData; 
mask = x == pos(1) & y == pos(2); 
x(mask) = NaN; 
y(mask) = NaN; 
set(sc, 'XData', x, 'YData', y); 
set(datacursormode(gcf),'Enable','off') 

impoint(ax, pos(1),pos(2)); 
delete(findall(ax,'Type','hggroup','HandleVisibility','off')); 

txt = {}; 

Он работает для, если вы хотите просто хотите переместить одну точку. Возобновление datacursormode и установки второй точки не удается:

enter image description here

Может быть, вы можете найти ошибку.

Смежные вопросы