原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84339214
線性代數矩陣以及Eigen庫的介紹、編譯和使用
前話
研究Fec算法,需要使用到矩陣基本知識,主要包括加法、減法和乘法,先重溫矩陣知識,然後使用開源庫Eigen進行矩陣計算,包括編譯、配置和使用。
線性代數之矩陣以及基本運算
(注意:當先FEC算法中用到的主要是加法、減法和乘法)
簡介
矩陣是高等代數學中的常見工具,也常見於統計分析等應用數學學科中:
- 在物理學中,矩陣於電路學、力學、光學和量子物理中都有應用;
- 計算機科學中,三維動畫製作、圖像識別和一些算法也需要用到矩陣;
矩陣的運算是數值分析領域的重要問題。將矩陣分解爲簡單矩陣的組合可以在理論和實際應用上簡化矩陣的運算。對一些應用廣泛而形式特殊的矩陣,例如稀疏矩陣和準對角矩陣,有特定的快速運算算法。關於矩陣相關理論的發展和應用,請參考矩陣理論。在天體物理、量子力學等領域,也會出現無窮維的矩陣,是矩陣的一種推廣。
定義
由m × n 個數aij排成的m行n列的數表稱爲m行n列的矩陣,簡稱m × n矩陣。記作:
這m×n 個數稱爲矩陣A的元素,簡稱爲元,數aij位於矩陣A的第i行第j列,稱爲矩陣A的(i,j)元,以數 aij爲(i,j)元的矩陣可記爲(aij)或(aij)m × n,m×n矩陣A也記作Amn。
元素是實數的矩陣稱爲實矩陣,元素是複數的矩陣稱爲復矩陣。而行數與列數都等於n的矩陣稱爲n階矩陣或n階方陣。
基本運算:加法、減法、數乘、轉置、共軛、共軛轉置
先定義矩陣A、B、C三個矩陣,如下:
加法
必須是同型矩陣纔可進行加法,即行、列相同。
減法
必須是同型矩陣纔可進行減法,即行、列相同。
數乘(區別於乘法,乘法是矩陣乘以矩陣)
以上加法、減法和數乘合稱爲矩陣的線性代碼。
轉置
把矩陣A的行和列互相交換鎖產生的矩陣成爲A的轉置矩陣
共軛
矩陣的共軛定義爲:
.一個2×2複數矩陣的共軛如下所示
則
共軛轉置
矩陣的共軛轉置定義爲:
也可以寫爲:
一個2×2複數矩陣的共軛如下所示:
則
乘法
兩個矩陣的乘法僅當第一個矩陣A的列數和另一個矩陣B的行數相等時才能定義。如A是m×n矩陣和B是n×p矩陣;
矩陣的乘法滿足以下運算律:
結合律:
左分配律:
右分配律:
矩陣乘法不滿足交換律。
(注意:當先FEC算法中用到的主要是加法、減法和乘法)
Eigen庫
簡介
Eigen是一個高層次的C ++庫,有效支持線性代數,矩陣和矢量運算,數值分析及其相關的算法。Eigen是一個開源庫,從3.1.1版本開始遵從MPL2許可。
Eigen目前最新的版本是3.3.5,除了C++標準庫以外,不需要任何其他的依賴包。Eigen使用的CMake建立配置文件和單元測試,並自動安裝。如果使用Eigen庫,只需包特定模塊的的頭文件即可。
Eigen適用範圍廣,支持包括固定大小、任意大小的所有矩陣操作,甚至是稀疏矩陣;支持所有標準的數值類型,並且可以擴展爲自定義的數值類型;支持多種矩陣分解及其幾何特徵的求解;它不支持的模塊生態系統,提供了許多專門的功能,如非線性優化,矩陣功能,多項式解算器,快速傅立葉變換等。
Eigen支持多種編譯環境,開發人員對庫中的實例在多種編譯環境下經過測試,以保證其在不同編譯環境下的可靠性和實用性。
下載
下載使用3.3.5,當前的最新版本。
官網下載地址爲:http://eigen.tuxfamily.org/index.php?title=Main_Page#Overview
CSDN的下載地址爲:https://download.csdn.net/download/qq21497936/10800291
使用Cmake編譯成目標dll使用
(注意:因爲編譯後的庫太大,導致磁盤爆了,筆者沒繼續編完成)
當前主要是爲了vs2017寫c庫(c++封裝到c庫)給c#調用,使用vs2017進行編譯。
CMake是一個工程文件生成工具。用戶可以使用預定義好的CMake腳本,根據自己的選擇(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。
Cmake下載地址:http://download.csdn.net/download/qq21497936/10154545
解壓後直接運行cmake-gui.exe
解壓Eigen庫,並創建目標文件夾eigen-3.3.5_build
輸入源文件和目標文件夾
點擊Configure配置編譯器:
點擊Finish,如下圖:
等待一會兒,Configure完成後會出現一系列配置,如下圖(去掉grouped和Advanced的勾選,之前使用過勾選了):
修改下安裝地址,CMAKE_INSTALL_PREFIX
點擊Generate,根據配置文件生成相應的工程,完成後如下圖:
打開工程,可進入build文件打開工程,也可以使用Open Project按鈕打開工程:
編譯會需要一段時間,先生成debug,然後清理解決方案,再生成release;
在編譯的過程中,發現出錯,調用exe失敗,經過檢查,是因爲把算法庫百編譯出來的dll實在太大了,檢查build文件夾容量(此時該磁盤可用空間已經爲0),所以編譯這條路貌似不太好走下去,還有一種方式是我們直接包含其源文件到工程中,那麼用到那些庫生成的文件就會包含哪些,目標文件夾容量如下:
附:若讀者第一次使用CMake編譯,可能還不理解,可參考下面的篇博文,博文中使用CMake編譯Glfw庫,可多案例比對分析加深理解:https://blog.csdn.net/qq21497936/article/details/78884842
我們只需要使用到矩陣,所以只需要包含模塊頭文件和源文件,使用到的庫爲Core核心庫(矩陣和數組類,基本線性代數,數組操作)。
開發配置環境流程以及簡單測試
模塊和頭文件,每個模塊都有一個相應的頭文件,必須包含該頭文件才能使用該模塊。在Dense和Eigen提供的頭文件同時方便訪問幾個模塊。
我們使用VS2017,所以使用VS的VC++建立空工程,如下圖:
添加main.cpp文件,建立main函數先跑起來“Hello world!”,如下圖:
運行起來後,將Eigen的Core庫引入項目,Core模塊
在VS中添加
使用頭文件的時候,習慣依賴自動提示,這裏特別注意,VS沒有提示(如果我們使用自己編譯dll包含頭文件會有),需要手動添加,提示下圖:
測試Demo
測試代碼
#include <iostream>
#include <Eigen/Core>
using namespace std;
using namespace Eigen;
int main(int argc, char * argv[])
{
cout << "Hello world!!!" << endl;
// 第一種賦值方式,操作有點麻煩,當作數組操作
MatrixXi A(2, 3);
A(0, 0) = 1;
A(0, 1) = 2;
A(0, 2) = 3;
A(1, 0) = 2;
A(1, 1) = 4;
A(1, 2) = 6;
// 第二種賦值方式,流式操作,符合C++操作習慣
MatrixXi B(2, 3);
B << 0, 1, 0, 1, 0, 1;
MatrixXi C(3, 2);
C << 1, 2, 2, 3, 0, 4;
// 打印A和B
cout << "A =" << endl << A << endl;
cout << "B =" << endl << B << endl;
cout << "C =" << endl << C << endl;
// 計算A+B
cout << "A + B =" << endl << A+B << endl;
// 計算A-B
cout << "A - B =" << endl << A-B << endl;
// 計算A*C
cout << "A * C =" << endl << A*C << endl;
}
結果如下:
比對結果:
、
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/84339214