作者kkarthur (aa)
看板Fortran
标题Re: [问题] complex matrix 的 inverse matrix
时间Thu Aug 16 02:07:43 2012
※ 引述《forentia (谨慎)》之铭言:
: 请问各位大大
: 要怎麽算出complex matrix的反函数?
: 网路上找到的是real的
: 那complex有办法吗?
刚刚好最近有用到, 直接po上来好了
program main
implicit none
complex*16::a(3,3),b(3,3),c(3,3)
data a/10,2.5,(3,7),4,5,6,7,8,9/
print*,'a='
write(*,'(3(F8.4,"+i",F8.4,", "))') , a(1,:)
write(*,'(3(F8.4,"+i",F8.4,", "))') , a(2,:)
write(*,'(3(F8.4,"+i",F8.4,", "))') , a(3,:)
b=zInverse(3,a)
print*,'b='
write(*,'(3(F8.4,"+i",F8.4,", "))') , b(1,:)
write(*,'(3(F8.4,"+i",F8.4,", "))') , b(2,:)
write(*,'(3(F8.4,"+i",F8.4,", "))') , b(3,:)
c=matmul(a,b)
print*,'c='
write(*,'(3(F8.4,"+i",F8.4,", "))') , c(1,:)
write(*,'(3(F8.4,"+i",F8.4,", "))') , c(2,:)
write(*,'(3(F8.4,"+i",F8.4,", "))') , c(3,:)
contains
function zInverse(n, a) result(ra)
integer::n,lda,ipiv(n),info,lwork
complex*16::a(n,n),ra(n,n),work(n)
ra=a
lwork=n
lda=n
call zgetrf(n, n, ra, lda, ipiv, info)
if(info/=0) write(0,*) 'Error occured in zgetrf!'
call zgetri(n, ra, lda, ipiv, work, lwork, info)
if(info/=0) write(0,*) 'Error occured in zgetri!'
endfunction
end
---------------------------------------------
其中zgetrf和zgetri是lapack的函数
前面的z可改成 s,d,c 分别对应到
s: Short-precision real
d: Long-precision real
c: Short-precision complex
z: Long-precision complex
如果安装的是比较新的版本的intel fortran compiler,
intel MKL应该都会附在安装档里面
http://software.intel.com/en-us/articles/non-commercial-software-download/
非商业用版可以免费下载
在编译要用到lapack的档案的时候可以参考使用下面的方法
ifort example.f90 -L/{compiler安装路径}/mkl/lib/intel64 -lmkl_lapack95_lp64
-lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread -lm
详细的mkl link 可以参考下面网页
http://software.intel.com/en-us/articles/intel-mkl-link-line-advisor/
希望对你有帮助
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.237.169.160
1F:推 callmei:免费?我还以为只有LINUX版本才有非商业版免费说@@ 08/16 04:30
2F:→ kkarthur:我说的也是指在Linux底下.... 08/16 05:19
3F:推 YCTzeng:新版 ifort -mkl 就可以了。 08/16 08:11