主题:关于fortran调用matlab的问题
我用fortran调用matlab的特征值分解函数EIG,报错说
status = engEvalString(ep, ' A=reA+j*imA;一行有错,Unterminated character constant
这是什么问题啊?谢谢各位大牛
程序如下
subroutine ftom(A,b,te,N)
! (pointer) Replace integer by integer*8 on 64-bit platforms
integer engOpen, mxCreateDoubleMatrix, engPutVariable
integer mxGetPr
integer engGetVariable, engEvalString, engClose
integer ep, status
integer reA_ptr, imA_ptr
integer reb_ptr, imb_ptr
integer rete_ptr, imte_ptr
integer,intent(in) ::N
complex(8),intent(in) ::A(N,N)
integer p,q
real(8) ::reA(N,N),imA(N,N),reb(N,N),imb(N,N),rete(N,N),imte(N,N)
complex(8),intent(out)::b(N,N),te(N,N)
!----------------------------------------------------------------------
ep = engOpen('matlab')
if(ep .eq. 0) then
write(6,*) 'Can''t start MATLAB engine'
stop
end if
!--------------------------------------
do p=1,N
do q=1,N
reA(p,q)=real(A(p,q))
imA(p,q)=imag(A(p,q))
end do
end do
reA_ptr = mxCreateDoubleMatrix(N, N, 0)
imA_ptr = mxCreateDoubleMatrix(N, N, 0)
reb_ptr = mxCreateDoubleMatrix(N, N, 0)
imb_ptr = mxCreateDoubleMatrix(N, N, 0)
rete_ptr = mxCreateDoubleMatrix(N, N, 0)
imte_ptr = mxCreateDoubleMatrix(N, N, 0)
!
! Fortran --> Ptr
!
call mxCopyReal8ToPtr(reA, mxGetPr(reA_ptr), N*N)
call mxCopyReal8ToPtr(imA, mxGetPr(imA_ptr), N*N)
!
! Ptr --> Matlab (将实数传入maltlab实部虚部分别传)
!
status = engPutVariable(ep, 'reA', reA_ptr)
status = engPutVariable(ep, 'imA', imA_ptr)
!
! in Matlab ...
!
status = engEvalString(ep, ' A=reA+j*imA; [B te]=eig(A);
rete=real(te);
imte=imag(te);
reb=real(B);
imb=imag(B); ' )
!
! Matlab --> Ptr
!
reb_ptr = engGetVariable(ep, 'reb')
imb_ptr = engGetVariable(ep, 'imb')
rete_ptr = engGetVariable(ep, 'rete')
imte_ptr = engGetVariable(ep, 'imte')
!
! Ptr--> Fortran
!
call mxCopyPtrToReal8(mxGetPr(reb_ptr), reb, N*N)
call mxCopyPtrToReal8(mxGetPr(imb_ptr), imb, N*N)
call mxCopyPtrToReal8(mxGetPr(rete_ptr), rete, N*N)
call mxCopyPtrToReal8(mxGetPr(imte_ptr), imte, N*N)
!--------------------------------------
do p=1,N
do q=1,N
b(p,q)=cmplx(reb(p,q),imb(p,q))
te(p,q)=cmplx(rete(p,q),imte(p,q))
end do
end do
call mxDestroyArray(reA_ptr)
call mxDestroyArray(imA_ptr)
call mxDestroyArray(reb_ptr)
call mxDestroyArray(imb_ptr)
call mxDestroyArray(rete_ptr)
call mxDestroyArray(imte_ptr)
return
end subroutine ftom
status = engEvalString(ep, ' A=reA+j*imA;一行有错,Unterminated character constant
这是什么问题啊?谢谢各位大牛
程序如下
subroutine ftom(A,b,te,N)
! (pointer) Replace integer by integer*8 on 64-bit platforms
integer engOpen, mxCreateDoubleMatrix, engPutVariable
integer mxGetPr
integer engGetVariable, engEvalString, engClose
integer ep, status
integer reA_ptr, imA_ptr
integer reb_ptr, imb_ptr
integer rete_ptr, imte_ptr
integer,intent(in) ::N
complex(8),intent(in) ::A(N,N)
integer p,q
real(8) ::reA(N,N),imA(N,N),reb(N,N),imb(N,N),rete(N,N),imte(N,N)
complex(8),intent(out)::b(N,N),te(N,N)
!----------------------------------------------------------------------
ep = engOpen('matlab')
if(ep .eq. 0) then
write(6,*) 'Can''t start MATLAB engine'
stop
end if
!--------------------------------------
do p=1,N
do q=1,N
reA(p,q)=real(A(p,q))
imA(p,q)=imag(A(p,q))
end do
end do
reA_ptr = mxCreateDoubleMatrix(N, N, 0)
imA_ptr = mxCreateDoubleMatrix(N, N, 0)
reb_ptr = mxCreateDoubleMatrix(N, N, 0)
imb_ptr = mxCreateDoubleMatrix(N, N, 0)
rete_ptr = mxCreateDoubleMatrix(N, N, 0)
imte_ptr = mxCreateDoubleMatrix(N, N, 0)
!
! Fortran --> Ptr
!
call mxCopyReal8ToPtr(reA, mxGetPr(reA_ptr), N*N)
call mxCopyReal8ToPtr(imA, mxGetPr(imA_ptr), N*N)
!
! Ptr --> Matlab (将实数传入maltlab实部虚部分别传)
!
status = engPutVariable(ep, 'reA', reA_ptr)
status = engPutVariable(ep, 'imA', imA_ptr)
!
! in Matlab ...
!
status = engEvalString(ep, ' A=reA+j*imA; [B te]=eig(A);
rete=real(te);
imte=imag(te);
reb=real(B);
imb=imag(B); ' )
!
! Matlab --> Ptr
!
reb_ptr = engGetVariable(ep, 'reb')
imb_ptr = engGetVariable(ep, 'imb')
rete_ptr = engGetVariable(ep, 'rete')
imte_ptr = engGetVariable(ep, 'imte')
!
! Ptr--> Fortran
!
call mxCopyPtrToReal8(mxGetPr(reb_ptr), reb, N*N)
call mxCopyPtrToReal8(mxGetPr(imb_ptr), imb, N*N)
call mxCopyPtrToReal8(mxGetPr(rete_ptr), rete, N*N)
call mxCopyPtrToReal8(mxGetPr(imte_ptr), imte, N*N)
!--------------------------------------
do p=1,N
do q=1,N
b(p,q)=cmplx(reb(p,q),imb(p,q))
te(p,q)=cmplx(rete(p,q),imte(p,q))
end do
end do
call mxDestroyArray(reA_ptr)
call mxDestroyArray(imA_ptr)
call mxDestroyArray(reb_ptr)
call mxDestroyArray(imb_ptr)
call mxDestroyArray(rete_ptr)
call mxDestroyArray(imte_ptr)
return
end subroutine ftom