MatLab GUI 问题:计算积分
MatLab GUI Troubles: Calculating an Integral
我创建了一个 matlab GUI,用户可以在其中选择要积分的变量、输入方程以及下限和上限。当我的代码去计算按钮回调的积分时,我得到一个我不明白的错误。
这是导致错误的代码行:
i1 = int( eval(get(handles.edit1,'string')),
(handles.respectvar),
get(handles.edit3),
get(handles.edit2)
);
%respactvar is the user-selected variable, and edit3 and edit2 are the lower and upper limits.
这是错误信息:
Error using sym>tomupad (line 1135)
Conversion to 'sym' from 'struct' is not possible.
Error in sym (line 151)
S.s = tomupad(x);
Error in sym/int (line 142)
b = sym(b);
Error in projectCALC>pushbutton1_Callback (line 376)
i1=int(eval(get(handles.edit1,'string')),(handles.respectvar),get(handles.edit3),get(handles.edit2));
Error in gui_mainfcn (line 95)
feval(varargin{:});
Error in projectCALC (line 42)
gui_mainfcn(gui_State, varargin{:});
Error in @(hObject,eventdata)projectCALC('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback
谢谢!
您的代码存在多个问题。
第一个问题,如,是你忘了get
最后两个编辑框的string
属性,而你这样做是为了第一个.
第二个问题是 eval
效率很低,而且在你的情况下,非常不安全。如果有人在编辑框中写了一个 system()
调用,擦除您的硬盘驱动器怎么办?
第三个问题是即使使用eval
或str2func
,int
也需要它的第一个参数是一个符号表达式。这是一件好事:您实际上不必使用 eval
,您只需将第一个字符串转换为 sym
.
第四个问题是 handles.respectvar
似乎也是一个 GUI 对象,因此您可能需要 get()
一些 属性 才能将其用作积分变量。
假设我的怀疑是正确的,你的edit1
包含了一个像'3*x+y'
这样的字符串,edit2
和edit3
是限制,比如'1'
和'3'
,并且 handles.respectvar
有一个 属性 计算结果为 'x'
,那么你应该调用
formula = sym(get(handles.edit1,'string'));
variable = handles.respectvar; %// more likely: get(handles.respectvar,...)
lim1 = str2double(get(handles.edit3,'string'));
lim2 = str2double(get(handles.edit2,'string'));
i1 = int(formula,variable,lim1,lim2);
一些注意事项:
- 不要害怕在有助于提高可读性的地方使用临时变量。
- 我将
formula
从 sym
转换为 string
,否则你会收到警告或错误(取决于 MATLAB 版本)
- 我留下了
lim1
<-> edit3
, lim2
<-> edit2
的顺序。确保这确实是您想要的,并且订单没有被撤销。
- 我将积分限制转换为
double
,但似乎 sym/int
也将接受字符串输入作为限制变量,所以这主要是为了清楚起见。
我创建了一个 matlab GUI,用户可以在其中选择要积分的变量、输入方程以及下限和上限。当我的代码去计算按钮回调的积分时,我得到一个我不明白的错误。
这是导致错误的代码行:
i1 = int( eval(get(handles.edit1,'string')),
(handles.respectvar),
get(handles.edit3),
get(handles.edit2)
);
%respactvar is the user-selected variable, and edit3 and edit2 are the lower and upper limits.
这是错误信息:
Error using sym>tomupad (line 1135) Conversion to 'sym' from 'struct' is not possible.
Error in sym (line 151) S.s = tomupad(x);
Error in sym/int (line 142) b = sym(b);
Error in projectCALC>pushbutton1_Callback (line 376) i1=int(eval(get(handles.edit1,'string')),(handles.respectvar),get(handles.edit3),get(handles.edit2));
Error in gui_mainfcn (line 95) feval(varargin{:});
Error in projectCALC (line 42) gui_mainfcn(gui_State, varargin{:});
Error in @(hObject,eventdata)projectCALC('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
Error while evaluating UIControl Callback
谢谢!
您的代码存在多个问题。
第一个问题,如get
最后两个编辑框的string
属性,而你这样做是为了第一个.
第二个问题是 eval
效率很低,而且在你的情况下,非常不安全。如果有人在编辑框中写了一个 system()
调用,擦除您的硬盘驱动器怎么办?
第三个问题是即使使用eval
或str2func
,int
也需要它的第一个参数是一个符号表达式。这是一件好事:您实际上不必使用 eval
,您只需将第一个字符串转换为 sym
.
第四个问题是 handles.respectvar
似乎也是一个 GUI 对象,因此您可能需要 get()
一些 属性 才能将其用作积分变量。
假设我的怀疑是正确的,你的edit1
包含了一个像'3*x+y'
这样的字符串,edit2
和edit3
是限制,比如'1'
和'3'
,并且 handles.respectvar
有一个 属性 计算结果为 'x'
,那么你应该调用
formula = sym(get(handles.edit1,'string'));
variable = handles.respectvar; %// more likely: get(handles.respectvar,...)
lim1 = str2double(get(handles.edit3,'string'));
lim2 = str2double(get(handles.edit2,'string'));
i1 = int(formula,variable,lim1,lim2);
一些注意事项:
- 不要害怕在有助于提高可读性的地方使用临时变量。
- 我将
formula
从sym
转换为string
,否则你会收到警告或错误(取决于 MATLAB 版本) - 我留下了
lim1
<->edit3
,lim2
<->edit2
的顺序。确保这确实是您想要的,并且订单没有被撤销。 - 我将积分限制转换为
double
,但似乎sym/int
也将接受字符串输入作为限制变量,所以这主要是为了清楚起见。