如何在GNU Octave中向量化匿名函数?

问题描述

我必须在[-3/2,5/2]范围内以GNU八度绘制以下函数

 f(t)= ((t**6) - (4 * (t**4)) - (2 * (t**3)) + (3 * (t**2)) + (2 * t))
为了更好的效率,我必须首先对其向量化。我能否通过仅将R.H.S作为字符串传递给vectorize()来实现此目标,如下所示:
fx = vectorize("((t**6) - (4 * (t**4)) - (2 * (t**3)) + (3 * (t**2)) + (2 * t))")

然后绘制函数,我可以写:

fplot(fx,[-3/2,5/2])

需要评论和指导,如果可以改进的话。

解决方法

简单。使用数组运算而不是矩阵运算创建匿名函数。

f = @(t) t.^6 - 4 * t.^4 - 2 * t.^3 + 3 * t.^2 + 2 * t
fplot(f,[-3/2,5/2])

相关手册页:

,

因此,如注释中所建议,我尝试了您的代码。它似乎在执行您的建议-它创建了可以向量化并绘制功能的版本。

>> fx = vectorize("((t**6) - (4 * (t**4)) - (2 * (t**3)) + (3 * (t**2)) + (2 * t))")

fx = ((t.**6) - (4 .* (t.**4)) - (2 .* (t.**3)) + (3 .* (t.**2)) + (2 .* t))

>> fplot(fx,5/2])

fplot of fx

所以,我想就是吗?不知道您还想做什么,很难提出其他建议。请注意,vectorize函数不是魔术。它只是确保算术运算符不会意外触发矩阵乘法。看到:

>> help vectorize

-- vectorize (FUN)
 Create a vectorized version of the inline function FUN by replacing
 all occurrences of '*','/',etc.,with '.*','./',etc.

很明显,如果编写原始函数,您可以轻松地做到这一点,并且实际上对学习非常有用,因此您不会在代码中引入错误。实际上,有些人认为最好摆脱以字符串形式编写的函数,而不是@Tasos在其答案中显示的直接“匿名”函数。 vectorize函数主要用于使用可以使“矢量化”函数在算法中有用的方式读取或获取/生成的函数。上面的@Tasos链接是开始学习的好地方。