回 帖 发 新 帖 刷新版面

主题:很感激,很感动,能否再让我感动一次。矩阵特征值

有两个程序求矩阵特征值,这个是从网上搜到的,运行成功:
program main
 use IMSL
 implicit none
 real :: A(3,3)=(/1,0,0,&
                  0,2,0,&
                  0,0,3 /)
 real :: eigenvalue(3)
 real :: eigenvector(3,3)
 integer :: i

 eigenvalue=eig(A,v=eigenvector)
 do i=1,3
   write(*,"('eigenvalue=',f5.2)")eigenvalue(i)
   write(*,"('eigenvector=['3(f5.2'')']')")eigenvector(:,i)
 end do 

stop
end 
 下面这个是我根据自己的需求扩展的一个程序,有个问题:
program main
use imsl
real :: eigenvalue(8)
 real :: eigenvector(8,8)
call abc
eigenvalue=eig(b,v=eigenvector)
 do i=1,8
   write(*,"('eigenvalue=',f5.2)")eigenvalue(i)
   write(*,"('eigenvector=['8(f5.2'')']')")eigenvector(:,i)
 end do
 
end

subroutine ABC
  implicit none
  real:: b(8,8)=0.0
  real:: a(2,2) 
  integer:: i, j
  a=reshape((/1,2,3,4/),(/2,2/)) 
  do i=1,7,2    
       b(i:i+1,i:i+1)=a
  end do
  write(*,*) b
  return
end subroutine

问题:Error: There is no matching specific function for this generic function reference.   [EIG]
eigenvalue=eig(b,v=eigenvector)

说eig出错了,好像库函数里没有匹配的什么东西,如果出错,第一个程序为什么没提示呢?
请大侠们指点下了

回复列表 (共5个回复)

沙发

请认真看看书吧.
主函数里没有用implicit none 编译器帮你定义了b
你可能想子函数的b会自动传递回来的, 但事实上没有发生这样的事.

板凳


我修改了,把矩阵B传过去了,怎么还出错呢?
program main
use imsl
implicit none
real b
integer:: n
integer i
real,allocatable:: eigenvalue(:)
real,allocatable::eigenvector(:,:)
allocate(eigenvalue(n))
allocate(eigenvector(n,n))
read(*,*) n
call abc(n,b)
eigenvalue=eig(b,v=eigenvector)
 do i=1,n
   write(*,"('eigenvalue=',f5.2)")eigenvalue(i)
   write(*,"('eigenvector=['8(f5.2'')']')")eigenvector(:,i)
 end do
end

subroutine abc(n,c)
  implicit none
  integer n
  real:: c(n,n)=0.0
  real:: a(2,2) 
  integer:: i, j
  a=reshape((/1,2,3,4/),(/2,2/)) 
  do i=1,n-1,2    
       c(i:i+1,i:i+1)=a
  end do
  return
end subroutine

一个是老毛病,说eig函数不匹配;另一个说c矩阵定义有误,真不清楚 哪里问题了。
 Error: There is no matching specific function for this generic function reference.   [EIG]
eigenvalue=eig(b,v=eigenvector)
-----------^
E:\maronglunwen\exam2.f90(23) : Error: A data initialization-expr is not valid for this object.   [C]
  real:: c(n,n)=0.0
---------^
Error executing df.exe.

exam2.obj - 2 error(s), 0 warning(s)

3 楼

[quote]请认真看看书吧.
主函数里没有用implicit none 编译器帮你定义了b
你可能想子函数的b会自动传递回来的, 但事实上没有发生这样的事.[/quote]
修改之后还是问题:

program main
use imsl
implicit none
real b
integer:: n
integer i
real,allocatable:: eigenvalue(:)
real,allocatable::eigenvector(:,:)
allocate(eigenvalue(n))
allocate(eigenvector(n,n))
read(*,*) n
call abc(n,b)
eigenvalue=eig(b,v=eigenvector)
 do i=1,n
   write(*,"('eigenvalue=',f5.2)")eigenvalue(i)
   write(*,"('eigenvector=['8(f5.2'')']')")eigenvector(:,i)
 end do
end

subroutine abc(n,c)
  implicit none
  integer n
  real:: c(n,n)=0.0
  real:: a(2,2) 
  integer:: i, j
  a=reshape((/1,2,3,4/),(/2,2/)) 
  do i=1,n-1,2    
       c(i:i+1,i:i+1)=a
  end do
  return
end subroutine






 Error: There is no matching specific function for this generic function reference.   [EIG]
eigenvalue=eig(b,v=eigenvector)
-----------^
E:\maronglunwen\exam2.f90(23) : Error: A data initialization-expr is not valid for this object.   [C]
  real:: c(n,n)=0.0
---------^
Error executing df.exe.

exam2.obj - 2 error(s), 0 warning(s)

4 楼

allocate(eigenvalue(n))
allocate(eigenvector(n,n))
read(*,*) n

你的n在下面才read, 你上面怎么就分配空间了啊...

real:: c(n,n)=0.0 分开写吧

real:: c(n,n)
c= 0.0

5 楼

问题找到了,b应该设成allocatable的

我来回复

您尚未登录,请登录后再回复。点此登录或注册