看板 C_and_CPP 關於我們 聯絡資訊
分享一下我把matlab轉成C++的經驗 希望對原PO有幫助 我一開始就打算使用額外的函式庫幫我做矩陣的運算 我先使用Eigen library 我先從下面的對照表看起 http://eigen.tuxfamily.org/dox-devel/AsciiQuickReference.txt 先看我大概需要哪些函數 並且先紀錄下來 然後畫出架構,從資料下手,從input開始逐步往下轉 但是無法避免的是你可能需要自己寫函數來輔助工作 我是這樣去寫: MatrixXd function_name(const MatrixXd& input1, const MatrixXd& input2, ...) 只是C++很多時候不如MATLAB方便 必須多注意,怎樣避免複製資料,我一開始寫常常亂assign新的變數(囧) 我後來轉去用armadillo 我認為它真的根matlab比較接近 只是需要好的blas, lapack庫幫助,不然效能真的不佳 命令參考: http://arma.sourceforge.net/docs.html#syntax 可以看出armadillo跟MATLAB比較接近 函數寫法: Mat<double> function_name(const Mat<double>& input1, const Mat<double>& input2,..) PS: Mat<double> = mat 其他部份基本上同eigen,這兩者都可以用template去構築generic function 簡單比較兩個與MATLAB的指令 (排版有點亂,請見諒) c: constant, A:n by n matrix, B: n by p matrix, V: n by 1 vector MATLAB Eigen Armadillo c*A c*A A.array()*c c*A A*B A*B A*B A*B A.*B A*B A.array()*B.array() A%B column sum sum(A,1) A.colwise().sum() sum(A,0) column mean mean(A,1) (A.array() / A.rows()).colwise().sum() mean(A,0) inverse inv(A) A.inverse() A.i() solve linear A\B A.solve(B) A.solve(B) equation PS:Eigen提供數種解法可選 take diagonal diag(A) A.diagonal() A.diag() elements row bind [A;B'] block(?) join_cols(A,B.t()) randomly randperm(V) rand_shuffle(V.data(), V.data()+V.size()) shuffle(V) permute elements ?????? V(V<0) = 0 (V.array() < 0).select(0, V) arma::max(V, zeros<mat>(V.n_rows, 1)) colwise min min(A,[],1) A.colwise().min() min(A,0) location of [tmp,loc_r] = min(A) unsigned int loc_c, loc_w uword loc_c, loc_r minimum [~,loc_c] = min(tmp) A.minCoeff(&loc_r, &loc_c) A.min(loc_c,loc_r) A(loc_r(loc_c),loc_c) is min A(loc_r,loc_c) is min 同左 element-wise comparison就不提...以上這些是我比較常用到的指令 個人覺得armadillo提供比較多輕易使用的函數,你可以自由選擇你喜歡的函式庫 順便一提,我的測試是 (以下測試都有使用openmp) armadillo with openblas比Eigen還快 armadillo with intel MKL 跟 Eigen with intel MKL 基本上armadillo快一點 armadillo預設(不支援openmp) 比 Eigen慢非常多 以上提供你轉換code的參考 另外,可以偷問Eigen or armadillo有類似diff的函數嗎XDD -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.164.225.219 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1398263257.A.7BE.html ※ 編輯: celestialgod (218.164.225.219), 04/23/2014 22:32:40
celestialgod:如果是寫MEX function,則arma有比提供比較好的API 04/23 22:33
※ 編輯: celestialgod (218.164.225.219), 04/23/2014 22:38:36
damody:推~ 04/24 01:19
damody:我是因為我的問題都是sparse matrix所以一定要用Eigen 04/24 01:20
damody:diff 我有實作過 但eigen 沒看過 04/24 01:22
damody:這裡面有diff 04/24 01:22
celestialgod:armadillo也有sparse matrix喔~~ 04/24 08:13