天天看點

C++線性代數庫:Armadillo(犰狳) 使用初體驗(二)矩陣對應行/列(row/col)疊代器矩陣的次方運算矩陣中逐個元素進行操作對矩陣索引号檢索矩陣的類型轉換通路指定元素生成列向量持續更新

之前介紹了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;
           
C++線性代數庫:Armadillo(犰狳) 使用初體驗(二)矩陣對應行/列(row/col)疊代器矩陣的次方運算矩陣中逐個元素進行操作對矩陣索引号檢索矩陣的類型轉換通路指定元素生成列向量持續更新
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;
           
C++線性代數庫:Armadillo(犰狳) 使用初體驗(二)矩陣對應行/列(row/col)疊代器矩陣的次方運算矩陣中逐個元素進行操作對矩陣索引号檢索矩陣的類型轉換通路指定元素生成列向量持續更新

疊代器

.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;
           
C++線性代數庫:Armadillo(犰狳) 使用初體驗(二)矩陣對應行/列(row/col)疊代器矩陣的次方運算矩陣中逐個元素進行操作對矩陣索引号檢索矩陣的類型轉換通路指定元素生成列向量持續更新

矩陣的次方運算

.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; });
           
C++線性代數庫:Armadillo(犰狳) 使用初體驗(二)矩陣對應行/列(row/col)疊代器矩陣的次方運算矩陣中逐個元素進行操作對矩陣索引号檢索矩陣的類型轉換通路指定元素生成列向量持續更新

對矩陣索引号檢索

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);
           
C++線性代數庫:Armadillo(犰狳) 使用初體驗(二)矩陣對應行/列(row/col)疊代器矩陣的次方運算矩陣中逐個元素進行操作對矩陣索引号檢索矩陣的類型轉換通路指定元素生成列向量持續更新

矩陣的類型轉換

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));
           
C++線性代數庫:Armadillo(犰狳) 使用初體驗(二)矩陣對應行/列(row/col)疊代器矩陣的次方運算矩陣中逐個元素進行操作對矩陣索引号檢索矩陣的類型轉換通路指定元素生成列向量持續更新
mat55 M;
	M.randu();
	uvec indices;
	indices << 2 << 3 << 6 << 8;
	M.elem(indices) = ones<vec>(4);
           
C++線性代數庫:Armadillo(犰狳) 使用初體驗(二)矩陣對應行/列(row/col)疊代器矩陣的次方運算矩陣中逐個元素進行操作對矩陣索引号檢索矩陣的類型轉換通路指定元素生成列向量持續更新

持續更新

如有問題,歡迎各位指正。

繼續閱讀