回 帖 发 新 帖 刷新版面

主题:[讨论]Fortran和matlab的混合编程

[em10]有做matlab和Fortran混合编程的吗?主要是在Fortran中调用matlab的函数,自己写的或者matlab自带的函数。本人刚开始接触,可以一起讨论一下。[color=008000][/color]

回复列表 (共12个回复)

沙发


Fortran在数值数值计算中的地位是不可取代的,同时Fortran语法简单,明了。在理工科的实验中主要是以Fortran编程为主,但是matlab强大的绘图和函数库是Fortran所不能比的,但是两者之间是怎么结合起来的,请大侠指教啊。我qq是1093428071,望各位不吝赐教。

板凳

MATLAB帮助很详细,论坛有帖子,可以搜一下

3 楼

[quote]MATLAB帮助很详细,论坛有帖子,可以搜一下[/quote]
matlab的帮助我总是看不很懂,你给给个例子吗?mbuild -setup的时候找不到编译器。我安装的是Fortran6.0和VS 2005.

4 楼

matlab每个版本支持的编译器不同

5 楼


是的,我用的是2010r的,在文章上看到的一些例子就不能用,[em17]。如果学习缓和编程的话,有较好的材料推荐吗?谢谢!

6 楼

[quote]
是的,我用的是2010r的,在文章上看到的一些例子就不能用,[em17]。如果学习缓和编程的话,有较好的材料推荐吗?谢谢![/quote]
我在桂林工学院学报上看到刘羽的Matlab与Fortran的混合编程及其应用里面有这样一段代码,(删除了显示字符串的部分),但是编译时总是出现错误。
    program main
    integer engopen, enggetmatrix, mxcreatfull, mxgetpr
    integer ep,t,d
    double precision tim(10), dist(10)
!    integer engputmatrix
    integer engPutVariable
!    , engevalstring, engclose
    integer engClose
    integer temp, status
    data tim /1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0 /
    ep=engopen('Matlab')
    t=mxcreatfull(1,10,0)
    call mxsetname(t,'t')
    call mxcopyreal8toptr(time,mxgetpr(t),10)
!    call engPutMatrix(ep,t)
    call engPutVariable(ep,t)
!    call engevalstring(ep,'d=ppp')
!    call engevalstring(ep,'hh=jjj')
    pause
    call evalstring(ep,'close')
    d=engmatrix(ep,'d')
    call mxcopyptrtoreal8(mxgetpr(d),dist,10)

    do i=1,10
        print *, tim(i),dist(i)
        pause
    end do
    call mxfreematrix(t)
    call mxfreematrix(d)
    call engClose(ep)
    stop
    end

F:\un\main.f90(31) : Error: This subroutine has already been used in a type statement.   [ENGCLOSE]当我把它注释掉的时候,没有错误,但是下一步时,出现如下错误

--------------------Configuration: main - Win32 Debug--------------------
Linking...
main.obj : error LNK2001: unresolved external symbol _ENGOPEN@8
main.obj : error LNK2001: unresolved external symbol _MXCREATFULL@12
main.obj : error LNK2001: unresolved external symbol _MXSETNAME@12
main.obj : error LNK2001: unresolved external symbol _MXGETPR@4
main.obj : error LNK2001: unresolved external symbol _MXCOPYREAL8TOPTR@12
main.obj : error LNK2001: unresolved external symbol _ENGPUTVARIABLE@8
main.obj : error LNK2001: unresolved external symbol _EVALSTRING@12
main.obj : error LNK2001: unresolved external symbol _ENGMATRIX@12
main.obj : error LNK2001: unresolved external symbol _MXCOPYPTRTOREAL8@12
main.obj : error LNK2001: unresolved external symbol _MXFREEMATRIX@4
main.obj : error LNK2001: unresolved external symbol _ENGCLOSE@4
Debug/main.exe : fatal error LNK1120: 11 unresolved externals
Error executing link.exe.

main.exe - 12 error(s), 0 warning(s)
。到底该怎么弄?我的matlab是2010ra的,Fortran是visual Fortran 6.0的。
还有我在matlab里面mex -setup时,只出现
Select a compiler: 
[1] Lcc-win32 C 2.4.1 in E:\PROGRA~1\MATLAB\R2010a\sys\lcc 
 
[0] None 
两个,但是在\MATLAB\R2010a\sys\lcc 下面只有几个文件夹,没有Fortran的编译器,这是为什么?我的fortran 和matlab都在e盘下。求大家帮忙啊,我总是给最高的专家分的。

7 楼

没有在工程里面添加matlab相关的lib,请加入libeng.lib libmx.lib libmat.lib三个lib库
具体怎么加应该知道吧?
我不知道你的编译器是什么,CVF下是
link->Object/library modules->libeng.lib libmx.lib libmat.lib
空格隔开

8 楼

汗,你给的代码我编译不过,应该是MATLAB版本不同的原因
1:函数接口不一样
2:mxcreatfull 应该为mxcreatefull
3:我给出一个我编译成功的例子,MATLAB版本:2009b
program main
  implicit none


