2011-05-21 72 views
2

我只是试图在倍频创建我的第一个功能,它看起来如下: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

我错了什么?

在此先感谢 约翰

回答

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

x是矢量,所以你既可以通过它需要循环或vectorise你的代码不再需要。

正如你使用的是八度,它是值得矢量的一切,你可能可以。我能想到的最简单的方法是:

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为您提供了一个逻辑值的矢量,但与另一个矢量相结合,您将得到满足条件的值。八度还会让你做这样的任务。