最近在研究是否有軟體能夠取代MATLAB,因為專業授權太貴了,一般業界除非演算法部門不然也應該不會有授權,因此萌生了尋找替代軟體的方案。
搜索了一下,有幾個軟體或是套件滿適合的,我主要是在做影像處理以及訊號處理,也常常需要繪圖,因為使用MATLAB軟體好幾年了,語法也比較熟悉MATLAB,因此找語法相近的
1. GNU Octave: 指令上來說應該是最貼近MATLAB原生語法的軟體,我在Windows 10安裝Octave with GUI,網址是:https://ftp.gnu.org/gnu/octave/windows/ ,可以直接下載exe 安裝檔,如果是Ubuntu的則需要自行configure並且compile原始碼。 (sudo apt-get install cotave下來的版本不是最新的,會有一些package不能用,例如Image)
網路上有找到編譯的方法,如下網址:
http://askubuntu.com/questions/645600/how-to-install-octave-4-0-0-in-ubuntu-14-04
我針對了矩陣運算進行測試,讓他跑了下面的運算,以我的電腦Intel i5 7200U的CPU來跑
>> b = rand(10⁴,10⁴);>> a = rand(10⁴,10⁴);>> tic;c = a*b;toc;Elapsed time is 116.317 seconds.
而MATLAB的結果
>> b = rand(10⁴,10⁴);>> a = rand(10⁴,10⁴);>> tic;c = a*b;toc;Elapsed time is 34.349096 seconds.
MATLAB還是比較快,因為MATLAB背後使用的是Intel的MKL (Math Kernel Library)
而Octave背後則是使用openBLAS
或許是這邊出了問題。不過Octave免費,也有很多人持續的貢獻,我想簡單跑一些簡單的作業是可以的。
此外,Octave非常不適合用for loop,雖然MATLAB也一樣,不過Octave用for迴圈會讓效能更加下降。
2. Scilab — 是一個由法國國立計算機及自動化研究院開發的一個數值運算軟體,其大部分的語法與MATLAB類似,只有少部分不同。
值得一提的是,他的背後運算模型也是使用MKL ,因此速度上我認為比Octave快。
原本想要跑一個和上面一樣的範例,不過因為目前他的stack size似乎有限制,因此要先經過
stacksize(‘max’)
這個步驟讓我們把stack memory開到最大。
有關於stack and heap memory的問題可以看這篇和這篇
不過很遺憾的,目前仍然不能跑,還是出現stack memory不足的問題,如果可以跑測試,我會再補上。
目前先跑1000 x 1000 rand matrix
→stacksize(‘max’);
→a = rand(1000,1000);
→b = rand(1000,1000);
→tic;c = a*b;toc
ans =
0.043
MATLAB
>> a = rand(1000,1000);
>> b = rand(1000,1000);
>> tic;c = a*b;toc
Elapsed time is 0.042675 seconds.
Octave
>> b = rand(1000,1000);
>> a = rand(1000,1000);
>> tic;c = a*b;toc
Elapsed time is 0.11033 seconds.
可以看到還是Octave效能最差
這篇文章主要以數值運算軟體為主,當然還有最近更熱門的Python + numpy + scipy,不過下次再分享吧。