Octave 介紹與學習


這裏寫圖片描述


一,簡介

1.1 Octave是什麼?

Octave是一款用於數值計算和繪圖的開源軟件。和Matlab一樣,Octave 尤其精於矩陣運算:求解聯立方程組、計算矩陣特徵值和特徵向量等等。

1.2 Octave的適用對象

Octave和Matlab被工程人員和科研人員廣泛使用來進行各種工業和學術上的數值計算和仿真。例如,NASA 使用它來開發飛行器的對接系統;Jaguar Racing使用它來可視化和分析從 F1 賽車傳來的數 據;Sheffield大學用它來開發用於識別癌細胞的軟件。Octave這樣的軟件讓編寫數值處理程序變得簡單,並提供數據可視化的多種方式。

1.3 Octave 的下載與安裝


二,簡單計算

2.1 Octave最簡單的使用方式就是像使用一個計算器一樣在命令提示符下輸入相應的計算式。Octave能識別通常的計算表達式。例如,在終端輸入

octave:##>2+2

並按回車鍵, 你將得到以下的結果ans=4

各種計算符號的優先級與常規的一致,比如括號有最大優先級,其次爲乘方,其次爲乘除運算,最後爲加減運算

2.2 內建函數

Octave中有很多內建函數,可以通過輸入函數名和括號中的輸入參數來調用函數,例如:

octave:##> exp(1)
ans=2.71813

又如另一個更長的表達式:計算 1.2 sin(40◦ + ln(2.42)), 輸入

octave:##>1.2*sin(40*pi/180+log(2.4^2))
ans=0.76618

其中基本的數學函數有:sin, cos, tan, log, exp, abs, floor, ceil等;

如果你要退出 Octave, 只需要在命令提示符下輸入 quit 或者 exit 即可。


三,Octave變量

3.1 變量

同C++,Java等變成語言一樣我們可以定義變量,但Octave 爲解釋性語言。因此Octave中變量的類型是不用聲明的,但Octave中變量名是區分大小的,即變量a和變量A是不同的變量。

octave:##> deg=pi/180

deg=0.017453

如果你需要從當前的變量空間中刪除某個變量,clear命令能移出所有的變量,或者移出某個特定變量, 如:

clear name 將移出名爲 name 的某個變量。

3.2 載入和保存數據

當你退出Octave的時候,你將丟失你所創建的變量。如果你需要在工作的中途退出Octave,那麼你可以保存當前會話的數據並在之後重新載入它。如果你輸入

octave:##> save anyname

這將整個工作空間上的變量存儲到當前目錄下一個名爲anyname.mat 的文件中 (注意.mat是Octave自動添加的)。這樣你可以退出Octave,之後重新啓動Octave程序,通過輸入

octave:##> loadanyname

將重新載入之前保存的命名空間,並從你中斷的地方重新開始工作。同樣的,你可以載入或者保存特定的變量。格式爲

octave:##>save filename var1 var2 ...

例如,如果你想存儲deg變量,那麼你可以輸入

octave:##> save degconv deg

這樣將deg變量存儲於名爲degconv.mat的文件中,你可以通過以下命令重新載入變量

octave:##> loaddegconv

Octave 同樣能從文件中導入數據 , 這樣的功能在你使用其他的數據來源進行畫圖或者計算的時候變得非常有用。

例如:

X=load(‘featureX.txt’);

3.3 獲得幫助

如果你不清楚某個命令或者函數的用法,可也用help命令來獲得其詳細的用法。

help commandname

例如:help plot

3.4 分號和隱藏結果

分號在通常的編程語言中被用來表示程序塊或者單個語句的結束。在 Octave 中分號不是必需的,但它也有一個特殊的功能。我們目前的例子中,我們只要輸入一個 Octave 命令並不以分號結尾的話,Octave 總 會將語句執行的結果隨即顯示出來。但是,如果我們在一行語句的末尾添上分號,Octave將不會顯出相應的 結果。


四 數組和向量及矩陣

前面介紹過Octave的優勢就是可以很方便的進行矩陣的相關計算。

4.1 構造向量

構造矩陣或者向量的方法有很多。其中最直接簡單的方法就是在一個方括號 [] 中給出其元素,例如

octave:##> a=[1 4 5]
a=1 4 5
octave:##> b=[2,1,0]
b=2 1 0
octave:##> c=[4;7;10]
c=4
7
10

在方括號中由空格或者逗號隔開的一組數據被定義爲行向量; 而由分號或者回車隔開的一組數據被定義爲列向量。你可以通過已經定義的向量來定義新的向量,例如

