如何从 Matlab 中的数据提示游标中提取任意数量的数据点?

How to extract arbitrary number of data points from data tip cursor in Matlab?

我正在尝试显示一系列图形(在下面的示例代码中,2 个图形),这样我将一个一个地浏览每个图形并单击一些点并输出的 (x,y) 位置来自光标的点。根据一些在线帮助,我使用 pause 函数,我单击一个点,按下一个键,使用 datacursormodegetCursorInfo 函数将 (x,y) 数据输出到 Matlab 终端然后点击下一点。我不知道每个图中我要 select 多少分,但假设它会少于 10。因此,我正在使用 for 循环(for rc1=1:10 ) 中有一个暂停语句。问题是当我完成较少数量的点(比如 rc1=5)并移动到下一个数字时,我不知道如何退出此循环。我该怎么做呢 ?如果代码可以指示我已经完成当前图形的 selecting 点并让我跳出 rc1=1:10 循环(例如,某种 if (condition) continue 语句 if isfield ... end 应该有效)。

clc
clearvars
close all

for rc2=1:2
    
    figure;
    
    x = linspace(0,10,150);
    y = cos(5*x);
    fig = gcf;
    plot(x,y)
    % Enable data cursor mode
    datacursormode on
    dcm_obj = datacursormode(fig);
    % Set update function
    set(dcm_obj,'UpdateFcn',@myupdatefcn)
    % Wait while the user to click
    disp('Click line to display a data tip, then press "Return"');
    
    for rc1=1:10
        pause
        % Export cursor to workspace
        info_struct = getCursorInfo(dcm_obj);
        if isfield(info_struct, 'Position')
            fprintf('%.2f %.2f \n',info_struct.Position);
        end
        
     end
    
end

function output_txt = myupdatefcn(~,event_obj)
% ~            Currently not used (empty)
% event_obj    Object containing event data structure
% output_txt   Data cursor text
pos = get(event_obj, 'Position');
output_txt = {['x: ' num2str(pos(1))], ['y: ' num2str(pos(2))]};
end

好的,我明白了。在内部循环中添加一个 try, catch, break, end 序列并将 pause, getCursorInfo, isfield 段放在 try 部分中使其工作。现在我select几点,干脆关闭当前图,按一个键继续下图。这行得通。

clc
clearvars
close all

for rc2=1:2
    
    figure;
    
    x = linspace(0,10,150);
    y = cos(5*x);
    fig = gcf;
    plot(x,y)
    % Enable data cursor mode
    datacursormode on
    dcm_obj = datacursormode(fig);
    % Set update function
    set(dcm_obj,'UpdateFcn',@myupdatefcn)
    % Wait while the user to click
    disp('Click line to display a data tip, then press "Return"');
    
    for rc1=1:10
        % Export cursor to workspace
        try
            pause
            info_struct = getCursorInfo(dcm_obj);
            if isfield(info_struct, 'Position')
                fprintf('%.2f %.2f \n',info_struct.Position);
            end
        catch
            break;
        end
     end
    
end

function output_txt = myupdatefcn(~,event_obj)
% ~            Currently not used (empty)
% event_obj    Object containing event data structure
% output_txt   Data cursor text
pos = get(event_obj, 'Position');
output_txt = {['x: ' num2str(pos(1))], ['y: ' num2str(pos(2))]};
end