!------------------------------------------------------------------
  integer*4,external:: engOpen, engClose, mxCreateDoubleMatrix
  integer*4,external:: mxGetPr,engPutVariable, engEvalString
  integer*4 ep, T    !表现为32位整型的指针
  
  integer*4 M_x,M_y

  integer status
!------------------------------------------------------------------


  integer i,j
  real*8::array(20,30)

  real*8 :: f_x(20),f_y(20)
 
  
  forall(i=1:20,j=1:30)
  array(i,j)=i*i+j+(20-i)*(30-j)
  endforall

  forall(i=1:20)
  f_x(i)=i-10
  endforall

  f_y = f_x*f_x
  
  !打开引擎
  ep = engOpen('')
  if (ep == 0) then
      write(6,*) 'Can''t start MATLAB engine'
      stop
  endif

  !传送数组
  T = mxCreateDoubleMatrix(20, 30, 0)
  call mxCopyReal8ToPtr(array, mxGetPr(T), 20*30)
  status = engPutVariable(ep, 'T', T)
  if (status /= 0) then 
         write(6,*) 'engPutVariable failed'
         stop
  endif

  M_x = mxCreateDoubleMatrix(1, 20, 0)
  call mxCopyReal8ToPtr(f_x, mxGetPr(M_x), 20)
  status = engPutVariable(ep, 'X', M_x)
  if (status /= 0) then 
         write(6,*) 'engPutVariable failed'
         stop
  endif    

  M_y = mxCreateDoubleMatrix(1, 20, 0)
  call mxCopyReal8ToPtr(f_y, mxGetPr(M_y), 20)
  status = engPutVariable(ep, 'Y', M_y)
  if (status /= 0) then 
         write(6,*) 'engPutVariable failed'
         stop
  endif    

  
  !传达绘图指令
  if (engEvalString(ep,' pcolor(T); figure(2);plot(X,Y); ') /= 0) then
         write(*,*) 'engEvalString failed'
         stop
  endif
  
  !关闭引擎
  write(*,*) 'please press <Enter> to continue'
  read(*,*)      
  call mxDestroyArray(T)
  status = engClose(ep)
  if (status .ne. 0) then 
       write(6,*) 'engClose failed'
       stop
  endif


stop
end

9 楼

[quote]汗,你给的代码我编译不过,应该是MATLAB版本不同的原因
1:函数接口不一样
2:mxcreatfull 应该为mxcreatefull
3:我给出一个我编译成功的例子,MATLAB版本:2009b
program main
  implicit none


!------------------------------------------------------------------
  integer*4,external:: engOpen, engClose, mxCreateDoubleMatrix
  integer*4,external:: mxGetPr,engPutVariable, engEvalString
  integer*4 ep, T    !表现为32位整型的指针
  
  integer*4 M_x,M_y

  integer status
!------------------------------------------------------------------


  integer i,j
  real*8::array(20,30)

  real*8 :: f_x(20),f_y(20)
 
  
  forall(i=1:20,j=1:30)
  array(i,j)=i*i+j+(20-i)*(30-j)
  endforall

  forall(i=1:20)
  f_x(i)=i-10
  endforall

  f_y = f_x*f_x
  
  !打开引擎
  ep = engOpen('')
  if (ep == 0) then
      write(6,*) 'Can''t start MATLAB engine'
      stop
  endif

  !传送数组
  T = mxCreateDoubleMatrix(20, 30, 0)
  call mxCopyReal8ToPtr(array, mxGetPr(T), 20*30)
  status = engPutVariable(ep, 'T', T)
  if (status /= 0) then 
         write(6,*) 'engPutVariable failed'
         stop
  endif

  M_x = mxCreateDoubleMatrix(1, 20, 0)
  call mxCopyReal8ToPtr(f_x, mxGetPr(M_x), 20)
  status = engPutVariable(ep, 'X', M_x)
  if (status /= 0) then 
         write(6,*) 'engPutVariable failed'
         stop
  endif    

  M_y = mxCreateDoubleMatrix(1, 20, 0)
  call mxCopyReal8ToPtr(f_y, mxGetPr(M_y), 20)
  status = engPutVariable(ep, 'Y', M_y)
  if (status /= 0) then 
         write(6,*) 'engPutVariable failed'
         stop
  endif    

  
  !传达绘图指令
  if (engEvalString(ep,' pcolor(T); figure(2);plot(X,Y); ') /= 0) then
         write(*,*) 'engEvalString failed'
         stop
  endif
  
  !关闭引擎
  write(*,*) 'please press <Enter> to continue'
  read(*,*)      
  call mxDestroyArray(T)
  status = engClose(ep)
  if (status .ne. 0) then 
       write(6,*) 'engClose failed'
       stop
  endif


stop
end[/quote]
先谢过,再试试!

10 楼

[quote]没有在工程里面添加matlab相关的lib,请加入libeng.lib libmx.lib libmat.lib三个lib库
具体怎么加应该知道吧?
我不知道你的编译器是什么,CVF下是
link->Object/library modules->libeng.lib libmx.lib libmat.lib
空格隔开[/quote]
我的是Digitial Visual Fortran 6.0

我来回复

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