octave:##> a=[1 4 5]
a=1 4 5
octave:##> d=[a 6]
d=1 4 5 6

4.2 冒號表達式

利用冒號能夠非常方便的創建一些特殊的向量

octave:##> e=2:6
e=2 3 4 5 6

冒號表達式的規則是告訴octave創建一個以第一個數字開始並以一遞增至第二個數的向量。在第一和第 二個數之間可以插入第三個參數來聲明向量中元素之間的遞增量,形如 a : b : c。

4.3 向量構造函數

zeros(M,N) 創建一個MXN的全零矩陣

ones(M,N) 創建一個MXN的全一矩陣

linspace(x1,x2,N) 創建一個N個元素的向量,均勻分佈於x1和下x2

eye(M) 創建一個MXM的單位矩陣

rand(M,N) 創建一個MXN的矩陣,元素爲隨機值

4.4 向量中的元素操作

向量中的元素通過括號(),而第一個元素的編號爲1, 而不是像C或者 C++那樣從0開始。例如

octave:##>a=[1:2:6 -1 0]
a=1 3 5 -1 0

我們可以通過以下命令訪問到該向量的第三個元素

octave:##> a(3)
ans=5

冒號的表示法同樣可以用於聲明向量中的元素的範圍

octave:##>a(3:5)
ans=5 -1 0
octave:##>a(1:2:5)
ans= 1 5 0

4.5 向量的計算

將一組數據存入一個向量之後能夠使用很多的Octave函數來進行計算。在C++中如果你想進行相同的計算,例如每個元素乘以2, 你需要使用for循環來對每個元素操作。在Octave中雖然也可以使用for循環來實現,但是Octave本身由有簡單的向量操作方式。

向量中每個都乘以一個數可以通過對該向量乘以一個數來實現。以之前定義的 a 向量爲例:

octave:1> a=[1:2:6 -1 0]
a= 1 3 5 -1 0
octave:2> a*2
ans=2 6 10 -2 0

對向量中所有元素都除以一個數的操作與乘法類似。使用+−算符,你同樣可以對該向量中的每個元素都加上或者減去一個數值。兩個向量的相乘遵循矩陣的乘法法則,向量乘法並不是對應元素的相乘。如果要進行對應元素的乘除法,你可以使用.* 以及./ 算符 注意每個算符前的 ‘.’ 表示爲一個元素對元素的計算 。例如:

octave:3> b=1:5
b= 1 2 3 4 5
octave:4> a.*b
ans=1 6 15 -4 0

逐個元素的乘方計算同樣也很有用。該計算的算符爲,例如

octave:5> b.^2
ans =1 4 9 16 25
octave:6> 2.^b
ans =2 4 8 16 32
octave:7> a.^b
ans = 1 9 125 1 0

只要兩個向量又相同的大小和形狀,它們就可以進行元素之間的(element-by-element) 加減乘除和乘方運算。

4.6 函數操作向量

前面講到過的函數也是可以適用於向量。

例如:exp, log,abs等

octave:##>abs([-1 2 -3])
ans=1 2 3

此外max, length,size, sum, mean, std, floor, ceil等函數也許要掌握,可以通過help命令獲得詳細用法。

4.7 矩陣的轉置

一個向量的轉置將其由行向量轉爲列向量或者由列向量轉換爲行向量。矩陣的轉置將其行和列交換。在數學上,矩陣A的轉置表示爲AT 在octave中轉置操作用上引號實現:

octave:6> A=[5 7 9;-1 3 -2]
A= 5  7  9
-1  3 - 2
octave:7> A'
ans =5   -1
7   3
9   -2

此外inv求矩陣的逆,det求矩陣的特徵值,trace求矩陣的跡。


五 畫圖

Octave通過調用另一個開源軟件 GNUPLOT來實現非常豐富的畫圖功能。最基本的畫圖命令是 plot(x,y), 其中 x,y 分別爲橫軸和縱軸數據。可以進行相應地顏色和樣式的選擇如:’ro’代表們紅色圓圈,’b.’代表藍色點點等;可以通過title,xlabel,ylabel添加標題以及x,y軸名稱;legend命令爲該圖片添加相應的圖例。

5.1 如果你想保存當前的圖片內容並將新創建的圖片層疊到原圖片上,你可以通過使用 hold on命令來實現。使用該命令,我們可以實現在同一幅圖上呈現由兩個plot 命令繪製的線條。

