日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

eigen 列向量转矩阵_快速入门矩阵运算——开源库Eigen

發布時間:2023/12/20 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 eigen 列向量转矩阵_快速入门矩阵运算——开源库Eigen 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


矩陣是數學中一個重要的工具,廣泛應用于各種場景下的數值分析,例如,數字信號處理,圖像處理等。我們如何在程序中使用矩陣進行運算呢?本文將為大家介紹一個開源的矩陣運算工具——Eigen。

Eigen is a C++ template library for linear algebra: matrices, vectors, numerical solvers, and related algorithms.

Eigen是一個用于線性運算的C++ 模板庫,支持 矩陣和矢量運算,數值分析及其相關的算法。

安裝Eigen比較簡單需要,從官網下載源碼并解壓即可,我現在的是最新的eigen-3.3.7版本。

官網下載地址:

http://eigen.tuxfamily.org/index.php?title=Main_Page

我們可以進入Eigen目錄,可以發現Eigen庫主要包括如下幾個模塊組成:

  • Core:Matrix和Array類,基礎的線性代數運算和數組操作;
  • Geometry:旋轉,平移,縮放,2維和3維的各種變換;
  • LU:求逆,行列式,LU分解;
  • Cholesky:LLT和LDLT Cholesky分解;
  • Householder:Householder變換;
  • SVD:SVD分解;
  • QR:QR分解。
  • Eigenvalues:特征值,特征向量分解。
  • Sparse:稀疏矩陣的存儲和運算。
  • Dense:包含了Core、Geometry、LU、Cholesky、SVD、QR、Eigenvalues等模塊。
  • Eigen:包含了Dense和Sparse模塊。

Eigen的食用方法非常之簡單,在使用時我們只需要從解壓后的文件目錄中找到需要使用的庫,然后,在源代碼中包含相應的庫即可食用了。因為Eigen是用模板寫的模板庫,所以只能把頭文件包含進來使用。W君是在工程工作目錄解壓的,請參考如下代碼包含Eigen庫。

#include "eigen_3_3_7/Eigen/Eigen"

Matrix和Array模板類

Eigen庫提供有Matrix和Array兩種模板類。它們定義如下:

typedef Matrix MyMatrixType;typedef Array MyArrayType;

其中,通常我們會根據需要設置前三個參數,其它為默認值即可。

  • Scalar:指定元素類型,比如,float, double, bool, int 等。
  • RowsAtCompileTime:指定行數或者設置成動態(Dynamic);
  • ColsAtCompileTime:指定列數或者設置成動態(Dynamic);
  • Options:標志位,可以是ColMajor或RowMajor,默認是ColMajor;

從上面可以看出,行數和列數是允許固定大小,也允許動態大小的,所以下面的幾種類型是可以的。

MatrixMatrixMatrixMatrixArrayArray

另外,我們還可以使用Eigen庫已經重定義的類型,下面是一些簡單的例子可參考。

矩陣的定義和初始化

下面我們先看看Matrix模板類,它包含矩陣(Matrix)和向量(Vector),對于Vector來說,它也是一個矩陣,不過特殊的是行或者列數為1,我們稱作行向量或者列向量。接下來我們來寫個程序來看一下。

#include #include "eigen_3_3_7/Eigen/Eigen"int main(){ Eigen::MatrixXf matrix1(3,4); //定義了矩陣的大小,但是沒有初始化。 Eigen::Vector3f vector1; matrix1 = Eigen::MatrixXf::Zero(3,4); //對矩陣進行初始化。 vector1 = Eigen::Vector3f::Ones(); std::cout << "------ matrix1 ------" << std::endl << matrix1 << std::endl; std::cout << "------ vector1 ------" << std::endl << vector1 << std::endl;}

在上面的代碼中,MatrixXf是一個行列可動態設置的矩陣,Vector3f是一個有3個元素的列向量。

typedef Matrix MatrixXf;typedef Matrix Vector3f;

