服务器之家

服务器之家 > 正文

C++实现矩阵对称正交化的示例代码

时间:2022-01-06 13:35     来源/作者:岑小岑

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库实现

#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++矩阵对称正交化内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/cxd1314520/article/details/120271397

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部