1. 程式人生 > >Eigen矩陣庫中非方陣的廣義逆矩陣的求法,利用SVD矩陣分解

Eigen矩陣庫中非方陣的廣義逆矩陣的求法,利用SVD矩陣分解

X=A+(廣義逆)
直接上C++程式碼:

Eigen::MatrixXd MainWindow::pinv(Eigen::MatrixXd  A)
{
    Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeFullU | Eigen::ComputeFullV);//M=USV*
    double  pinvtoler = 1.e-8; //tolerance
    int row = A.rows();
    int col = A.cols();
    int k = min(row,col);
    Eigen::MatrixXd X = Eigen::MatrixXd::Zero(col,row);
    Eigen::MatrixXd singularValues_inv = svd.singularValues();//奇異值
    Eigen::MatrixXd singularValues_inv_mat = Eigen::MatrixXd::Zero(col, row);
    for
(long i = 0; i<k; ++i) { if (singularValues_inv(i) > pinvtoler) singularValues_inv(i) = 1.0 / singularValues_inv(i); else singularValues_inv(i) = 0; } for (long i = 0; i < k; ++i) { singularValues_inv_mat(i, i) = singularValues_inv(i); } X=(svd.matrixV())*(singularValues_inv_mat)*(svd.matrixU().transpose());//X=VS+U* return
X; }

原理可以參考百度百科SVD分解的原理。並且需要注意非方陣對角矩陣的定義。

相關推薦

Eigen矩陣中非方陣廣義矩陣求法利用SVD矩陣分解

