Matlab, как сделать обратный вызов набора значений? - PullRequest
1 голос
/ 02 января 2012

Я хочу сделать небольшой сценарий, в котором я могу систематически анализировать множество графиков Matlab. С помощью сценария я смогу щелкнуть некоторые точки на графике, и сценарий затем сохранит эти значения. Теперь у меня есть функция обратного вызова с координатами, но я хочу, чтобы эти значения сохранялись в основном файле. Но функция set не может получать значения от функции. Как я могу создать другую конструкцию, чтобы избежать этого? [x, y] = set (f, 'ButtonDownFcn', {@ Click_CallBack a}); не работает несчастный случай ..

function process_plot()
  dataset_dia = input('diameter?')
  dataset_length = input('length?')


  h = gcf;
  a = gca;
  f =get(gca,'Children');
  set(h, 'Pointer', 'fullcrosshair');
  set(f,'ButtonDownFcn',{@Click_CallBack a}); 

  save(strcat(dataset_dia, '.mat'), x, y);

end

Функция, извлекающая координаты из графика:

function [x, y]= Click_CallBack(h,e,a)
 point = get(a,'CurrentPoint'); x = point(1);
 y = point(4);
 fprintf(1,'X,Y = %.2f,%.2f\n',x,y);
end

1 Ответ

0 голосов
/ 03 января 2012

Вы можете сделать что-то вроде следующего. Щелкните левой кнопкой мыши, чтобы сохранить точки в пользовательских данных, затем щелкните правой кнопкой мыши по окончании выбора, чтобы записать их в файл MAT.

function process_plot()   
f =get(gca,'Children');
set(gcf, 'Pointer', 'fullcrosshair');
set(f,'ButtonDownFcn',{@Click_CallBack gca});

function [x, y]= Click_CallBack(h,e,a)
userData = get(a,'userData'); %Store x,y in axis userData
switch get(ancestor(a,'figure'),'SelectionType')
    case 'normal' %left click       
        point = get(a,'CurrentPoint');
        userData(end+1,:) = [point(1,1) point(1,2)];
        set(a,'userData',userData)
        fprintf(1,'X,Y = %.2f,%.2f\n',point(1,1),point(1,2));
    otherwise %alternate click
        % Reset figure pointer
        set(ancestor(a,'figure'), 'Pointer','arrow');
        %Clear button down fcn to prevent errors later
        set(get(gca,'Children'),'ButtonDownFcn',[]);
        %Wipe out userData 
        set(a,'userData',[]);
        x = userData(:,1);
        y = userData(:,2);
        save('myMatFile', 'x', 'y'); %Save to MAT file ... replace name 
end

Это, конечно, если вы не используете пользовательские данные оси для чего-то другого. Также обратите внимание, что текущая точка, полученная во время нажатия кнопки, на самом деле не будет в вашем набранном наборе данных. Это текущая позиция курсора над нарисованными линиями. Если вы хотите, чтобы в ваших построенных линиях были фактические точки, вам придется искать в ваших данных ближайшую точку к найденной позиции курсора.

...