2015-04-02 167 views
0

我有这个函数需要一个字符串作为输入。如何将字符串转换为非字符串在matlab中

例如它需要handles.f = 'X^2'

,但我想handles.f = X^2,这样以后我就可以做F(X)= handles.f

 function edit1_Callback(hObject, eventdata, handles) 

    handles.f = (get(hObject,'String')) 

    handles.f 

    area = rect(handles.f,handles.u,handles.l,handles.n) 

    guidata(hObject,handles) 

功能:

function [ s ] = rect(f,u,l,n) 
    syms x; 

    f(x) = f; 

    h =(u-l)/n 

    z = l:h:u; 

    y = f(z) 

    s = 0; 



    for i=1:n 
    s = s+y(i); 
    end 

    s = h*s; 

    end 

当我打电话从命令提示此功能是这样的: RECT(X^2,5,1,4)

它工作正常 但是,当我从gui调用这个时会出错。

这是我的错误:

Error using sym/subsindex (line 1558) 
    Indexing input must be numeric, logical or ':'. 

    Error in rect (line 8) 
    f(x) = f; 

回答

1

这违背我给自己的任何意见,但如果你想要做你的要求,你需要使用eval。这将您输入的任何字符串转换为它,并将其转换为MATLAB中的命令供您执行。如果我正在解释你想要的内容,你需要创建一个匿名函数,并以x作为输入。

因此,你可以这样做:

handles.f = eval(['@(x) ' get(hObject,'String')]); 

这需要存储在hObject字符串中,它包装成一个匿名函数,并将其存储到handles.f。因此,你现在可以做的:

out = handles.f(x); 

x是输入数字。这是需要eval的少数情况之一。一般来说,我不推荐使用它,因为当代码变得复杂时,在eval内放置一个复杂的命令作为字符串会降低代码的可读性。另外,在eval中评估的代码不是JIT加速的......这实际上只是一个坏习惯。


编辑

路易斯Mendo建议做str2func避免eval ...这是优选(哇!)。

所以做:

handles.f = str2func(['@(x) ' get(hObject,'String')]); 
+1

在这里工作。 @rayryeng,你可以通过使用'str2func'来避免'eval':'handles.f = str2func(['@(x)'handles.f])' – 2015-04-02 04:15:31

+0

@Luis Mendo我也试过,它不工作。 – user4129542 2015-04-02 04:17:43

+0

@LuisMendo - 啊非常好。谢谢你的提示! – rayryeng 2015-04-02 04:20:24

相关问题