如何以字符串形式安全地操作MATLAB匿名函数

时间:2016-02-02 01:59:11

标签: matlab anonymous-function complex-numbers

我有一个匿名函数,我想以字符串形式操作然后与fsolve一起使用。 当我这样做时,匿名函数中对常量的引用会丢失,并且fsolve会失败。

这个问题很容易说明。

以下作品:

A=3;
myfun=@(x)sin(A*x);
x = fsolve(@(x)myfun(x),[1 4],optimoptions('fsolve','Display','off'))

以下引发了here所解释的错误:

A=3;
myfun=@(x)sin(A*x);
mystring=func2str(myfun);
%string operations would go here such as strrep(mystring,'A','A^2') or whatever
myfun2=str2func(mystring);
x = fsolve(@(x)myfun2(x),[1 4],optimoptions('fsolve','Display','off'))

我是否有某种方法可以安全地操作匿名函数,同时保留对常量参数的引用?

更多信息

具体来说,我正在编写一个简单的包装器,以允许fsolve接受虚数的简单情况。下面举例说明没有常量参数的工作示例:

myeqn=@(x)0.5*x^2-5*x+14.5;
cX0=1+1*1i;
f1=strrep(func2str(myeqn),'@(x)','');
f2=strrep((f1),'x','(x(1)+(x(2))*1i)');
f3=strcat('@(x)[real(',f2,'); imag(',f2,')]');
fc=str2func(f3);
opts=optimoptions('fsolve','Display','off');
result=arrayfun(@(cinput)[1 1i]*(real(fsolve(fc,[real(cinput);imag(cinput)],opts))),cX0)

如上面的失败示例中那样,如果我在包装器中包含参数,则该过程将失败并出现与上述相同的错误。

2 个答案:

答案 0 :(得分:3)

我最初建议使用符号数学工具箱,但是再次阅读你的问题我意识到它只是输入参数的简单替换。您可以使用函数句柄实现此目的,而无需任何字符串处理。

myeqn=@(x)0.5*x^2-5*x+14.5;
cX0=1+1*1i;
wrapper=@(x,f)([real(f(x(1)+x(2)*i)),imag(f(x(1)+x(2)*i))])
opts=optimoptions('fsolve','Display','off');
result=arrayfun(@(cinput)[1 1i]*(real(fsolve(@(x)wrapper(x,myeqn),[real(cinput);imag(cinput)],opts))),cX0)

答案 1 :(得分:-2)

尽管我讨厌建议使用eval功能,但您可以这样做:

myfun2 = eval(mystring);

使用eval有点不受欢迎,因为它使代码难以分析(因为该字符串中可能会出现任意的肮脏),但不要让其他人的编码风格阻止你做什么工作:)

在较长的示例中,这将对应于更改行:

fc=str2func(f3);

为:

fc=eval(f3);

同样,强烈建议不要使用eval,因此您应该考虑这种类型的函数定义字符串操作的替代方法。