1

使用指南,我制作了一个 Matlab Gui,它有 10 个轴,我想在其中显示图像,在我按下按钮后一次显示所有图像。

我制作了一个单独的.m文件,其中包含从 Button Callback 调用的函数 Load_Write_Img_Results(img_index),该函数具有以下代码:

for i = 1 : 10
    handles_imgOut = findobj('Tag', ['imgOut' num2str(i)]);
    set(handles_imgOut, 'HandleVisibility', 'ON');
    axes(handles_imgOut);
    image(imgs_data{img_index(i)});
    ...
end

每次我运行主 Gui 并一次按下按钮时,图像都会显示在所有轴上,所以一切正常


当我第二次按下按钮时出现问题,我收到此错误:

    Error using axes  
    Invalid object handle

在这条线上:

    axes(handles_imgOut);

调试时,我看到在handles_imgOut = findobj('Tag', ['imgOut' num2str(i)]);is handles_imgOutnot get any value and is empty之后,很明显那个错误。

第二次按下按钮时我有没有机会获得轴的手柄?

另外,我想知道如何从 Matlab 解决这个警告:

Calling AXES(h) in a loop can be slow. Consider moving the call to AXES outside the loop.

在此先感谢,欢迎任何建议!


[解决方案]:

for i = 1 : 10
    handles_imgOut = findobj('Tag', ['imgOut' num2str(i)]);
    set(handles_imgOut, 'HandleVisibility', 'ON');
    axes(handles_imgOut);
    image(imgs_data{img_index(i)});

    set(gca, 'Tag', ['imgOut' num2str(i)]); //! renew the tag
    ...
end
4

2 回答 2

1

我对 GUIDE 还很陌生,我也遇到过类似的问题,图表没有多次更新/找不到轴。最后,我使用了以下方法,希望对您也有用:

    % I get my axes directly from the handles object, instead of using findObj:
        graph1 = handles.axes1;
        graph2 = handles.axes2;
    % clear axes
        cla(graph1);
        cla(graph2);
    % showTrial is my function that draws the graphs - 
    %notice that I used handles to store other variables as well (.data, .trials)
    showTrial(handles.data, handles.trials(1), graph1, graph2)

把它们加起来:

  • 不要使用 findObj,从句柄中获取坐标轴(它应该自动将它们包含为 imgOut1、imgOut2 等)

  • 将轴传递给绘图函数或直接传递句柄变量,例如 Load_Write_Img_Results(img_index, handles)

于 2012-05-31T06:39:33.273 回答
0

它在第一次按下按钮时起作用,但此后不起作用的事实暗示

image(imgs_data{img_index(i)});

打开新轴而不是绘制到现有轴中。由于新轴未使用您的标签进行初始化,findobj因此不会找到它们。任何一个

(1) 确保通过hold on在创建后立即放置命令来保持原始轴,

或者

image(2) 在命令后立即更新标签

set(gca, 'Tag', ['imgOut' num2str(i)]);
于 2012-05-31T06:42:01.583 回答