C++實(shí)現(xiàn)矩陣對稱正交化的示例代碼
1.python代碼
import numpy as np import pandas as pd df=pd.DataFrame() df['fac_01']=(34, 45, 65) df['fac_02']=(56, 25, 94) print(df) print('------------------矩陣的特征跟D、和特征向量U-----------------------') D,U=np.linalg.eig(np.dot(df.T, df)) # 求矩陣的特征跟D、和特征向量U print(D,U,sep='\n') print('\n------------------對角矩陣-----------------------') print(np.diag(D**(-0.5))) print('\n------------------對稱正交后的矩陣-----------------------') S = np.dot(np.dot(U, np.diag(D**(-0.5))), U.T) # 求過渡矩陣S = U* DEx *U' F_hat = np.dot(df, S) # 求對稱正交后的矩陣 print(F_hat)
2.C++的Eigen庫實(shí)現(xiàn)
#include "Eigen/Dense" using namespace Eigen; int main() { //初始化 MatrixXf A(3, 2); A(0,0) = 34;A(0,1) = 56; A(1,0) = 45;A(1,1) = 25; A(2,0) = 65;A(2,1) = 94; //生成正交矩陣 MatrixXf AEx = A.transpose() * A; int nRowSize = AEx.rows(); int nColSize = AEx.cols(); //求特征根、特征向量 SelfAdjointEigenSolver<Matrix2f> eigensolver(AEx); MatrixXf D = eigensolver.eigenvalues(); MatrixXf U = eigensolver.eigenvectors(); std::cout<<"特征根如下:" <<std::endl; nRowSize = D.rows(); nColSize = D.cols(); for(size_t i=0; i<nRowSize; i++) { for(size_t j=0; j<nColSize; j++) { std::cout<<D(i,j)<<" "; } std::cout<<std::endl; } std::cout<<"特征向量如下:" <<std::endl; nRowSize = U.rows(); nColSize = U.cols(); for(size_t i=0; i<nRowSize; i++) { for(size_t j=0; j<nColSize; j++) { std::cout<<U(i,j)<<" "; } std::cout<<std::endl; } //生成np.diag(D**(-0.5)))對角線矩陣 MatrixXf DEx(2,2); for(size_t i=0; i<2; i++) { for(size_t j=0; j<2; j++) { if(i == j) { DEx(i,j) = pow(D(i,0),-0.5); } else { DEx(i,j) = 0; } } } nRowSize = DEx.rows(); nColSize = DEx.cols(); std::cout<<"對角線矩陣如下:" <<std::endl; for(size_t i=0; i<nRowSize; i++) { for(size_t j=0; j<nColSize; j++) { std::cout<<DEx(i,j)<<" "; } std::cout<<std::endl; } //生成過度矩陣S MatrixXf S = U * DEx * U.transpose(); //生成正交化矩陣 MatrixXf R = A * S; nRowSize = R.rows(); nColSize = R.cols(); std::cout<<"正交化結(jié)果如下:" <<std::endl; for(size_t i=0; i<nRowSize; i++) { for(size_t j=0; j<nColSize; j++) { std::cout<<R(i,j)<<" "; } std::cout<<std::endl; } return 0; }
3.結(jié)果對比
到此這篇關(guān)于C++實(shí)現(xiàn)矩陣對稱正交化的文章就介紹到這了,更多相關(guān)C++矩陣對稱正交化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)二叉樹先序、中序、后序及層次四種遍歷
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)二叉樹先序、中序、后序及層次四種遍歷方式,具有一定的知識性參考價值,需要的小伙伴可以先看一下2022-02-02C/C++ Qt TreeWidget 嵌套節(jié)點(diǎn)操作使用
本文主要介紹了TreeWidget的如何使用,實(shí)現(xiàn)對樹形框多節(jié)點(diǎn)的各種操作,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11C++ 隨機(jī)數(shù)與隨機(jī)種子數(shù)的實(shí)例
這篇文章主要介紹了C++ 隨機(jī)數(shù)與隨機(jī)種子數(shù)的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-07-07c++連續(xù)輸入未知個數(shù)的數(shù)字操作
這篇文章主要介紹了c++連續(xù)輸入未知個數(shù)的數(shù)字操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12C++調(diào)用matlab函數(shù)的實(shí)例
這篇文章主要介紹了C++調(diào)用matlab函數(shù)的方法,包括封裝matlab函數(shù),編譯matlab函數(shù)及C++環(huán)境配置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08C語言進(jìn)程程序替換的實(shí)現(xiàn)詳解
為什么要進(jìn)程替換?因?yàn)楦高M(jìn)程創(chuàng)建出來的子進(jìn)程和父進(jìn)程擁有相同的代碼段,所以,子進(jìn)程看到的代碼和父進(jìn)程是一樣的。當(dāng)我們想要讓子進(jìn)程執(zhí)行不同的程序時候,就需要讓子進(jìn)程調(diào)用進(jìn)程程序替換的接口,從而讓子進(jìn)程執(zhí)行不一樣的代碼2022-08-08Qt5+QMediaPlayer實(shí)現(xiàn)音樂播放器的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Qt5和QMediaPlayer實(shí)現(xiàn)簡易的音樂播放器,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的可以參考一下2022-12-12