潜水时间太长了,咱也发篇原创。VC与Matlab混合编程——基于编译m函数为DLL的方法
VC与Matlab混合编程的方法有很多,引擎功能虽强但太慢,而COM又比较麻烦(VB、DELPHI/C++Builder的使用简单些)。今天介绍一种VC与Matlab混合编程的方法。通过将m函数编译成标准的dll动态链接库,实现在VC中对Matlab模块的方便调用。
本文的环境为VC++ 6.0、Matlab 6.5。不同的环境在实现起来可能略有不同。
1 设置Matlab编译器
在Matlab命令窗口中输入mbuild –setup,系统提示“是否对安装的编译器进行配置?”,输入y,显示系统中安装的编译器。选择Microsoft Visual C/C++ version 6.0 in D:\Program Files\Microsoft Visual Studio的编译器,并确定。(注:此步过程只需进行一次。)
2 编写m函数
作为示例,这里编写了一个简单的m函数:
function b = myFunc(a)
b = a.*a;
保存文件名为myFunc.m。
3 编译m函数为DLL
在Matlab命令窗口中输入mcc -B csharedlib:myDLL myFunc.m。其中,myDLL是生成的dll的文件名,这个名子可以更改。
编译完成后,将myFunc.m所在的文件夹下生成9个文件。其中,myDLL.dll、myDLL.lib和myDLL.h三个文件是我们下面所要使用的。
4 建立测试工程
启动VC。选择文件菜单下的新建命令,创建一个Win32 Console Application。在工程类型对话框中选择A simple application。点击完成。
5 设置VC++6.0工作环境
首先设置include文件搜索路径。选择VC的Tools菜单下的Options命令,打开工程设置对话框。点击“目录”选项卡,把D:\MATLAB6p5p1\extern\include路径添加到列表框中。点击确定。
然后添加Lib文件到工程中。选择工程菜单下添加到工程命令,选择Files选项,将D:\MATLAB6p5p1\extern\lib\win32\microsoft\msvc60文件夹下的libmatlbmx.lib文件和上边生成的myDLL.lib文件添加到工程中。
最后,将myDLL.h、myDLL.dll文件拷贝到工程文件夹下。
6 编写测试代码
首先添加#include “myDLL.h”。
myDLL.h输出了几个函数,工程中用到的函数有三个,它们分别是:myDLLInitialize()、myDLLTerminate()和mlfMyfunc()。这三个函数的作用分别是初始化DLL库、结束DLL库和m函数myFunc对应的C函数,这个C函数也是我们所需要的。
和m函数相比,函数名有了一些变化。主要的变化是加上了mlf的前缀。这个前缀应该是MatLab Function的简写。
然后在main()函数内添加代码。总的main()函数代码清单如下所示:
int main(int argc, char* argv[])
{
myDLLInitialize(); //库初始化
double _x[5] = {1, 2, 3, 4, 5}; //输入数组
double _y[5]; //输出数组
mxArray* x = mxCreateDoubleMatrix(1, 5, mxREAL); //创建1*5矩阵
memcpy(mxGetPr(x), (void*)_x, sizeof(_x)); //拷贝输入数据
mxArray* y = mxCreateDoubleMatrix(1, 5, mxREAL); //创建1*5矩阵
y = mlfMyfunc(x); //调用m函数
memcpy(_y, mxGetPr(y), sizeof(_y)); //拷贝输出数据
myDLLTerminate(); //结束DLL库
printf("%f\n", _y[0]); //打印结果
printf("%f\n", _y[1]);
printf("%f\n", _y[2]);
printf("%f\n", _y[3]);
printf("%f\n", _y[4]);
return 0;
}
这些代码在理解上应该不是很困难。需要说明的有一点:mxArray可认为是C中与Matlab中相对应的矩阵类型。在C中,变量需要先定义,后使用。另外,在定义mxArray类型的变量后,需要对其进行初始化,指定它的类型和尺寸。mxGetPr()函数用于获取mxArray类型数据的实部首地址,因为内存是连续分配的,所以可以使用内存拷贝函数将一个数组的数据拷贝给它。
7 发布
如果仅是在本机上使用DLL,那么以上六步即可满足要求。如果要在没有安装Matlab的计算机中使用此DLL,还需要随DLL拷贝一些动态链接库等文件。
双击D:\MATLAB6p5p1\extern\lib\win32文件夹下的mglinstaller.exe文件,即可生成所需的文件。
mglinstaller.exe会在D:\MATLAB6p5p1\extern\lib\win32文件夹下生成两个新的文件夹,它们的名称分别是bin和toolbox。发布时只要把这两个文件夹连同DLL一起拷贝就可以了。
所需要文件数目是很大的,但应该可以作很大的精简。因为Matlab输出这些文件,与生成的myDLL.DLL没有什么关系。这个可以作进一步的实验和研究。
相关推荐
VS或VC调用matlab程序dll路径配置及错误分析
vc6.0版本的 1:在matlab中选择compiler。 在命令行窗口输入:mex -setup 按照提示选择vc6.0.由于使用的是matlab7,不识别vs2010和2008,无奈有装的vc6.0。但听说最新版的matlab可以识别。 2:选择builder. 输入:mbuild -setup 同样选择vc6.0
vc与matlab混合编程版本问题解决方法(接着上一篇)
vc与matlab混合编程版本问题解决方法 (首先声明本人没有经常使用matlab,不是很熟悉matlab的使用情况,但以下是这三天折腾完发现的问题,希望能对大家有所帮助。) 由于matlab的版本比较多,造成了混合编程时会碰到很多问题。查找了很多资料发现matlab的改变主要分界线是7.0版本。Matlab7.0以前的编程库文件、头文件的定义与之后的版本有点区别。通过查找,网上的应用实
三相PWM整流器双闭环仿真(Simulink仿真实现)
内容概要:本文系统介绍了基于Simulink的三相PWM整流器双闭环控制系统的仿真实现方法,重点对比了模糊PID控制与传统PID控制在电力电子系统中的动态性能差异,涵盖系统建模、控制器设计、仿真搭建与结果分析等关键环节。同时拓展提供了丰富的科研仿真资源,覆盖无刷直流电机控制、智能优化算法、机器学习、图像处理、路径规划、通信与信号处理、电力系统管理等多个技术方向,形成面向科研与工程应用的综合性Matlab/Simulink仿真支持体系。; 适合人群:电气工程、自动化、控制科学与工程等相关专业的研究生及科研人员,具备一定Matlab/Simulink操作基础,正在开展电力电子变换、电机驱动控制或智能控制算法研究的技术工作者。; 使用场景及目标:①掌握三相PWM整流器双闭环系统的建模与仿真流程;②深入理解模糊PID相对于传统PID在抗扰动、响应速度和稳定性方面的优势;③借鉴文中提供的多样化仿真案例,推动智能算法在复杂系统控制中的创新应用与科研成果转化。; 阅读建议:建议结合文档中提供的网盘资源与公众号资料,按照目录结构循序渐进地学习各仿真模型的设计思路与实现细节,动手复现并调试代码,强化对控制策略本质与系统动态特性的理解,提升科研仿真能力。
WeVisOne-VL一套模型,把检测、分割、抠图和OCR都接到了一起
WeVisOne-VL 想解决的不是单点能力更强,而是把目标级理解和像素级理解放进同一套视觉语言模型里:从点、框,到 mask,再到连续 alpha matte,都能统一生成。 它覆盖检测、指代表达定位、计数、点选、OCR、分割和抠图,最大的看点是输出粒度可以按需求切换,而且遇到图里根本不存在的目标时,能直接返回 None,尽量避免“看错了还硬答”的幻觉。 技术上,它把任务统一写成结构化文本预测,再配一个只有 960 万参数的轻量像素解码器,不依赖 SAM,也能把框进一步细化成 mask 和 alpha matte。项目同时放出了 2B、4B 权重、推理包、Cookbooks、评测流程和 Gradio Demo;按仓库给出的结果,4B 版本在检测、指代定位、计数、OCR、分割和抠图等多项基准上都压过一批强开源基线。 更值得琢磨的是它背后的数据引擎:用知识图谱驱动概念发现,再结合专家模型与 VLM 校验,把框扩展到 mask 和高质量透明度标注,累计覆盖超过 1 亿张图像。这类工作真正有价值的地方,不只是又做出一个大模型,而是让“看见什么”和“精确到哪一层”第一次被放进一条顺滑的产品链路里。
用于非线性多载波卫星信道的多输入多输出符号速率信号数字预失真器DPD(Matlab代码实现)
内容概要:本文介绍了一种针对非线性多载波卫星信道的多输入多输出(MIMO)符号速率信号数字预失真器(DPD)的设计与实现方法,采用Matlab代码进行仿真验证。该DPD技术旨在有效补偿高功率放大器在多载波信号传输中引入的非线性失真,提升卫星通信系统的线性度与传输效率。方案聚焦于符号速率层面的处理,相较于传统的采样速率DPD,降低了计算复杂度,同时结合MIMO架构以适应现代宽带卫星通信的需求,具备良好的工程应用前景。文中提供了完整的Matlab实现代码,便于研究人员进行复现、测试与进一步优化。; 适合人群:从事通信系统设计、卫星通信、射频工程及相关领域的研究生、科研人员与工程师,具备一定的信号处理和Matlab编程基础;; 使用场景及目标:①研究非线性失真对多载波卫星通信系统的影响机制;②设计并验证适用于MIMO架构的低复杂度符号速率数字预失真算法;③通过Matlab仿真平台开展算法性能评估与优化,推动其在实际卫星通信系统中的应用落地;; 阅读建议:建议结合通信原理、非线性系统建模与数字信号处理相关理论同步学习,重点关注DPD结构选择、模型参数辨识方法及仿真结果分析,动手运行并调试所提供的Matlab代码以加深理解。