X=A+(廣義逆) 直接上C++程式碼: Eigen::MatrixXd MainWindow::pinv(Eigen::MatrixXd A) { Eigen::JacobiSVD<Eigen::MatrixXd> svd(A,

Recursive sequence 矩陣快速冪 + 組合數 非線性變線性利用到了組合數(楊輝三角求解快)

Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive sequences. In each turn, the cows would stand in a

利用SVD矩陣分解進行k次交叉實驗和Top—N推薦

如果上一節沒看的,請先看上一節Surprise專案的使用。本文利用開源GitHub專案Surprise。 上一節說到具體的安裝和一些方法的屬性,本節將以SVD為例具體的程式碼demo的實現。 先說下如何利用Surprise載入本地資料集進行k次交叉實驗,如果看下API,

Eigen 2】C++矩陣 Eigen快速入門

Eigen 矩陣定義 #include <Eigen/Dense> Matrix<double, 3, 3> A; // Fixed rows and cols. Same as Matrix3d. Matrix&

Eigen矩陣使用說明

這是我在做專案時,給下一屆接手的人寫的一個關於Eigen庫的快速上手手冊,主要是針對於專案的應用來寫的。當時使用Eigen庫的目的是,將Matlab寫的,LPCC和MFCC兩種聲音識別演算法,十字形聲陣列的MUSIC定位演算法,和SVM分類器演算法,轉換成C++然後移植到到A

矩陣論筆記(十)——廣義矩陣

當 A 滿秩時,方程 Ax=b 的解為 x=A−1b。但當 A 不滿秩,甚至方程 Ax=b 無解時,我們也希望用某種逆 A† 的形式表示方程的(近似)解 x=A†b。這便是廣義逆的作用。 0 投影變換與投影矩陣 投影矩陣的求法: (1)M→M:P{L,

C++矩陣 Eigen 快速入門

最近需要用 C++ 做一些數值計算,之前一直採用Matlab 混合程式設計的方式處理矩陣運算,非常麻煩,直到發現了 Eigen 庫,簡直相見恨晚,好用哭了。 Eigen 是一個基於C++模板的線性代數庫,直接將庫下載後放在專案目錄下,然後包含標頭檔案就能使用,非常方便。此外,Eigen的介面清晰,穩定高效。唯

矩陣論學習筆記六:廣義矩陣

參考書:《矩陣論》第3版,程雲鵬 張凱院 徐仲編著 西北工業大學出版社 廣義逆矩陣:該矩陣對於奇異矩陣甚至長方矩陣都存在、具有通常逆矩陣的一些性質、當矩陣非奇異時,它還原到通常的逆矩陣,滿足以上3條性質的矩陣叫做廣義逆矩陣 1920年,E.H.Moore提出廣義逆矩陣的概念

eigen C++模板矩陣

一個不用安裝即可使用的C++矩陣計算庫 官網: API documentation for eigen3 API documentation for eigen2 官網下載原始碼後直接將原始碼目錄新增到編譯器包含目錄即可使用。

稀疏矩陣umfpack和Eigen結合

   又是一個月了,這個月前面大多數的時間都在看網格變形的paper,後面這段時間又要搞Ogre,日子過得很混亂,完全沒有什麼時間來整理學過的東西。在這個月末的時候還是貼篇文章表示還在好好學習。    網格變形的論文看得理解了一點後就開始嘗試實現,就開始到網上找稀疏矩陣庫。

【高效能】Eigen矩陣使用事項

1、Eigen庫只有矩陣運算功能。Eigen相對專一,面對四元數、統計、微積分等高階運算功能,我建議還是使用專業的科學運算庫。 2、四階或以下的矩陣,尤其是固定大小的矩陣如Eigen::Matrix2i,通常進行了計算優化。 3、注意一下自身和非自身的變化: 說明

Ubuntu下C++基於eigenSVD矩陣奇異值分解效率分析

在優化求解問題中,經常要用到矩陣奇異值的SVD分解。奇異值分解 (singularvalue decomposition,SVD)是一種可靠地正交矩陣分解法,它比QR分解法要花上近十倍的計算時間。 使用SVD分解法的用途是解最小平方誤差法和資料壓縮。 在Ubuntu下基

3 廣義矩陣

3. 廣義逆矩陣 3.1 定義 廣義逆 Am×n,Xm×n,若X滿足moore-penrose條件 AXA=A XAX=X (AX)H=AX (XA)H=XA 中的一部分,稱X是A的廣義

Moore-Penrose廣義:可解決MATLAB報錯“矩陣接近奇異值或者縮放錯誤。結果可能不準確”

但實際上執行過程中我們會遇到:當AX=b線性方程組是一個病態方程組;或者A是奇異矩陣(即det(A)=0,不可逆),沒法求逆,用不了inv(A)方法只能用A\b,此時MATLAB會報錯“矩陣接近奇異值,或者縮放錯誤。結果可能不準確”…網路上很多人問這個問題怎麼解決,其實不

python常用序列list、tuples及矩陣numpy的使用

dbf delete end for 技術分享 clas 養成 nump b- 近期開始學習python機器學習的相關知識,為了使後續學習中避免編程遇到的基礎問題,對python數組以及矩陣庫numpy的使用進行總結,以此來加深和鞏固自己以前所學的知識。 Section O

矩陣Numpy基本操作

坐標 sort imp span line 第一個 ros list ray NumPy是一個關於矩陣運算的庫,熟悉Matlab的都應該清楚,這個庫就是讓python能夠進行矩陣話的操作,而不用去寫循環操作。 下面對numpy中的操作進行總結。 numpy包含兩種基本的數據

Algs4-1.3.33矩陣

3.3 public turn stdout 離散 pic 維基百科 run == 1.3.33矩陣庫。編寫一個Matri庫並實現以下API:public class Matrix static double dot(double[] x,double[

轉置矩陣對稱矩陣反對稱矩陣正交矩陣行階梯形矩陣矩陣伴隨矩陣

轉置矩陣: 將矩陣的行列互換得到的新矩陣稱為轉置矩陣,轉置矩陣的行列式不變。 例如,   ,   。 如果  階方陣和它的轉置相等 ,即  ,則稱矩陣  為對稱矩陣。 如果

關於C++ armadillo 矩陣報錯 warning: svd(): decomposition failed的問題

查錯流程: 首先說明一下博主用的版本是armadillo-9.100.5。目前未測試過其他版本是否會出現相同情況!!! 查看了一下原始碼: template<typename T1> inline bool svd ( Mat<typename T

每日一題——有向網的鄰接矩陣、鄰接表、鄰接表建立、列印及深度、廣度遍歷

有向網的三種建立和深度廣度遍歷 #include <iostream> #include <iomanip> using namespace std; #define MAX_VERTEX 20 //最大頂點個數 #define INFINITY