请问matlab gui中如和取得函数内部变量的值,然后在回调函数中使用?
x = 0 : 0.1 : 2 * pi;
fun_handle = line(x,sin(x));
现在我想要在callback中对line函数中的参数x赋值,或者取得sin(x)在此时刻的值,应该如何做,非常感谢了。我使用get函数的时候不能够取得line中的值啊?
现在
程序如下:
fig_handle = figure('numbertitle','off',... %2去掉matlab默认窗口标题如:figure1 figure2...
'name','设置曲线的形状与颜色');
hm = findall(fig_handle , 'type', 'uimenu'); %查找标准菜单
delete(hm) %删除标准菜单
h = findall(fig_handle , 'type', 'uipushtool',...
'-or',...
'type', 'uitoggletool'); %查找工具按钮
set(h, 'visible', 'off') %隐藏工具按钮
h12 = findall(fig_handle , 'Tooltip', 'Zoom In',...
'-or', ...
'Tooltip', 'Zoom Out',...
'-or',...
'Tooltip', 'Pan',...
'-or',...
'Tooltip', 'Data Cursor');
set(h12, 'visible', 'on',...
'Separator', 'off') %显示指定的4个工具按钮
set(gcf,'toolbar','figure')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 创建坐标轴,h1也可以去掉
h1 = axes('parent',fig_handle,... %注意h0这里人为定义的一个句柄,作为父对象句柄,创建坐标轴
'position',[0.15 0.45 0.75 0.45],... % 'position',[右移 下移 左右压缩或者延展 上下压缩或者延展],...
'visible','on'); %只有可视化以后,才可以使用下面三句话
xlabel('自变量x'); %x轴标签
ylabel('函数值y'); %y轴标签
title('y=sin(x)','color','y'); %标题,颜色
x = 0 : 0.1 : 2 * pi; %x轴数据
fun_handle = line(x,sin(x)); %绘制数据曲线也可以换成plot,k为一个函数指针z
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
set(0,'DefaultUicontrolfontsize',12) %设置控件默认的字体大小
p1 = uicontrol('parent',fig_handle,... %创建【加号】按钮
'string','加号',...
'position',[60 100 50 30],...
'callback',['set(fun_handle,''x'',3);'...
ttt=get(fun_handle,''sin(x)''); ]);
请问最后两句错在哪里了?非常感谢了!
我的问题如下:
1:自定义一个函数,fun(x,y=3,z)
然后希望在callback中使用set个x赋值,用get取到y的值。请问可以吗!如果不可以请问用什么方法。
2:如果是matlab自带的函数如line画线函数。像"1“中那样赋值和取值line函数中的参数,又应该怎么办,非常感谢了! 展开
你程序最后的callback表达式语法就是错的。
变量fun_handle是一条曲线的句柄,而不是函数句柄。这点相信你知道,但还是应该提醒一下:变量命名应该尽量避免引起误解。
设置line的x数据和y数据,必须保证二者长度相同,你单独设置x是不对的。
我没看明白你到底想要实现什么功能,请再说清楚点。
10-24补充:
如果还要继续提问或者有什么补充说明,建议用追问的方式,不要用补充,那样我回答也只能修改原来的回答,感觉比较别扭。
需要编写回调函数的程序最好写成function而非script,像你现在这种做法,把回调函数的内容全写成字符串,如果功能稍微复杂一点就很不好写。另外一个弊病是,回调函数用的是MATLAB的base工作区,执行会受基本工作区影响(也会反过来影响基本工作区)。
你的补充说明写得仍然不太清楚。看你写程序注释的习惯很不错,这种风格和你提问描述问题的草率不太相符。如果你稍微多用点心,把问题描述的足够清楚,那样既有助于你的问题尽快得到解决,也可以减少浪费我的时间。
我没搞太清楚你到底想要做什么,这里就简单点演示一下怎样在回调函数里获取以及修改曲线的数据(得到原来的x和y,并把x*2相当于横轴放大,y取平方),代码在你原有基础上修改(把p1=uicontrol(...)之后的替换成下面的代码),请自行对照看看实现方法,希望你能从中得到启发。
set(gcf,'userdata', fun_handle);
call_str = [ ...
'hLine=get(gcbf,''user'');' ...
'x=get(hLine,''x'');' ...
'y=get(hLine,''y'');' ...
'set(hLine,''x'',2*x,''y'',y.^2);' ...
];
p1 = uicontrol('parent',fig_handle,... %创建【加号】按钮
'string','加号',...
'position',[60 100 50 30],...
'callback',call_str);