Octave 如何在GNU倍频程中矢量化匿名函数?

Octave 如何在GNU倍频程中矢量化匿名函数?,octave,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))&

我必须在限制[-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])
相关手册页:


    • 简单。使用数组操作而不是矩阵操作创建匿名函数

      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, [-3/2, 5/2])
          

          那么,我想就这样了?在不知道你还想做什么的情况下,很难提出任何其他建议。请注意,
          vectorize
          函数不是魔术。它只是确保算术运算符不会意外触发矩阵乘法。见:

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

          显然,如果编写原始函数,您可以自己轻松地完成这项工作,而且学习这项工作非常有用,这样您就不会在代码中引入错误。事实上,有些人认为最好不要使用写为字符串的函数,而不要使用@Tasos在回答中显示的直接“匿名”函数。
          vectorize
          函数主要在使用函数时有用,该函数可以读入,或者以使“vectorize”函数在算法中有用的方式获得/生成@塔索斯上面的链接是一个非常好的开始学习的地方。

          因此,正如评论中所建议的,我试用了你的代码。它似乎做到了你所建议的——它创建了一个能够矢量化并绘制它的函数版本

          >> 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, [-3/2, 5/2])
          

          那么,我想就这样了?在不知道你还想做什么的情况下,很难提出任何其他建议。请注意,
          vectorize
          函数不是魔术。它只是确保算术运算符不会意外触发矩阵乘法。见:

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

          显然,如果编写原始函数,您可以自己轻松地完成这项工作,而且学习这项工作非常有用,这样您就不会在代码中引入错误。事实上,有些人认为最好不要使用写为字符串的函数,而不要使用@Tasos在回答中显示的直接“匿名”函数。
          vectorize
          函数主要在使用函数时有用,该函数可以读入,或者以使“vectorize”函数在算法中有用的方式获得/生成@塔索斯上面的链接是开始学习的好地方。

          我们不太擅长评论和指导。首先,一个公认的答案是什么样的?你有什么具体的问题吗?“我能通过[…]实现这一点吗?”。你试过了吗?只要输入它,看看会发生什么!这难道不比在这里提问容易吗?或者你的问题真的是别的?我们不太擅长评论和指导。首先,一个公认的答案是什么样的?你有什么具体的问题吗?“我能通过[…]实现这一点吗?”。你试过了吗?只要输入它,看看会发生什么!这难道不比在这里提问容易吗?或者你的问题实际上是别的什么?看。。。。你明白我的意思了。。。编写匿名函数容易出错。与其编写容易出错的代码,为什么不使用vectorize()将其矢量化呢。对于刚开始使用Octave/Matlab的人,请参见。。。。你明白我的意思了。。。编写匿名函数容易出错。与其编写容易出错的代码,为什么不使用vectorize()将其矢量化呢。对于刚开始使用Octave/Matlab的人来说。先生,对于Octave新手来说,在编写匿名函数时会感到困惑。因此,我在寻找一种合适的方法,可以将任何函数转换为向量化函数。比方说,如果我必须先写这个匿名函数,我会这样写:f=@(t)t.^6-4.*t.^4-2.*t.^3+3.*t.^2+2.*t。希望你能看到不同之处。请再说一点。考虑一个小的部分4×*.^ 4可以写成4*t^ ^ 4因为4是标量并且广播发生在两种情况中,在矩阵乘法和元素乘法中,所以在4×*t和4*t之间没有区别,如果我必须评估f(t)=4*t,对于tand的值范围,因此我可以写f= @(t)。t.^6-4*t.^4-2*t.^3+3*t.^2+2*t适用于[-3/2,5/2]范围内的t.@Manpriz以上所有选项均为是。事实上,当涉及到标量时,我通常会在代码中选择
          *
          而不是
          *
          ,就像代码中的视觉提示一样。先生,对于刚接触八度音阶的人来说,在编写匿名函数时会感到困惑。因此,我在寻找一种合适的方法,可以将任何函数转换为向量化函数。比方说,如果我必须先写这个匿名函数,我会这样写:f=@(t)t.^6-4.*t.^4-2.*t.^3+3.*t.^2+2.*t。希望你能看到不同之处。请再说一点。考虑一个小的部分4×*.^ 4可以写成4*t^ ^ 4因为4是标量并且广播发生在两种情况中,在矩阵乘法和元素乘法中,所以在4×*t和4*t之间没有区别,如果我必须评估f(t)=4*t,对于tand的值范围,因此我可以写f= @(t)。t.^6-4*t.^4-2*t.^3+3*t.^2+2*t适用于[-3/2,5/2]范围内的t.@Manpriz以上所有选项均为是。事实上,当涉及到标量时,我通常在代码中选择
          *
          而不是
          *
          ,就像代码中的视觉提示一样。