需要注意到是在定義矩陣大小時是沒有初始化矩陣的,需要重新對矩陣進行初始化,這里是用Zero和Ones函數對其初始化,Zero是初始化為全0,而Ones是初始化為全1。最后,我們看一下執行結果。

當然,我們也可以給定任意值,每個值用逗號隔開,不過,這種方法只能適用于確定矩陣大小的情況下使用。

Eigen::MatrixXf matrix1(3,4); Eigen::Vector3f vector1; matrix1 << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12; vector1 << 1, 2, 3;

執行結果如下:

另外,我們還可以用()對某個元素進行訪問,我們可以對其可讀和可寫。

Eigen::MatrixXf matrix1(3,4); Eigen::Vector3f vector1; matrix1 << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12; vector1 << 1, 2, 3; matrix1(1,3) = 100; vector1(1) = 100;

我們將matrix1的第2行,第4列修改成100;vector1的第2行修改成100,程序執行結果如下:

矩陣的基本運算

學習了矩陣的定義,那我們下面來看一下幾個基本的矩陣運算。Matrix重載了+,+=,-,-+,×,×=,/,/=這幾個基本的四則運算。

對于加減運算,需要注意一下幾點:

  • 左右矩陣的行列對應相等;
  • 數據的類型也要相同,因為矩陣運算不支持隱式類型轉換;
  • 不支持和標量進行加減運算。

我們來看一個例子:

#include #include "eigen_3_3_7/Eigen/Eigen"int main(){ Eigen::MatrixXf matrix1(2,3); Eigen::MatrixXf matrix2(2,3); matrix1 << 1, 2, 3, 5, 6, 7; matrix2 << 1, 1, 2, 2, 1, 1; std::cout << "------ matrix1 ------" << std::endl << matrix1 << std::endl; std::cout << "------ matrix2 ------" << std::endl << matrix1 << std::endl; std::cout << "------ matrix1 + matrix2 ------" << std::endl << matrix1 + matrix2 << std::endl;}

執行結果如下:

關于乘除法運算,矩陣支持矩陣和標量之間的乘除法運算,標量和矩陣中的每個元素相運算。

#include #include "eigen_3_3_7/Eigen/Eigen"int main(){ Eigen::MatrixXf matrix1(2,3); Eigen::MatrixXf matrix2(2,3); matrix1 << 1, 2, 3, 5, 6, 7; matrix2 << 1, 1, 2, 2, 1, 1; std::cout << "------ matrix1 ------" << std::endl << matrix1 << std::endl; std::cout << "------ matrix2 ------" << std::endl << matrix2 << std::endl; std::cout << "------ matrix1 * 2 ------" << std::endl << matrix1 * 2 << std::endl; std::cout << "------ matrix2 / 2 ------" << std::endl << matrix2 / 2 << std::endl;}

執行結果如下:

關于矩陣和矩陣之間的乘法,兩個矩陣只有當左邊的矩陣的列數等于右邊矩陣的行數時,兩個矩陣才可以進行矩陣的乘法運算 。如下圖,左邊矩陣第i行的元素逐個和右邊矩陣第j列的元素相乘,乘積再相加,就是第i行,第j列的結果。對于Eigen庫來說,它通過重載*運算符幫我們實現了這個運算過程,我們直接使用*運算符即可。

#include #include "eigen_3_3_7/Eigen/Eigen"int main(){ Eigen::MatrixXf matrix1(2,3); Eigen::MatrixXf matrix2(3,2); matrix1 << 1, 2, 3, 5, 6, 7; matrix2 << 1, 1, 2, 1, 3, 1; std::cout << "------ matrix1 ------" << std::endl << matrix1 << std::endl; std::cout << "------ matrix2 ------" << std::endl << matrix2 << std::endl; std::cout << "------ matrix1 * matrix2 ------" << std::endl << matrix1 * matrix2 << std::endl;}

執行結果如下:

另外,還包括矩陣的轉置、共軛和共軛轉置等矩陣運算,在Eigen中分別是有transpose()、conjugate()、adjoint()函數可實現。

