如何在matlab中将字符串转换为非字符串

问题描述 投票:0回答:1

我有这个函数,它以字符串作为输入。

例如,它需要handle.f ='x ^ 2'

但是我想要handle.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;
string matlab matlab-guide
1个回答
1
投票

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

因此,你会这样做:

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

这将获取存储在hObject中的字符串,将其包装到匿名函数中,并将其存储到handles.f中。因此,您现在可以:

out = handles.f(x);

x是输入数字。这是需要eval的少数情况之一。一般情况下,我不建议使用它,因为当代码变得复杂时,将一个复杂的命令作为字符串放在eval中会降低代码的可读性。此外,在eval中评估的代码不是JIT加速......而这只是不好的做法。


Edit

Luis Mendo建议做str2func以避免eval ...这是更好的(哇!)。

所以:

handles.f = str2func(['@(x) ' get(hObject,'String')]);
© www.soinside.com 2019 - 2024. All rights reserved.