MatLab GUI故障:计算积分

时间:2016-04-13 20:11:41

标签: matlab matlab-guide

我创建了一个matlab GUI,用户可以在其中选择要相关的变量,输入等式,以及下限和上限。当我的代码去计算按钮回调时的积分时,我得到一个我不明白的错误。

这是导致错误的代码行:

i1 = int( eval(get(handles.edit1,'string')),
          (handles.respectvar), 
          get(handles.edit3),
          get(handles.edit2)
        );
  

%respactvar是用户选择的变量,edit3和edit2是下限和上限。

这是错误消息:

  

使用sym> tomupad时出错(第1135行)   无法从'struct'转换为'sym'。

     

sym中的错误(第151行)                   S.s = tomupad(x);

     

sym / int出错(第142行)      b = sym(b);

     

projectCALC中的错误> pushbutton1_Callback(第376行)       I1 = INT(EVAL(得到(handles.edit1, '字符串')),(handles.respectvar),得到(handles.edit3),得到(handles.edit2));

     

gui_mainfcn出错(第95行)           feval(varargin {:});

     

projectCALC出错(第42行)       gui_mainfcn(gui_State,varargin {:});

     

@(hObject,eventdata)projectCALC('pushbutton1_Callback',hObject,eventdata,guidata(hObject))中的错误

     

评估UIControl回调时出错

谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码存在多个问题。

第一个问题,@excaza noted,就是您忘记了get最后两个编辑框的string属性,而您为第一个编辑框执行了此操作。

第二个问题是eval非常低效,而且在你的情况下,非常不安全。如果有人在编辑框中写了system()电话,擦除你的硬盘怎么办?

第三个问题是,即使使用evalstr2funcint也要求其第一个参数为符号表达式。这是一件好事:您实际上不必使用eval,只需将第一个字符串转换为sym

第四个问题是handles.respectvar似乎也是一个GUI对象,所以你可能需要为它get()一些属性才能将它用作集成变量。

假设我的怀疑是正确的,并且您的edit1包含'3*x+y'之类的字符串,则edit2edit3'1'和{{}等限制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,否则会收到警告或错误(取决于MATLAB版本)
  • 我离开了string< - >的顺序了。 lim1edit3< - > lim2。确保这确实是你想要的,订单不会逆转。
  • 我将集成限制转换为edit2,但似乎double也会接受字符串输入作为限制变量,所以这主要是为了清晰起见。