Showing posts with label Matlab. Show all posts
Showing posts with label Matlab. Show all posts

Sunday, September 24, 2006

Dynamic Plot on Python

之前介紹 Python 在複雜網路模擬實驗的應用時,曾提到用 matplotlib 來繪製該實驗的圖表。其模仿 Matlab 的繪圖功能,用起來方便,所繪製的圖也在水準之上。有圖有真相,這就秀秀用 matplotlib 為該實驗繪製的兩張圖表:

學長看了後提議:某些實驗邊跑模擬的同時,也把產生的數據動態繪出,效果會更好。

憑著殘留印象,我把相關用法的說明再次翻出來研讀,寫了下列的 Python code 來測試:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
"""
Interactive random dot plotting.
 
This module demonstrates the usage of the interactive mode of matplotlib.
It is suggested to run this code under ipython. Details please see
http://matplotlib.sourceforge.net/interactive.html
 
 
Usage
=====
 
You can run this module in three ways:
 
    1. As a stand-alone application with GUI
    2. Run it on command line with a -d parameter to just generate the
       image with a specific format. (without GUI)
        * ref. http://matplotlib.sourceforge.net/backends.html
    3. Run it on ipython to call loop() many times
 
Examples
--------
You can simply run this module as a stand-alone application with GUI
 
    > irandot.py
 
Or just generate a image file with a specific format:
 
    > irandot.py -dAGG     # generate PNG file
    > irandot.py -dPS      # generate PS file
    > irandot.py -dSVG     # generate SVG file
    > irandot.py -dEMF     # generate EMF file
 
Running it with ipython is strongly suggested.
 
    In [1]: cd I:\trial\python  # suppose the module is put in I:\trial\python
    ...
    In [2]: run irandot.py
    ...
    In [3]: loop(50)
    ...
    In [4]: loop(20)
    ...
 
"""
__author__ = "Jiang Yu-Kuan, yukuan.jiang(at)gmail.com"
__date__ = "2006/09/24~2006/9/25"
__revision__ = "1.3"
 
from pylab import *
 
 
def dot_gen(dots=2):
    """A random dot generator.
 
    - dots: number of dots with plotting each loop
    """
    i = 0
    while 1:
        l, = plot(rand(dots), rand(dots), 'go')
        #setp(l, alpha=1,
        #    markerfacecolor='w', markeredgecolor='g', markersize=10)
        i += dots
        yield i
 
 
def loop(n=1):
    """Repeat dot plotting of n times."""
    g= dot_gen()  # gets a dot-plotting generator
    for i in xrange(n):
        print g.next(),
 
 
if __name__ == '__main__':
    if not isinteractive():
        ion()  # turns interactive on
 
    loop(50)
    savefig('irandot')
 
    try:
        __IPYTHON__
    except NameError:
        print "\nNOT on IPython"
        show()
    else:
        print "\nOn IPython"
  • 行 59 是真正畫綠點的指令。
  • 行 75 是關鍵所在,它切換 matplotlib 到互動模式。
  • 行 80~86 是為了在 IPython 下不要執行 show()

這個程式取名為 irandot.py ,可以當作一般的執行檔,點兩下檔名執行。執行時我們可以看到隨機產生的座標,一點一點地在座標圖上冒出。以下是其 screenshot:

此外,強烈建議在 IPython shell 下執行 irandot.py:

  1. 開啟 IPython shell
  2. 在 IPython shell 敲進 "cd I:/trial/python" 來切換到存放 irandot.py 的目錄。
  3. 鍵入 "run irandot" 後就會繪出類似上面那幅 2*50=100 個綠點的隨機圖。
  4. 再鍵入 "loop(100)" ,程式會陸續再冒出 2*100 = 200 個綠點。
  5. 高興的話,可以一直下 loop 、改變參數,讓綠點繼續冒下去。

後記:

  • 之前發現無論在 IDLEPythonWin 下,圖表反覆繪製幾次,程式就會掛點的問題。碰巧藉這次測試,找到解法了。作法很簡單,只要改用 IPython shell 即可。
  • 如果你也是裝 Python Enthought 來用,那 IPython 已經在你電腦了。
  • 目前的經驗,開發過程使用 IDLEPythonWin 順手,測試寫好的程式則用 IPython 較方便
  • 如果嫌上述開發環境太陽春,我推薦 SPE
  • Python Enthought 附的 matplotlib 有些小 bug 。可以到這裡下載新版 matplotlib 安裝程式來更新。其底層還用到 NumPy ,可到這裡下載安裝。

Saturday, January 07, 2006

Scientific Computation Tools

