matlab 2012 vs2010混合编程

本文介绍如何在Win7环境下使用Matlab2012a与VS2010进行混合编程,包括配置环境、编译Matlab程序并将其集成到C++项目中的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.sina.com.cn/s/blog_67dd3b950101er5t.html

1、背景

众所周知,matlab在处理矩阵、数学计算、计算机仿真、图像处理等方面有着 c c++无可比拟的优势,但是做成系统供使用时,又显得过于粗糙,为了使用起来高大上,计算起来有简单,方便。无疑,c++ 与matlab混合编程将会使非常靠谱的选择。

这里暂且不论所谓的matlab效率低,c/c++效率高的问题,自我感觉,以我目前编码的功底,所编写的代码的效率远远不及matlab提供的代码的效率。除非你是大牛,或者你是人云亦云,所以能用matlab混合c++编码还是很不错的选择,话不多说,我们开始讨论正题。

2、我使用的版本是matlab2012与vs2010混合编程的。

软件的下载这里就不多说了,我相信看这篇教程的你,这两个软件已经安装的妥妥当当的了。


首先说一下我的环境:Win7+VC2010+Matlab2012a。

     首先,建立一个matlab程序,就是你需要调用的matlab程序,我用了一个简单的例子,如下:

    function [c]=add(a,b)
    c=a+b;
     return;
    end

这个是求两个矩阵的和的一个函数,建立好之后就开始编译了,在Matlab主面板中输入mex-setup,选择编译器,如图:

[转载]vc2010中如何调用matlab2012a中生成的dll文件选择y,从本地选择,接下来选择编译器,如下图:

[转载]vc2010中如何调用matlab2012a中生成的dll文件选择2,本地vc编译器,之后对信息进行确认,如下图:

[转载]vc2010中如何调用matlab2012a中生成的dll文件

选择y,选择完了再对mbuild进行选择,在Matlab主面板里面输入:mbuild-setup,和编译器一样,进行选择,操作一模一样,这里就不在啰嗦了,完了之后就开始编译文件了,

在主面板里面输入 mcc -W cpplib:add -T link:libadd.m,其中,前一个add是编译产生的文件名,后一个add.m是你编写的matlab源文件,接下来就是等待编译了,大概需要编译个几分钟,完了之后就会在源文件的目录下面产生一些文件,如下图:

[转载]vc2010中如何调用matlab2012a中生成的dll文件

但是,我们需要的只有三个文件,.dll、.lib、.h文件,其他的可要可不要。好了,源文件已经编译好了,接下来就是对VC环境进行配置了,再次声明,我的平台是VC2010+Matlab2012a,首先创建一个工程,然后右键单击工程—>属性—>VC++目录,添加包含目录:D:ProgramFilesMATLABR2012aexterninclude,然后添加库目录:D:ProgramFilesMATLABR2012aexternlibwin32microsoft,C:UsershengfanDesktopadd,注意,前一个是matlab的库目录,后一个是自己的库目录,最好是两个都添加,这个VC++目录就设置好了,接下来还是在属性这里面,选择链接器—>输入,添加附加依赖项:mclmcrrt.lib、mclmcr.lib、add.lib,注意,每个库文件占一行,这样属性就配置好了,接下来就是对文件的引用,将编译得到的三个文件复制(三个一起复制)复制到你的工程文件下面,如果你不清楚复制在哪一个目录下面,就复制在你工程文件的每一个下面吧(正确的方式是:.h文件复制到你的C++源文件目录下面,.lib和.dll文件复制到你的可执行文件中,也就是debug文件夹中,如果怕出错就全部复制),接下来就在C++源文件中添加头文件#include"add.h",下面我将整个程序给出来,如下:

#include <iostream>
#include "add.h"
using namespace std;
int main()
{
 if(addInitialize())    //初始化,这一步是必须的
 {
  cout<<"success!!!"<<endl;
 }
 else
 {
  cout<<"fail!!!"<<endl;
  return 0;
 }

 //定义3个mwArray类型变量,用于存放矩阵
 mwArraya(2,3,mxDOUBLE_CLASS); 
    mwArrayb(2,3,mxDOUBLE_CLASS);
 mwArrayc(2,3,mxDOUBLE_CLASS); 

 double x[] = {1,2,3,4,5,6};
 double y[] = {7,8,9,10,11,12};
 double *sum=newdouble[6];       //注意这个是*类型的

 // 给输入 mxArray 对象赋值
 a.SetData(x,6);
 b.SetData(y,6);

 //调用DLL函数
 add(1,c,a,b);

 //获取结果
 c.GetData(sum,6);
 
 //输出结果
 for (int i=0;i<2;i++)
 {
  for (intj=0;j<3;j++)
   cout<<sum[j*2+i]<<"";
  cout<<endl;
 }
 
 cout<<"it issuccessful !"<<endl;
 return 0;
}

接下来直接执行就可以了,我的程序运行的结果如下:

 

[转载]vc2010中如何调用matlab2012a中生成的dll文件


 

ps说明:配置过程中遇到的问题

配置时经常遇到 LINK2019的错误。这种错误就是典型的lib缺失导入的问题。

复制代码
main.obj : error LNK2019: 无法解析的外部符号 mclGetMatrix_proxy,该符号在函数 "public: __cdecl mwArray::mwArray(unsigned __int64,unsigned __int64,enum mxClassID,enum mxComplexity)" (??0mwArray@@QEAA@_K0W4mxClassID@@W4mxComplexity@@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 mclcppGetLastError_proxy,该符号在函数 "public: static void __cdecl mwException::raise_error(void)" (?raise_error@mwException@@SAXXZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 mclcppCreateError_proxy,该符号在函数 "public: __cdecl mwException::mwException(void)" (??0mwException@@QEAA@XZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 ref_count_obj_addref_proxy,该符号在函数 "public: __cdecl mwException::mwException(class mwException const &)" (??0mwException@@QEAA@AEBV0@@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 ref_count_obj_release_proxy,该符号在函数 "public: virtual __cdecl mwException::~mwException(void)" (??1mwException@@UEAA@XZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 error_info_get_message_proxy,该符号在函数 "public: virtual char const * __cdecl mwException::what(void)const " (?what@mwException@@UEBAPEBDXZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_getV_int_proxy,该符号在函数 "public: class mwArray __cdecl mwArray::GetPromoted(unsigned __int64,...)" (?GetPromoted@mwArray@@QEAA?AV1@_KZZ) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_set_numeric_mxDouble_proxy,该符号在函数 "public: void __cdecl mwArray::SetData(double *,unsigned __int64)" (?SetData@mwArray@@QEAAXPEAN_K@Z) 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 array_ref_get_numeric_mxDouble_proxy,该符号在函数 "public: __cdecl mwArray::operator double(void)const " (??BmwArray@@QEBANXZ) 中被引用
复制代码

这里是因为缺少:mclmcrrt.lib

#pragma comment(lib,"mclmcrrt.lib") 也可能是VS中的平台配置问题,若MATLAB是32位则选择win32,若64位则应选择x64

即可解决。

由于以上连接中采用的是32位,此操作系统为64位,MATLAB R2012a为64位,解决办法:


打开配置管理器,如下:


点击WIN32后的小按钮,点new,加入64位,如下图:


后,单击确定,进行编译,即Build,成功编译。



RDAClient.exe 中的 0x00000000 处有未经处理的异常: 0xC0000005: 在位置 0x0000000000000000 发生访问冲突

是因为在定义mwArray变量之前没有调用 Initialize()函数,在定义之前调用即可解决

### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值