【问题标题】:What is wrong with my function in Octave?我在 Octave 中的函数有什么问题?
【发布时间】:2011-05-21 20:40:04
【问题描述】:

我刚刚尝试在 octave 中创建我的第一个函数,它看起来如下:

function hui(x)
if(0 <= x && x <2)
    retval = (1.5 * x + 2)
elseif(2<= x && x <4)
    retval = (-x + 5)
elseif(4<= x && x < 6)
    retval = (0.5 * x)
elseif(6<= x && x < 8)
    retval = (x - 3)
elseif(8<= x && x <=10)
    retval = (2 * x - 11)
endif
endfunction

但如果我尝试使用以下方式绘制它:x=0:0.1:10; plot(x, hui(x));

这表明一个情节女巫似乎有点奇怪。

我做错了什么?

提前致谢 约翰

【问题讨论】:

    标签: gnuplot octave


    【解决方案1】:

    您必须原谅我对软件包的生疏,但您需要稍微更改一下代码。值得注意的是,符号0&lt;=x 不正确,必须是x&gt;=0。由于hui 是对向量进行操作,我相信您在构造返回值时需要考虑到这一点。

    我确信有更有效的向量化方法,但基本上,在跨过输入向量时,我将最新值添加到返回向量中,最后去掉我输入的初始 0 . 我输入了一个哨兵值,以防输入不满足其中一个条件(它总是在你的代码中采用“else”路径,所以在那里放一些东西可能会提醒你有问题)。

    function [retval] = hui(x)
    retval = 0
    for i=1:size(x,2)
        if(x(i)>=0 && x(i) <2)
             retval = [retval (1.5 * x(i) + 2)];
    
        elseif( x(i)>=2 && x(i) <4)
             retval = [retval (-1*x(i) + 5)];
    
        elseif(x(i)>=4 && x(i) < 6)
             retval = [retval (0.5 * x(i))];
    
        elseif(x(i)>=6 && x(i) < 8)
             retval = [retval (x(i) - 3)];
    
        elseif(x(i)>=8 && x(i) <=10)
             retval = [retval (2 * x(i) - 11)];
    
        else
             retval = -999;
    
        endif
    
    endfor 
        retval = retval(2:size(retval,2));
    endfunction
    

    【讨论】:

      【解决方案2】:

      x 是一个向量,因此您需要循环遍历它或将您的代码向量化以消除需要。

      当您使用 Octave 时,有必要尽可能地矢量化所有内容。我能想到的最简单的方法是:

      x = 0:0.1:10;
      y = x;
      y(x >= 0 & x < 2)  = x(x >= 0 & x < 2) * 1.5 + 2;
      y(x >= 2 & x < 4)  = x(x >= 2 & x < 4) * -1 + 5;
      y(x >= 4 & x < 6)  = x(x >= 4 & x < 6) * 0.5;
      y(x >= 6 & x < 8)  = x(x >= 6 & x < 8) - 3;
      y(x >= 8 & x < 10) = x(x >= 8 & x < 10) * 2 - 11;
      

      y(x &gt;= a &amp; x &lt; b) 语法是逻辑索引。单独,x &gt;= a &amp; x &lt; b 给你一个逻辑值向量,但结合另一个向量你得到满足条件的值。 Octave 也可以让你做这样的作业。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-11
        • 2015-09-30
        • 2017-10-07
        • 2013-07-12
        • 1970-01-01
        • 1970-01-01
        • 2018-01-31
        • 1970-01-01
        相关资源
        最近更新 更多