2011-03-23 156 views
0

我已经阅读了eval()的正确使用方法,说实话,我不知道我的用法是否属于“很好”或“很糟糕”类别。请指教!我应该在这里使用eval()吗?

这里是我的代码呢:功能

F = 'EXP(-x)' %字符串,我想用

G = GetGradient(F)%象征性地得到的功能梯度将F下一定映射

X =任何%矢量x被通过其他手段分配

答案= EVAL(G)%输出在点X评估的梯度G。

对我来说重要的是'回答',向量x中的所有点的梯度函数(以其他方式确定)。 eval就在这里吗?谢谢。

+0

你在做符号数学或数字吗?你的函数GetGradient可以接受一个向量并且吐出一个输出吗? – 2011-03-23 16:09:43

+0

GetGradient函数接受一个char字符串并使用符号数学运算出它的渐变(在映射x - > z(x)之后) – Nadav 2011-03-23 16:18:59

回答

3

我建议下面的替代方案,假设G,在你的例子中,字符串'-exp(-x)'STR2FUNC将您的函数字符串转换为匿名函数,然后您可以像往常一样进行评估。

gradFun = str2func(['@(x)' G]); %# this assumes that x is the independent variable in G 

x = whatever; 

answer = gradFun(x); %# or answer = gradFun(whatever); 

编辑:如果GetGradient返回一个象征性的表达,你可以使用char将其转换为字符串。

+0

对不起,如果我不清楚。 G是特定变换x→z(x)后f ='exp(-x)'的梯度。 GetGradient函数在映射后获取函数f的梯度x - > z(x) – Nadav 2011-03-23 16:20:34

+1

@Nadav:似乎其他Jonas的解决方案仍然应该做你想要的,它确实的字符串GetGradient输出并不重要只要它是一个可以通过Matlab评估的表达式(就像您使用eval()所建议的那样)并且不依赖于任何其他变量。请注意,如果您想多次调用该函数,使用str2func似乎特别有意义(因为解析只会发生一次,而不是多次调用eval)。如果你只需要用一个给定的字符串G调用一个x值的函数,我会说你可以坚持使用eval。 – 2011-03-24 16:36:38

+0

@Nadav:如果你在符号表达式上使用'char',它应该为你创建一个字符串。 – Jonas 2011-03-24 17:14:54