网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月07日漏签0天
matlab吧 关注:291,876贴子:1,658,381
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 7回复贴,共1页
<<返回matlab吧
>0< 加载中...

matlab 调用fortran生成DLL

  • 只看楼主
  • 收藏

  • 回复
  • s3232913
  • 武林新贵
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
版本:matlab 2010b,vs2008+IVF11.0
对于简单的问题,例如求个c=a+b的,用vs2008+IVF11.0生成DLL和用matlab调用没什么问题,如下:fortran代码:
subroutine add(x,y,z)
!DEC$ ATTRIBUTES C,DLLEXPORT :: add
!DEC$ ATTRIBUTES REFERENCE ::z !返回值,传地址
implicit none
integer::x,y
integer::z
z=x+y
end subroutine
然后编译成DLL文件
对应的matlab 调用代码如下:
clear all
clc
warning off %#ok
loadlibrary(*test.dll*, *test.h*); %******加载dll及对应的头文件*********
x=0;
A=calllib(*test*, *add*, 5,3,x);%****matlab里的calllib函数返回******
disp(*结果是*);disp(A)
unloadlibrary test
结果当然是3+5=8了,test.h头文件内容为:void add(int,int,int*);
%=======================================
%=======================================
现在问题来了,如果我要求一个矩阵的逆,用的是fortran自己的IMSL库里的函数,VS2008并没有IMSL库,因为用是的IVF,以前的CVF编辑器有,所以下载安装了一个,变量路径也设置了,然后就是fortran代码:
subroutine GJ_inv (A,n)
use imsl
!DEC$ ATTRIBUTES C,DLLEXPORT :: GJ_inv
integer n
double presicion A(n,n)
A=.i.A
end subroutine GJ_inv
在这里,编辑不通过,说是 imsl 路径不对
问题:对于要调用IMSL库的,如何编写?


  • Gerry
  • 初涉江湖
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
建议使用Inter Visual Fortran 自带的MKL函数库,求逆也很容易实现。
一、IntelVisual Fortran 2011(x64)- 的编译平台,改为64位。

二、打开Microsoft Visual studio 菜单: 项目->属性界面, Fortran->library里把Use Intel Math Kernel Library 将NO改为Parallel(Qmkl:parallel), 见下面截图。

三、继续在属性页里设置Linker -> input中的Additional Dependencies加上mkl_lapack95_lp64.lib

四、运行下面例子程序吧。
PROGRAMtest_lapack95
USE MKL95_PRECISION
USE MKL95_LAPACK
IMPLICIT NONE
INTEGER,PARAMETER :: N = 3
REAL,DIMENSION(N,N) :: toeplitz, a
integer,dimension(N) :: ipiv
real,dimension(N) :: work
INTEGER :: i, j, info
toeplitz=reshape((/3,-1,-1,4,-2,-1,-3,2,1/),(/N,N/))
toeplitz=transpose(toeplitz)
a = toeplitz
write(*,'(/,2x,a)')'a='
write(*,10)((a(i,j),j=1,N),i=1,N)
10 format(3x,f6.2)
! -------------------------------
! LAPACK F95
! -------------------------------
call getrf(a,ipiv,info)
call getri(a,ipiv,info)
! -------------------------------
write(*,'(/,2x,a)')'Inv(a)='
write(*,10)((a(i,j),j=1,N),i=1,N)
END PROGRAMtest_lapack95


2025-08-07 21:44:36
广告
不感兴趣
开通SVIP免广告
  • 古111
  • 无名之辈
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
能教我一下吗?这个我没找到应该咋弄。万分感谢!!!


  • anglove123
  • 初涉江湖
    1
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
您好!在你这个编程过程中"test.h头文件内容为:void add(int,int,int*);"是怎么操作的?是在matlab程序中声明吗?


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 7回复贴,共1页
<<返回matlab吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示