Glophy Zone Backup

從Matlab 到Python PDF 列印 E-mail
作者 曾正男   
2010/03/06, 週六

這幾年來越來越多人使用Python 語言取代Matlab 作為研究與應用的主要程式,Python 除了容易上手的特性,在動態圖形化的表現實在讓人驚艷。對於習慣Matlab 語法的使用者來說,若要轉換程式到Python 語言難免還是會有遇到不同思考邏輯的地方,因此,我特別撰寫這篇文章,提供從Matlab 轉換到Python 的使用者一個學習上的參考。

第一個差異點在於Python 的index 起始值是從0 開始,這部份習慣撰寫C 語言的人並不會不習慣,但是Python 還有負號的index。多了負號的index 讓Python 在撰寫程式上又多了一些彈性。因為起始值從零開始,所以Python 的index 是落在資料與資料之間,而不是落在資料之上。例如,A = range(5), 得到A = [0,1,2,3,4]。這時,A[1:2]的答案是[1] 而不是[1,2],這點和Matlab 的習慣非常不同。 

再來是Python雖然和Matlab 一樣是一個高階的直譯式語言,但是Python 不是專為矩陣計算設計的軟體,為了配合Python 更廣泛的應用特性,要利用Python 處理數值或是矩陣計算時,最方便的方法還是使用Numpy 套件。這個套件裡所定義的numpy.core.defmatrix.matrix 型別會比較靠近。先別被這麼長的型別名稱給嚇到了,使用mat(A) 指令,就可以把 array 型別的A 陣列轉成線性代數中熟悉的矩陣及其運算。

在運算子方面"^" 在Matlab 中是次方的意思,可是在Python 中的次方是**。例如2 的3 次方在Python 中的打法為2**3。"^"在Python 中並沒有完全被捨棄,而是作為位元運算的xor ,例如2^3=1,因為2 的二進位表示為0010,3 的二進位表示為0011,因此0010 與0011 的xor 是0001 其值為1。在Python 中這類不需要經過二進位轉換就可以直接做二進位計算的位元算子還有& (and)以及 | (or)。

在Matlab 中常用的型別有整數,浮點數,布林值,字元,字串,矩陣(或是陣列)以及異質陣列(cell),除了異質陣列之位,多數的型別都是一般電腦語言常見的。Phthon 中多了一些特別的型別使得在程式撰寫上,又多了一些彈性。首先,Phthon 中的串列(List)等同於Matlab 中的異質陣列,串列裡的元素型態不需拘泥於同一種格式,串列又可視為陣列的一種擴充,只是在型態上更具彈性。彈性有時是好事,但過度的彈性又會讓程式撰寫人員一不小心就製造一個難以糾舉的臭蟲(bug),因此在Python 中特別出現一種無法更改內容的型別稱為元組(tuple)。在Python中串列是用中括號[... ] 表示,而元組是用小括號(... ) 表示。無論是串列或是元組,都是一種有序的型別,意思是可以用指標(index) 去讀取特定位置所儲存的資料。Python 的另一個特別的型別叫做辭典,辭典是一個無序的資料型別,用大括號{... }來表示,並且其中所儲存的資料都必須依附在一個金鑰底下,要讀取辭典內的資料必須用金鑰來開啟。例如 A = {'name': 'Glophy', 'age': 18, 'url': 'http://glophy.com' }。要讀取A 辭典內的資料,不能用A{1}, A{1:2} 這種方式,因為辭典是一個無序的資料型別。A 中的name, age 以及url 我們稱為金鑰,金鑰後面加一個冒號(:),冒號後面所接的,就是存放在這金鑰所保管的箱子裡的資料。 

在迴圈的控制上,Python 省去了end 這種標示迴圈結尾的用法,並且在迴圈的第一行,用到":" 符號代表迴圈的開始。少了end 程式要如何判別呢?Python 用敘述對齊的方式,來判斷迴圈是否結束。例如,

for i in range(5): 

       print i

print 'end'

這裡for 迴圈和最後一行的print 是同級的,迴圈只做到第一個print 指令。

在Matlab 裡我們用'%' 符號代表程式中的註解,在Python 裡,我們用'#' 代替。  

 

最後更新 ( 2010/03/18, 週四 )
 
< 前一個