2011-05-21 70 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爲您提供了一個邏輯值的矢量,但與另一個矢量相結合,您將得到滿足條件的值。八度還會讓你做這樣的任務。