之前介紹了Armadillo庫裡的Mat矩陣的構造、操作符以及csv的加載和儲存,更加具體的在官方的說明文檔armadillo裡。
矩陣對應行/列(row/col)
擷取矩陣的對應行采用M.row(x),對應列采用M.col(x)(x為對應行标/列标)需要注意矩陣下标是從0開始。
.rows(x,y) 傳回一個子矩陣,該子矩陣為原矩陣取x到y行;
.cols(x,y) 傳回一個子矩陣,該子矩陣為原矩陣取x到y列;
mat55 M;
M.randu();
cout << "M : " << endl << M << endl;
cout << "第0行 : " << endl << M.row(0) << endl;
cout << "第0列 : " << endl << M.col(0) << endl;
mat55 M;
M.randu();
cout << "M : " << endl << M << endl;
cout << "第1行到4行 : " << endl << M.rows(0,3) << endl;
cout << "第2列到3列 : " << endl << M.cols(1,2) << endl;
疊代器
.begin() 傳回是指向第一個元素的疊代器;
.end() 傳回是指向最後一個元素的疊代器;
.begin_col( col_number ) 傳回指定列(col_number )第一個元素的疊代器;
.end_col( col_number ) 傳回指定列(col_number )最後一個元素的下一個元素的疊代器;
.begin_row( row_number ) 傳回指定行(row_number)第一個元素的疊代器;
.end_row( row_number ) 傳回指定行(row_number)最後一個元素的下一個元素的疊代器;
mat55 M;
M.randu();
cout << "M : " << endl << M << endl;
mat::iterator it = M.begin();
cout << "第一個元素 : " << endl << *it << endl;
mat::row_iterator it_row = M.begin_row(0);
cout << "第1行第一個元素 : " << endl << *it_row << endl;
mat::col_iterator it_col = M.end_col(3);
cout << "第4列最後一個元素的下一個元素 : " << endl << *it_col << endl;
矩陣的次方運算
.pow(M, y) 和标準庫中的pow類似,求矩陣M的y次方,最好在前面加上命名空間。
.sqrt(M) 求矩陣的平方根。還是在前面加上命名空間,養成好的習慣,這樣在遇見兩個相同函數名稱時候,就可以使用命名空間進行差別。
mat55 M;
M.randu();
mat M1 = arma::pow(M, 2);
mat M2 = arma::sqrt(M);
矩陣中逐個元素進行操作
.for_each(lambda_function) 對矩陣中的每個元素進行操作。其中lambda函數需要自己寫。
當時用這個元素主要是在matlab中,要将矩陣A中每一個元素與一個max值比較,傳回元素為0/1矩陣,作者就找到了這個方法,可能大家有更好的方法,希望可以評論區交流。話不多說,直接上代碼。
mat55 M;
M.randu();
//定義h_max值
double h_max = 0.3;
//為了降低記憶體消耗,for_each是直接操作矩陣本身,是以建立一個矩陣拷貝,友善觀察對比。
mat M_compare = M;
//lambda函數,捕獲h_max,相當往函數裡傳入h_max參數,val為矩陣中的值,是以類型為elem_type。
M_compare.for_each([h_max](mat::elem_type & val) {val = val < h_max ? 1 : 0; });
對矩陣索引号檢索
sub2ind( size(M), row, col ) 傳回一個指定元素針對矩陣M按列線性索引下标。下面的代碼傳回的是将M矩陣按照列順序排列為一列以後,矩陣M的第一行第二列元素在該列中的索引值。
mat55 M;
M.randu();
double num = M(0,1);
uword i = sub2ind(arma::size(M), 0, 1);
矩陣的類型轉換
conv_to< type >::from( X ) 将X類型矩陣轉變為type類型矩陣, 也可也将std::vector 轉為 arma::mat / arma::vec
mat55 M;
M.randu();
umat uM= arma::conv_to<umat>::from(M);
通路指定元素生成列向量
M.elem( vector_of_indices ) 通路vector_of_indices中指定的元素。M被看作一個列向量,M的元素按列排序。由find()函數生成)。指定元素的集合被視為列向量。該函數傳回一個列向量。
也可根據vector_of_indices改變原矩陣M的中的值。
mat55 M;
M.randu();
vec q = M.elem(find(M > 0.5));
mat55 M;
M.randu();
uvec indices;
indices << 2 << 3 << 6 << 8;
M.elem(indices) = ones<vec>(4);
持續更新
如有問題,歡迎各位指正。