octave:##> x=linspace(-10,10);
octave:##> plot(x,sin(x),’r-’);
octave:##> hold on
octave:##> plot(x,sin(x)./x,’b*’)
octave:##>title(‘Figure’)
octave:##>xlabel(‘X’)
octave:##>ylabel(‘Y’)
octave:##>legend(‘sin(x)’,’sin(x)/x’)

這裏寫圖片描述

5.2 subplot(2,3,2)表示在一個格子中畫圖。因此該條語句的意思是分成一個2X3的格子,並在第2個格子裏畫圖;其中子格的順序爲從左到右從上到下遞增,即

1 2

3 4

5 6

例如:

octave:##> x=linspace(-10,10);
octave:##> subplot(2,1,1)
octave:##> plot(x,sin(x));
octave:##> subplot(2,1,2)
octave:##> plot(x,sin(x)./x)

這裏寫圖片描述

5.3 多幅圖片可以用figure命令來實現.

5.4 繪製曲面

octave:##> x=2:0.2:4;
octave:##>y=1:0.2:3;
octave:##>[X,Y]=meshgrid(x,y);% make the grid
octave:##> Z=(X-3).^2-(Y-2).^2;
octave:##> subplot(2,2,1);surf(Z);title('surf')
octave:##> subplot(2,2,2);mesh(Z);title('mesh')
octave:##> subplot(2,2,3);meshz(Z);title('meshz')
octave:##> subplot(2,2,4);contour(Z);title('contour')

這裏寫圖片描述


六 Octave腳本

如果你有一些重複輸入的命令的,你可以將這一系列的命令存入一個Octave 腳本之中。這種包含 Octave 命令的文本文件是 Octave 程序的基本形式。當你在 Octave 中執行這樣的腳本的時候,其效果與將這些命令一行行輸入 Octave 中的效果是一樣的。而且當你對一系列要輸入 Octave 的命令不是很拿的準的時候,在一個腳本中修改這些命令會比在 Octave 終端中重新調出及修改命令要簡單方便許多。

Octave的腳本是普通的文本文件,但是他們需要有一個.m 的後綴 (e.g.run.m)。因此,它們通常也被稱爲M文件。除去後綴的文件名部分是你在執行該命令時需要向 Octave 終端輸入的部分。

你可以在任何的文本編輯器 (如,emacs, vi,notepad) 中創建並編輯一個腳本文件。在Octave中可以通過以下命令

octave:##> edit

在新窗口中調出文本編輯器emacs。如果你想編輯一個已存在的腳本,你可以在edit命令後加上腳本的名字。例如,比如你有個名爲 run.m的腳本,輸入edit run 將調出編輯器並打開該文件供你編輯。

然後在 Octave中輸入 run執行腳本:

octave:##> run

Octave將運行該腳本中的命令並得到相應的結果。


七 控制語句

到目前爲止我們所看到的程序或者表達式都是一些簡單的順序執行的操作。向量和矩陣的使用能夠讓Octave執行更加高級的計算,但是要實現更加複雜的功能,我們還需要一些標準的程序語言。Octave提供了通常的循環和選擇語句。其語法類似於我們熟知的C,C++,Java等編程語言。

在這裏僅僅舉一個例子:

octave:##> x=1;
octave:##> while 1+x>1
x=x/2;
end
octave:##>x
x=
1.1102e-16

八 Octave函數

Octave中的腳本能實現一些簡單的程序,但是比腳本更加強大的是用戶自定義函數。自定義函數能夠讓你在命令行、其他函數中和腳本中調用。

在Octave函數中參數是通過值傳遞的而不是通過reference傳遞並能返回多個返回值。Octave函數如同腳本一樣,是寫入一個純文本文件中的,不同的是函數文件的第一行遵循如下的格式

function[output1,output2,…]=name(input1,input2,…)

每個函數都卸載了不同的M文件中,而且該M文件名不須與函數名一致。例如名爲sind()的函數必需被定義在名爲sind.m的M文件中。每個函數接受一定的參數輸入並輸出一定的數值。

當你需要重複性的執行一定表達式,這表明你需要將這與的操作封裝爲一個函數。封裝爲函數之後 Octave 將更加易用,增加了代碼的可讀性並可以供他人使用。

我們可以創建這麼一個函數,創建一個名爲 sind.m 的 文本文件幷包含以下內容:

function s=sind(x)
% SIND(x)Calculates sine(x) in degrees
s=sin(x*pi/180);
end

然後就可以使用該函數了,例如:

octave:##> sind(0)
ans=0
octave:##> sind(45)
ans= 0.7071
octave:##> t=sind([30 60 90])
t= 0.50000.8660 1.0000

整理自 推酷http://www.tuicool.com/articles/NFV3mu

imbenben

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章