主题:[讨论]Fortran和matlab的混合编程
Amely
[专家分:10] 发布于 2011-06-13 15:31:00
[em10]有做matlab和Fortran混合编程的吗?主要是在Fortran中调用matlab的函数,自己写的或者matlab自带的函数。本人刚开始接触,可以一起讨论一下。[color=008000][/color]
回复列表 (共12个回复)
沙发
Amely [专家分:10] 发布于 2011-06-13 15:35:00
Fortran在数值数值计算中的地位是不可取代的,同时Fortran语法简单,明了。在理工科的实验中主要是以Fortran编程为主,但是matlab强大的绘图和函数库是Fortran所不能比的,但是两者之间是怎么结合起来的,请大侠指教啊。我qq是1093428071,望各位不吝赐教。
板凳
aliouying [专家分:1150] 发布于 2011-06-13 16:50:00
MATLAB帮助很详细,论坛有帖子,可以搜一下
3 楼
Amely [专家分:10] 发布于 2011-06-13 18:33:00
[quote]MATLAB帮助很详细,论坛有帖子,可以搜一下[/quote]
matlab的帮助我总是看不很懂,你给给个例子吗?mbuild -setup的时候找不到编译器。我安装的是Fortran6.0和VS 2005.
4 楼
dongyuanxun [专家分:7180] 发布于 2011-06-13 18:58:00
matlab每个版本支持的编译器不同
5 楼
Amely [专家分:10] 发布于 2011-06-13 20:41:00
是的,我用的是2010r的,在文章上看到的一些例子就不能用,[em17]。如果学习缓和编程的话,有较好的材料推荐吗?谢谢!
6 楼
Amely [专家分:10] 发布于 2011-06-13 21:08:00
[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 楼
aliouying [专家分:1150] 发布于 2011-06-14 12:39:00
没有在工程里面添加matlab相关的lib,请加入libeng.lib libmx.lib libmat.lib三个lib库
具体怎么加应该知道吧?
我不知道你的编译器是什么,CVF下是
link->Object/library modules->libeng.lib libmx.lib libmat.lib
空格隔开
8 楼
aliouying [专家分:1150] 发布于 2011-06-14 13:01:00
汗,你给的代码我编译不过,应该是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 楼
Amely [专家分:10] 发布于 2011-06-15 08:49:00
[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 楼
Amely [专家分:10] 发布于 2011-06-15 08:53:00
[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
我来回复