我是靠谱客的博主 贪玩荔枝,这篇文章主要介绍C++实现矩阵对称正交化的示例代码,现在分享给大家,希望可以做个参考。

1.python代码

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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库实现

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#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<<"正交化结果如下:" <<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.结果对比

到此这篇关于C++实现矩阵对称正交化的文章就介绍到这了,更多相关C++矩阵对称正交化内容请搜索靠谱客以前的文章或继续浏览下面的相关文章希望大家以后多多支持靠谱客!

最后

以上就是贪玩荔枝最近收集整理的关于C++实现矩阵对称正交化的示例代码的全部内容,更多相关C++实现矩阵对称正交化内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(160)

评论列表共有 0 条评论

立即
投稿
返回
顶部