Re: [問題] 請問用C求n*n矩陣的eigenvalue及eigenv …

看板C_and_CPP (C/C++)作者 (sigh...)時間14年前 (2011/10/15 21:56), 編輯推噓3(309)
留言12則, 6人參與, 最新討論串4/4 (看更多)
※ 引述《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

10/15 22:05, , 1F
推!! 有時自己寫純粹是相關課程或興趣或簡單問題而已.
10/15 22:05, 1F
※ 編輯: forloricever 來自: 118.168.77.199 (10/15 22:25)

10/16 03:13, , 2F

10/16 03:13, , 3F
友人用過嗎?
10/16 03:13, 3F

10/16 03:13, , 4F
10/16 03:13, 4F

10/16 12:48, , 5F
樓上看起來好像自問自答 XDDD
10/16 12:48, 5F

10/16 22:04, , 6F
我實地測過goto BLAS, BLAS, ATLAS和KML的矩陣相乘
10/16 22:04, 6F

10/16 22:04, , 7F
而goto BLAS和KML的效率幾乎一樣 ATLAS小輸一點點而已
10/16 22:04, 7F

10/16 22:44, , 8F
gotoblas 超快:P 可惜不維護了, 所以 intel AVX
10/16 22:44, 8F

10/16 22:44, , 9F
指令集不支援, 在 Sandy Bridge 可能比 ATLAs 慢吧
10/16 22:44, 9F

10/16 22:45, , 10F
但在拿這些 blas 編成 lapack 後, MKL 就強很多了...
10/16 22:45, 10F

10/17 07:36, , 11F
Or you can try Numpy + Psyco, it's free everywhere,
10/17 07:36, 11F

10/17 07:36, , 12F
and fast (離題)
10/17 07:36, 12F
文章代碼(AID): #1EcP4Hnk (C_and_CPP)
文章代碼(AID): #1EcP4Hnk (C_and_CPP)