在本節中,咱們將學習如何爲Octave程序寫控制語句。編程
首先,咱們先學習如何使用for循環。咱們將v設爲一個10行1列的零向量。編程語言
接着,咱們寫一個for循環,讓i等於1到10。寫出來就是for i = 1:10。我要設v(i)的值等於2編輯器
的i次方,即輸入 v(i) = 2^i ,循環的最後要記得寫上 end 。這裏的空格實際上是沒有意義的,它們只是爲了看起來更加好看。按照這樣作,那麼結果就以下圖所示。函數
因此這個語句的做用就是:讓i遍歷1到10的值。還有另一種方法:設置indices(索引)等於1到10,即輸入indices = 1:10; ,這時indices就是一個從1到10的序列。如何能夠輸入for i = indices. ,這其實是和for i = 1:10. 是同樣的。而後輸入disp(i); end 也能獲得一個一樣的結果。學習
若是你對 「break」 和 「continue」 語句比較熟悉,Octave裏也有 「break」 和 「continue」語句,你也能夠在 Octave環境裏使用那些循環語句。
可是首先讓我告訴你一個 while 循環是如何工做的:ui
讓咱們寫一個while循環,i=1; while 1<=5, v(i)=100; i=i+1;end; 。這是什麼意思呢?我讓i取值從1開始,而後我要讓v(i)等於100,再讓i遞增1,直到i大於5中止。
如今來看一下結果,我如今已經取出了向量的前五個元素,把他們用100覆蓋掉,這就是一個while循環的句法結構。this
如今咱們來分析另一個例子,在這個例子中將展現怎麼使用break語句。spa
固然這也是咱們第一次使用一個if 語句,因此我但願大家能夠理解這個邏輯,讓i等於1而後開始下面的增量循環,while語句重複設置v(i)等於999,不斷讓i增長,而後當i 達到6,作一個停止循環的命令,儘管有while循環,語句也就此停止。因此最後的結果是取出向量v前5個元素,而且把它們設置爲999。設計
因此,這就是if 語句和while 語句的句法結構。而且要注意要有end,這個例子有兩個end語句。上面的例子裏第一個end 結束的是if 語句,第二個end 結束的是while 語句。如今讓我告訴你使用if-else 語句:(首先咱們設置v(1)=2)3d
最後,提醒一件事:若是你須要退出 Octave,你能夠輸入exit命令而後回車就會退出Octave,或者命令quit也能夠。
最後,讓咱們來講說如何定義和調用函數。
我在桌面上存了一個預先定義的文件名爲 「squarethisnumber.m」,這就是在 Octave 環境下定義的函數。你須要建立一個文件,用你的函數名來命名,而後以.m的後綴結尾。當Ocatve發現這文件,它知道應該在什麼位置查找。
讓咱們打開這個文件。請注意,我使用的是微軟的寫字板程序來打開這個文件,我只是想建議你,若是你也使用微軟的Windows系統,那麼可使用寫字板程序,而不是記事原本打開這些文件。若是你有別的什麼文本編輯器也能夠,但記事本有時會把代碼的間距弄得很亂。若是你只有記事本程序,那也能用。但若是你有寫字板或者其餘的,我建議你用寫字板或者其餘能夠編輯函數的文本編輯器來編輯函數。
如今咱們來講如何在 Octave 裏定義函數:
這個文件只有三行:
第一行寫着function y = squareThisNumber(x),這就告訴Octave,我想返回一個值,而且返回的這個值將被存放於變量y裏。另外,它告訴了Octave這個函數有一個自變量,就是x,定義的函數主體是y=x2。
如今讓咱們嘗試調用這個函數。輸入squareThisNumber(5),實際上這是行不通的。Ocatve說這個函數未被定義。這是由於Ocatve不知道在哪裏找這個文件。
像以前同樣,咱們使用pwd顯示如今路徑,而後更改路徑cd 'C:\Users\ang\desktop',而後調用這個函數,就會獲得返回值25。
還有一種更高級的功能,若是你知道search path (搜索路徑)這個術語。你能夠把下面這部分做爲一個進階知識,或者選學材料,僅適用於那些熟悉編程語言中搜索路徑概念的同窗。因此若是你想要修改Octave的搜索路徑,你能夠使用addpath 命令添加路徑,添加路徑"C:\Users\ang\desktop";將該目錄添加到Octave的搜索路徑,這樣即便你跑到其餘路徑底下,Octave依然知道會在Users\ang\desktop目錄下尋找函數。這樣,即便我如今在不一樣的目錄下,它仍然知道在哪裏能夠找到SquareThisNumber這個函數。
可是,若是你不熟悉搜索路徑的概念,不用擔憂,只要確保在執行函數以前,先用cd命令設置到你函數所在的目錄下,實際上也是同樣的效果。
Octave還有一個其餘許多編程語言都沒有的概念,那就是它能夠容許你定義一個函數,使得返回值是多個值。這裏就是一個例子,定義一個函數叫:squareAndCubeThisNumber(x)。這說的就是該函數返回值是兩個值y1和y2。y1=x^2,y2=x^3。好比大家可能熟悉的C或C++,一般狀況下,認爲做爲函數返回值只能是一個值,但Octave 的語法結構就不同,能夠返回多個值。
若是我輸入[a,b] = SquareAndCubeThisNumber(5),而後,a就等於25,b就等於125。
因此說若是你須要定義一個函數而且返回多個值,這一點經常會帶來不少方便。最後,我來給你們演示一下一個更復雜一點的函數的例子。比方說,我有一個數據集,像這樣,數據點爲(1,1), (2,2),(3,3),我想作的事是定義一個Octave 函數來計算代價函數J(θ),就是計算不一樣θ值所對應的代價函數值。
首先讓咱們把數據放到Octave 裏,我把設計矩陣設置爲X = [1 1; 1 2; 1 3];(第一列表示x0項,第二列表示訓練樣本的x值),y設置爲y=[1 ; 2 ; 3](這是y軸對應值)。如今咱們設定θ爲[ 0 ; 1 ]。
如今打開預先定義好的函數,請仔細看一下這個函數的定義,確保你明白了定義中的每一步。
如今當我在Octave 裏運行時,我輸入J = costFunctionJ (X, y, theta),它就計算出J=0。
這是由於若是個人數據集x爲[1;2;3],y 也爲[1;2;3]而後設置θ0=0,θ1=1,這給了我剛好45度的斜線,這條線是能夠完美擬合個人數據集的。
而相反地,若是我設置θ等於[0;0],那麼這個假設就是0是全部的預測值,和剛纔同樣,設置θ0=0,θ1=0,而後我計算的代價函數,結果是2.3333。實際上,他就等於1的平方,也就是第一個樣本的平方偏差,加上2的平方,加上3的平方,而後除以2m,也就是訓練樣本數的兩倍,這就是2.33。
所以這也反過來驗證了咱們這裏的函數,計算出了正確的代價函數。完整性檢查證實咱們對定義的代價函數J確實是能夠計算出正確的代價函數的。至少基於這裏的訓練集是成立的。
如今你知道如何在Octave 環境下寫出正確的控制語句,好比for循環、while循環和if語句,以及如何定義和使用函數。在接下來的課程中,將學習向量化,這是一種可使你的Octave程序運行很是快的思想。