如何使用.mexw32的函数文件

如何使用.mexw32的函数文件,第1张

matlab里面无法单步调试mex函数,故需转到VS上面调试,这里采用VS2010。

参考网上很多人写的方法但都很乱,杂,试了多次都没有成功。今天终于解决了,现把方法记录下来。

1、VC中编写Mex函数

新建一个win32 dll 空项目。

2、添加源文件Test.cpp,编写MEX函数,MEX函数编写方法这里不赘述了。

3、配置项目属性。

打开项目属性配置页,C++ ->附加包含目录 加入MATLAB安装目录下的 \extern\include 路径。

连接器 ->附加库目录 加入MATLAB的 \extern\lib\win32\microsoft 路径。

连接器 ->输入 ->附加依赖项 输入libmx.lib libeng.lib libmat.lib libmex.lib 这四个lib文件。

在Linker-General-Output File:改成

 .\Debug\(ProjectName).mexw32(64位系统相应改成64)

Source Files- Add - New Item新建模块定义文件Test.def

并为其添加内容

LIBRARY "Test"

EXPORTS mexFunction

在Linker-Input-Module Definition File添加:Test.def

4、F7生成解决方案,如果以上都正确,便会在工程Debug目录下生成一个(ProjectName).mexw32文件。

5、在VS中单步调试MEX函数。

将matlab的current folder 设置成mexw32文件所在的路径,即Debug目录。(这步非常重要,要不无法调试调用)

vs2010-Tools-附加到线程 Attach to process-选择matlab。

在源代码Test.cpp里设置断点。

在matlab工程里输入代码或者函数(即mexw32文件的文件名,这里为ProjectName),即会跳转到vs的断点处。

然后按F10便可单步执行。

6、每次修改MexFunction所在的.cpp文件后,重新编译生成解决方案前都需要先在matlab工程下clear一下,即

clear (ProjectName).mexw32

注意:这步非常重要,因为matlab在调用该mex函数后还一直占用,未释放,必须要clear下,vs中才可重新编译生成解决方案。

好的,按照以上方法就可以任意编写可调试的mex函数啦。

调试成功后把(ProjectName).mexw32文件copy到任意matlab工程里,就可以像函数调用一样任意使用啦。

[参考]

1、VS2010中C++创建图解

2、Matlab中MEX文件的编写与调试

编译libsvm

输入:mex -setup

输入或点击:mex -setup C++

输入:make

4.测试

[heart_scale_label,heart_scale_inst] =libsvmread('heart_scale')

model = svmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07')

[predict_label, accuracy, dec_values] = svmpredict(heart_scale_label, heart_scale_inst, model)

1.下载好libsvm包

下载libsvm-3.21到随意一个地方,比如到matlab安装路径下的 toolbox下——D:\MATLAB\R2014A\toolbox\下,并解压。

打开matlab,将libsvm-3.21\matlab 添加到路径,比如将:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab 添加到路径。

2.setup 第一次尝试

若提示没有C++编译器,则根据提示的网址去下载 winsdk_web.exe,然后 双击运行winsdk_web.exe,安装到最后若提示失败,则去卸载自带的visual studio 和 .netframework 4,然后再运行 winsdk_web.exe,提示缺少 .netframework 4,则自行下载安装,反复运行 winsdk_web.exe。

直到运行 winsdk_web.exe 时出现如下图所示情况,说明距成功更近一步了,

选择 Change,下一步,

勾选上 visual C++ compilers 和 microsoft visual C++ 2010,下一步,

最后提示成功安装。

2. setup

打开Matlab中,进入LIBSVM根目录下的matlab目录(如D:\MATLAB\R2014A\toolbox\libsvm-3.21),在命令窗口的输入mex -setup 输出为:

>>mex –setup

MEX 配置为使用 'Microsoft Windows SDK 7.1 (C)' 以进行 C 语言编译。

Warning: The MATLAB C and Fortran API has changed to support MATLAB

variables with more than 2^32-1 elements. In the near future

you will be required to update your code to utilize the

new API. You can find more information about this at:

http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.

要选择不同的语言,请从以下选项中选择一种命令:

mex -setup C++

mex -setup FORTRAN

继续:

>>mex -setup C++

MEX 配置为使用 'Microsoft Windows SDK 7.1 (C++)' 以进行 C++ 语言编译。

Warning: The MATLAB C and Fortran API has changed to support MATLAB

variables with more than 2^32-1 elements. In the near future

you will be required to update your code to utilize the

new API. You can find more information about this at:

http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.

3.编译

执行 make,输出如下:

>>make

使用 'Microsoft Windows SDK 7.1 (C)' 编译。

MEX 已成功完成。

使用 'Microsoft Windows SDK 7.1 (C)' 编译。

MEX 已成功完成。

使用 'Microsoft Windows SDK 7.1 (C++)' 编译。

找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmtrain.exp

找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmtrain.exp

MEX 已成功完成。

使用 'Microsoft Windows SDK 7.1 (C++)' 编译。

找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmpredict.exp

找不到 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab\svmpredict.exp

MEX 已成功完成。

>>

4.重命名

忽略错误(找不到……),继续,编译完成后,在当前目录下(libsvm-3.21/matlab下)会出现svmtrain.mexw64、svmpredict.mexw64 或者svmtrain.mexw32、svmpredict.mexw32 ,把文件名svmtrain和svmpredict 相应改成 libsvmtrain 和 libsvmpredict。

这是因为Matlab中自带有SVM的工具箱,其函数名字就是svmtrain和svmpredict,和 libsvm 默认的名字一样.

5.测试是否安装成功libsvm

libsvm 软件包中自带有测试数据,即软件包根目录下的 heart_scale 文件。

在matlab运行代码,输出如下:

>>[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale')

>>model = libsvmtrain(heart_scale_label, heart_scale_inst, '-c 1 -g 0.07')

*

optimization finished, #iter = 134

nu = 0.433785

obj = -101.855060, rho = 0.426412

nSV = 130, nBSV = 107

Total nSV = 130

>>[predict_label, accuracy, dec_values] = libsvmpredict(heart_scale_label, heart_scale_inst, model)

Accuracy = 86.6667% (234/270) (classification)

>>

OK ,perfect ! Congratulations to you!

如果遇到:

>>[heart_scale_label, heart_scale_inst] = libsvmread('heart_scale')

Invalid MEX-file 'C:\Users\jiao\Documents\MATLAB\libsvm-3.20\matlab\libsvmread.mexw64': 找不到指定的模块。

则把 D:\MATLAB\R2014A\toolbox\libsvm-3.21\matlab 文件夹添加到路径就可以了。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11426116.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存