我在Octave中的功能出了什么问题?

时间:2011-05-21 20:40:04

标签: gnuplot 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));

绘制它

它显示了一个女巫似乎有点奇怪的情节。 enter image description here

我错了什么?

提前致谢 约翰

2 个答案:

答案 0 :(得分:3)

你必须原谅我的包装生锈,但你需要稍微改变一下代码。值得注意的是,符号0<=x不正确,必须为x>=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

答案 1 :(得分:1)

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 >= a & x < b)语法是逻辑索引。单独,x >= a & x < b为您提供逻辑值的向量,但与另一个向量组合,您将获得满足条件的值。 Octave也会让你做这样的作业。

相关问题