我有这个函数,它以字符串作为输入。
例如,它需要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;
这违背了我给自己的任何建议,但如果你想做你所要求的,你需要使用eval
。这会将您输入的任何字符串转换为它,并将其转换为MATLAB中的命令以供您执行。如果我正确地解释你想要的东西,你想要创建一个以x
作为输入的匿名函数。
因此,你会这样做:
handles.f = eval(['@(x) ' get(hObject,'String')]);
这将获取存储在hObject
中的字符串,将其包装到匿名函数中,并将其存储到handles.f
中。因此,您现在可以:
out = handles.f(x);
x
是输入数字。这是需要eval
的少数情况之一。一般情况下,我不建议使用它,因为当代码变得复杂时,将一个复杂的命令作为字符串放在eval
中会降低代码的可读性。此外,在eval
中评估的代码不是JIT加速......而这只是不好的做法。
Luis Mendo建议做str2func
以避免eval
...这是更好的(哇!)。
所以:
handles.f = str2func(['@(x) ' get(hObject,'String')]);