首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Fortran和Matlab返回同一矩阵的不同特征值

Fortran和Matlab返回同一矩阵的不同特征值
EN

Stack Overflow用户
提问于 2013-12-11 18:22:45
回答 3查看 783关注 0票数 2

我试图通过对这个简单的矩阵进行对角化来学习如何使用LaPACK:

代码语言:javascript
运行
复制
0.8147    0.9058    0.1270    0.9134
0.6324    0.0975    0.2785    0.5469
0.9575    0.9649    0.1576    0.9706
0.9572    0.4854    0.8003    0.1419

在matlab中,我只使用命令eig(mat),得到输出:

代码语言:javascript
运行
复制
ans =

    2.4021
   -0.0346
   -0.7158
   -0.4400

然而,当我试图编写一个简单的fortran程序来对同一个矩阵进行对角化时,我得到了不同的特征值:

代码语言:javascript
运行
复制
      implicit none

  real*8, allocatable::dataMat(:,:),dataMatP(:,:),corMat(:,:),
 $   tempMat(:,:),corMat2(:,:)
  real*8, allocatable::matList(:),rawData(:)
  real*8, allocatable ::eig(:),diag(:),offdiag(:),tau(:),work(:)
  real*8 avg1,avg2,SD1,SD2,geneCorSum,genei,genej,temp
  integer i,j,k,numElements,info,lwork,numGenes,n,
 $   numExperiments,readsize,numAbsent,count,geneTolerance

  real*8 mean,std

  n=4

  allocate(corMat(4,4))

corMat(1,1)=0.8147
corMat(1,2)=0.9058
corMat(1,3)=0.1270
corMat(1,4)=0.9134
corMat(2,1)=0.6234
corMat(2,2)=0.0975
corMat(2,3)=0.2785
corMat(2,4)=0.5469
corMat(3,1)=0.9575
corMat(3,2)=0.9649
corMat(3,3)=0.1576
corMat(3,4)=0.9706
corMat(4,1)=0.9572
corMat(4,2)=0.4854
corMat(4,3)=0.8003
corMat(4,4)=0.1419



  allocate(diag(n))
  allocate(offdiag(n-1))
  allocate(tau(n-1))
  allocate(work(1))

  call dsytrd('U',n,corMat,n,diag,offdiag,tau,
 $ work,-1,info)
  print*,"Returning from Blocksize calculation"
  if(info.eq.0) then
  print*,"Work value successfully calculated:",work(1)
  endif
  lwork=work(1)
  deallocate(work)
  allocate(work(max(1,lwork)))

  call dsytrd('U',n,corMat,n,diag,offdiag,tau,
 $ work,lwork,info)
  print*,"Returning from full SSYTRD"
  if(info.EQ.0) then
  print*,"Tridiagonal matrix calculated"
  endif



  call dsterf(n,diag,offdiag,info)
  if(info.EQ.0) then
    print*,"Matrix Diagonalized"
  endif


  do i=1,n
  print*,"lam=",i,diag(i)
  enddo

  deallocate(offdiag)
  deallocate(work)
  deallocate(tau)

  end

这给了我:

代码语言:javascript
运行
复制
 lam= 1,  -1.0228376083545221
 lam= 2,  -0.48858533844019592
 lam= 3,  0.43828991894506536
 lam= 4,  2.2848330351691031

我是不是做错了什么来得到不同的特征值?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-11 18:55:29

您使用的LAPACK例程假定为对称矩阵,而原始矩阵则不是。

要证明这一点,请使用右上三角部分从原始矩阵创建对称矩阵,并运行MATLAB的eig函数:

代码语言:javascript
运行
复制
for i=1:4
  for j=i:4; 
    xx(i,j) = x(i,j); 
    xx(j,i)=x(i,j);
  end
end

生成的矩阵(x是您拥有的原始矩阵):

代码语言:javascript
运行
复制
xx =

0.8147    0.9058    0.1270    0.9134
0.9058    0.0975    0.2785    0.5469
0.1270    0.2785    0.1576    0.9706
0.9134    0.5469    0.9706    0.1419

原始x矩阵和对称xx矩阵的特征值:

代码语言:javascript
运行
复制
>> eig(x)
  ans =    2.4022    -0.0346   -0.7158   -0.4400

>> eig(xx)
  ans =   -1.0228    -0.4886     0.4383     2.2848
票数 3
EN

Stack Overflow用户

发布于 2013-12-11 18:56:07

首先,我希望您不只是复制/粘贴Matlab默认从命令窗口打印出来的四位小数点。其次,corMat(2,1)=0.6234与第一个矩阵中的对应值不同。第三,dsytrd的文档声明:

DSYTRD通过正交相似变换将实对称矩阵A降为实对称三对角形式T。

你的矩阵绝对是不对称的(isequal(A,A'))。有处理非对称矩阵的各种例程。例如,您可以尝试使用dgeev

票数 1
EN

Stack Overflow用户

发布于 2013-12-11 19:36:58

SSYTRD/DSYTRD只适用于对称矩阵。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20527031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档