C 使用Eigen實現偽逆矩陣(pinV)

2021-09-26 22:15:40 字數 1318 閱讀 2521

偽逆矩陣(moore-penrose pseudoinverse)a定義:

a+=vd+ut,其中,u,d和v是矩陣a奇異值分解後得到的矩陣。對角矩陣d的偽逆d+是非零元素取倒數之後再轉置得到的。

c++實現偽逆矩陣,程式**:

#include "funset.hpp"

#include #include #include #include #include #include #include "common.hpp"

int test_pseudoinverse()

, // ,

// };

//const int rows, cols;

std::vector> vec,

};const int rows, cols;

std::vectorvec_;

for (int i = 0; i < rows; ++i)

eigen::map> m(vec_.data(), rows, cols);

fprintf(stderr, "source matrix:\n");

std::cout << m << std::endl;

fprintf(stderr, "\neigen implement pseudoinverse:\n");

auto svd = m.jacobisvd(eigen::computefullu | eigen::computefullv);

const auto &singularvalues = svd.singularvalues();

eigen::matrixsingularvaluesinv(m.cols(), m.rows());

singularvaluesinv.setzero();

double pinvtoler = 1.e-6; // choose your tolerance wisely

for (unsigned int i = 0; i < singularvalues.size(); ++i)

eigen::matrixxf pinvmat = svd.matrixv() * singularvaluesinv * svd.matrixu().transpose();

std::cout << pinvmat << std::endl;

return 0;

}

執行結果:

C 實現求解逆矩陣

利用c語言求解線性代數中求解逆矩陣的一類問題。最近在學線代,其中有乙個挺煩人的就是求解逆矩陣,雖然求逆矩陣不難,但我自己在解題的時候經常求錯,所以就想能不能用演算法來求解這一類的題目。求解逆矩陣一般可以用初等行變換或伴隨矩陣方法求解。這裡採用的是伴隨矩陣方法。思路很簡單,先求矩陣a對應的行列式 a ...

C 矩陣處理庫 Eigen初步使用

專案要進行比較多的矩陣操作,特別是二維矩陣。剛開始做實驗時,使用了動態二維陣列,於是寫了一堆matrix函式,作矩陣的乘除加減求逆求行列式。實驗做完了,開始做 優化,發現matrix.h檔案裡適用性太低,而且動態二維陣列的空間分配與釋放也影響效率,於是尋找其他解決方案。首先考慮的是與matlab混合...

C 矩陣處理庫 Eigen初步使用

專案要進行比較多的矩陣操作,特別是二維矩陣。剛開始做實驗時,使用了動態二維陣列,於是寫了一堆matrix函式,作矩陣的乘除加減求逆求行列式。實驗做完了,開始做 優化,發現matrix.h檔案裡適用性太低,而且動態二維陣列的空間分配與釋放也影響效率,於是尋找其他解決方案。首先考慮的是與matlab混合...