#include #include "eigen_3_3_7/Eigen/Eigen"int main(){ Eigen::MatrixXf matrix1(2, 3); Eigen::MatrixXf matrix2(2, 3); matrix1 << 1, 2, 3, 4, 5, 6; std::cout << "------ matrix1 ------" << std::endl << matrix1 << std::endl; // 轉置 std::cout << "------ matrix1 transpose------" << std::endl << matrix1.transpose() << std::endl; // 共軛 std::cout << "------ matrix1 conjugate------" << std::endl << matrix1.conjugate() << std::endl; // 共軛轉置 std::cout << "------ matrix1 adjoint------" << std::endl << matrix1.adjoint() << std::endl;}

執行結果如下,不過,代碼中實數的共軛還是其本身。

數組的定義和初始化

有的時候我們并不需要做線性代數矩陣運算,而只是做元素級的操作,這個時候就需要用到Array了。對Array來說,它和Matrix的定義和初始化的方式是一樣的。

#include #include "eigen_3_3_7/Eigen/Eigen"int main(){ Eigen::ArrayXXf array1(2,3); Eigen::ArrayXXf array2(3,3); Eigen::ArrayXXf array3(5,10); array1(0,0) = 1; array1(0,1) = 2; array1(0,2) = 2; array1(1,0) = 1; array1(1,1) = 2; array1(1,2) = 2; array2 << 1, 2, 3, 4, 5, 6, 7, 8, 9; array3 = Eigen::ArrayXXf::Ones(5, 10); std::cout << "------ array1 ------" << std::endl << array1 << std::endl; std::cout << "------ array2 ------" << std::endl << array2 << std::endl; std::cout << "------ array3 ------" << std::endl << array3 << std::endl;}

這里的ArrayXXf也是Eigen庫重定義的,它行和列數可以動態設置。我們可以看到Array的初始化和Matrix也是類似的 。

typedef?Array??ArrayXXf;

下面是執行結果:

數組的基本運算

Array同樣也重載了四則運算,但是,這里數據只是對數組內的元素做算術運算,而不是矩陣線性運算。所以,對于Array來數,兩個數據的大小相同,即行數和行數相同,列數和列數相同,它的四則運算就是取兩個數組相應位置的元素參與運算,運算的結果就是對應位置的值。

當然,也支持和標量之間的運算,數組中的每個元素都乘以這個標量,這個和矩陣一樣。

#include #include "eigen_3_3_7/Eigen/Eigen"int main(){ Eigen::ArrayXXf array1(2, 3); Eigen::ArrayXXf array2(2, 3); array1 << 1, 2, 3, 4, 5, 6; array2 << 1, 2, 1, 1, 1, 2; std::cout << "------ array1 ------" << std::endl << array1 << std::endl; std::cout << "------ array2 ------" << std::endl << array2 << std::endl; std::cout << "------ array1 + array2 ------" << std::endl << array1 + array2 << std::endl; std::cout << "------ array1 - array2 ------" << std::endl << array1 - array2 << std::endl; std::cout << "------ array1 * array2 ------" << std::endl << array1 * array2 << std::endl; std::cout << "------ array1 / array2 ------" << std::endl << array1 / array2 << std::endl; std::cout << "------ array1 * 2 ------" << std::endl << array1 * 2 << std::endl;}

執行結果:

Matrix和Array兩者是可以相互轉換的。Matrix類有array()方法,可將Matrix轉換為Array。Array類有matrix()方法,可將Array轉換成Matrix。

總之,Eigen是一個很不錯的開源庫,官網還有更加詳細的文檔,大家可以參考:

http://eigen.tuxfamily.org/dox/GettingStarted.html

http://eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html

http://eigen.tuxfamily.org/dox/group__QuickRefPage.html

http://eigen.tuxfamily.org/dox/Eigen2ToEigen3.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的eigen 列向量转矩阵_快速入门矩阵运算——开源库Eigen的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。