作者forloricever (sigh...)
看板C_and_CPP
標題Re: [問題] 請問用C求n*n矩陣的eigenvalue及eigenv …
時間Sat Oct 15 21:56:30 2011
※ 引述《DrStein (啤酒肚)》之銘言:
: 請愛用lapack
: 若不會調用,有人已包好:
: http://www.netlib.org/
: 直接用就是。
一個小問題,為什麼不用 MATLAB?
有個矩陣 A, 只要打 eig(A) 就都算完了, 只要花三秒打六個字元。
為了速度? C++ 會比較快? 用 netlib 的 lapack 會比較快?
power method?? 真的嗎??
為了做簡單的矩陣運算 (沒有成千上萬亂寫的 for loop 之類),
用 C++ 根本就是在找自己麻煩浪費時間。
不相信的話就 C++ 隨手寫個矩陣相乘, 例如 A B 各是 2000x2000
(或是矩陣 * 向量, 因為 power method 要一直疊代做這件事。)
然後打開 MATLAB 輸入 a = rand(2000); b = rand(2000); tic; a*b; toc
你很快會發現殘酷的事實...
別忘了把 -O3 打開, 但是,
相信我, 當你看到速度差距後, 很多人再也不會想用 C++ 做矩陣運算
---
WHY? 事實上 MATLAB 底層在做矩陣計算,
他包好了 Intel Math Kernel Library,
(AMD CPU 會用 ACML, 比 MKL 慢一些)
比 netlib 裡的 reference BLAS, Lapack 快多了
(加上多核心, SSE2, SSE3, AVX 等指令集加持, 很多 routine 快了十幾倍有吧...)
那你要算的比 MATLAB 快,就直接的方法就是 C or C++ or fortran 用 MKL,
(在 Linux 下學術用途免費,所以請不要用 Windows)
可是 LAPACK, BLAS 的 API 實在不是普通地難 call...
最後 compile, link 可能還會碰到新的問題。
OPEN CV 我是沒用過, 不過 google 了一下找到了這個
https://plus.google.com/102951334411452742447/posts/KfvpBrSygB2
簡單來說就很慢
至於之前提到的 Eigen,
http://eigen.tuxfamily.org/index.php?title=Main_Page
似乎是最簡單在 C++ 裡得到還不錯地效能。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.116.38.170
推 tropical72:推!! 有時自己寫純粹是相關課程或興趣或簡單問題而已. 10/15 22:05
※ 編輯: forloricever 來自: 118.168.77.199 (10/15 22:25)
→ diabloevagto:友人用過嗎? 10/16 03:13
→ diabloevagto:有 10/16 03:13
推 Bencrie:樓上看起來好像自問自答 XDDD 10/16 12:48
推 chubiei:我實地測過goto BLAS, BLAS, ATLAS和KML的矩陣相乘 10/16 22:04
→ chubiei:而goto BLAS和KML的效率幾乎一樣 ATLAS小輸一點點而已 10/16 22:04
→ forloricever:gotoblas 超快:P 可惜不維護了, 所以 intel AVX 10/16 22:44
→ forloricever:指令集不支援, 在 Sandy Bridge 可能比 ATLAs 慢吧 10/16 22:44
→ forloricever:但在拿這些 blas 編成 lapack 後, MKL 就強很多了... 10/16 22:45
→ uranusjr:Or you can try Numpy + Psyco, it's free everywhere, 10/17 07:36
→ uranusjr:and fast (離題) 10/17 07:36