作科學研究常需要作些計算,可以幫我們作這些運算的軟體很多,其中最讓我印象深刻的是 MathematicaMatlab 。它們用起來方便,功能更是不在話下,但就是要花錢買,而且還不便宜。所以我就找了一些功能雖沒那麼完整,但還算堪用的軟體來試試,重點是都是免費的。例如用於代數、符號運算的 Axiom, Maxima, Yacas 等。方便用於數值、矩陣運算的 FreeMat, Octave, RLaBPlus, SciLab 等。

Mathematica 是一套電腦代數系統(computer algebra system, CAS)。我們可以利用它來作因式分解,及微積分運算,值得注意的是,這些運算單元可以用代數符號表示就好,不用非得要是數值,因為它有精湛的符號運算能力。例如:我們可以要求它作 a^2 - b^2 的因式分解,而得到 (a-b) * (a+b) 這個答案。

Matlab 則對數值運算比較專門。其名字就是 Matrices Lab 的簡稱。可見它擅長在大量的矩陣運算場合發揮。我們把這類的軟體稱為數值運算環境(numerical computing environment, NCE)。

免費的 CAS ,這裡推薦 Maxima ,安裝之前,可以先到這裡試用一下,為了用起來更賞心悅目,記得順便把 wxMaxima 裝上。如果你想玩玩 Java 版的 CAS ,那就試試 Yacas ,介面雖陽春了些,但語法接近 C 語言,可能會讓你感到親切吧,可以偷喵一下 Yacas 的使用範例。此外 Axiom 也是不錯的選擇(它的 Windows 版本沒有繪圖模式,比較難看),你也可以先到 Axiom wiki's Sandbox 試用看看,再決定要不要裝來用。 MaximaYacas 的 license 是 GPL 的; Axiom 則是 Modified BSD License

在逛 Axiom 網站時,還意外發現了 GNU TeXmacs 這個 wysiwyw 的科學文件編輯平台,可惜其 Windows 版的 porting 不大穩定,且無法正常處理中文。也許可以改而安裝其掛在 Cygwin 下的版本,有興趣的話可以試試。

要作數值及矩陣方面的科學計算,前述的 CAS 為主的軟體雖然也有支援部份,但總不是那麼方便。所以我另外找了提供專門數值運算環境(numerical computation enviroment)的免費軟體。 OctaveSciLab 是其中較有名: Octave 雖然是 GPL 授權的,但其 Windows 版要跟 Cygwin 綁在一起執行,不是那麼方便; SciLab 雖個人使用也是免費的,但它有專屬的授權方式,在商業用途有些限制,且說明文件的安排不是那麼好。我還另外試了一套叫 FreeMat 的,它是 MIT Type licence 的,說明文件淺顯易懂, Windows 的支援也不錯。另外還有 RLaBPlus 這套 RLaB 的後繼者,其 script language 的語言正交性較好,很有發展潛力,目前只有 Linux 版本。

Monday, February 02, 2004

The cocktail party problem

在一個雞尾酒會場上,假設有人事先在三個不同的位置分別安置了三支麥克風,意圖監聽大家的談話。由於酒會是在開放的場所舉行,麥克風錄到相互混雜的嗡鬧聲,很難好好地監聽出想要的情報。

想像你是當事人,面對好不容易錄下來的東西竟然無法派上用場,該如何是好呢?

為了解決這個難題,我們必須由各個麥克風錄到的資料中,把想要的聲音解析出來,這就是所謂的 Blind Source Separation, BSS 。

本學期生醫訊號處理(Biomedical Signal Processing)課程的 term project ,就是要利用獨立分量分析(independent component analysis, ICA)來達到 BSS 的效果。老師雖然沒限定大家實作的工具,但面對如此紛雜的矩陣及行列運算,不用 Matlab 這種好用的工具,那真是自找麻煩。以下是我完成專案的 Screen Shot:

程式一開始先在左上角的選單決定要載入的 Blind Sources ,其波形會在左邊的畫布顯示。決定好參數,並按下 Analysis 扭,我們要的訊號波形會出現在右邊的畫布。除了可以選取個別的波形來觀察外,我們還可以聽聽分解前的混音,及分解後的清音。

以這次拿來測試的聲音訊號來說,原始訊號混雜著男高音演奏、交響樂曲、搖滾歌唱、新聞撥報等四種聲音。分解出來後果然是原音重現,乾乾淨淨的,一點混雜都沒有,效果好到令我大吃一驚。

在 Pattern Recognition 課堂上,蔡文祥老師一再地提醒我們,資訊系的學生所受的訓練中,會傾向於利用合成(synthesis)的方式來解決問題,以後在解題時要是遇到瓶頸,不要忘了還有個很有用的方式,那就是利用分析(analysis)手段來處理問題。雖然當時他的目的是要強調他上課所教授的東西不只是抽象的數學式子,而是很實用的工具,還是無礙於此時此刻,在我內心響起共鳴。

Tags: [] [] [] [] [] []