分享一下我把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