利用Matcom实现基于MATLAB的混合编程

article/2025/8/18 3:56:24
利用Matcom实现基于MATLAB的混合编程
来源: 神经网络 作者:AI俱乐部 网友评论 0 条 浏览次数 42
<script> remark_look('re_look.php?cid=+17+&tid=+1843+'); </script>

Matcom是mathTools公司推出的最早的Matlab到C++的编译器。后来,由于Mathtools被Matlab公司收购,Mtacom对Matlab 5.3以后的版本就没有推出新的版本。相比Matlab自带的编译器Compiler,用Matcom转化代码要简单和方便得多;且对于采用C++的工程和研究人员来说Matcom的C++矩阵库(Matrix Lib)依然有非常大的利用价值。
通过Matcom连接M函数这类脚本语言或者高级算法语言有三种办法:—是将M文件编译成C++代码,然后在C++工程中插入这些代码,最后编译成为独立的可执行程序;二是直接在C++程序中使用Matcom提供的Matrix<lib>,方法与一相似,但常用。最后一种是利用MIDEVA直接生成EXE文件,然后在VC中通过shell调用,方法简单,但通用性差,仅适用于VC中调用Matlab实现图形显示的场合。
Mideva软件平台本身的功能相当强大,提供近千个Matlab的基本功能函数,通过必要的设置,就可以直接实现与C++的混合编程,而不必再依赖Matlab;同时,Mediva还提供编译转换功能,能够将Matlab函数或编写的Matlab程序转换为C++形式的DLL,从而实现脱离Matlab环境对Matlab函数和过程的有效调用,这样就有可能实现对Matlab强大的工具箱函数的利用。
  Mideva的缺点是C++与Matlab混合编写的应用软件必须携带必要的DLL,从而增大了软件的体积(约4M),同时也不能对所有的Matlab函数提供支持,例如采用类库进行设计的部分函数。
本节将以VC++6.0和Matcom为例,1,详细介绍如何利用Matcom进行VC++与Matlab的联合编程(即一);2 ,介绍一下在VC++中怎样使用Matcom C++矩阵库(即二)。
 1. 目前,Matcom的最高版本为4.5。首先安装Matcom 4.5,如下图

 

 

 

 

 

 


安装Matcom前要已求安装VC++6.0。在安装过程中出现选择编译器对话框,选择”是” 如下图:


出现选择是否安装了Matlab时,如果本机上安装的是Matlab 5.3版本,可以选择“是(Y)”确认,因为Matcom4.5不支持Matlab 6.1以上的版本。其他选项采用默认设置。Matcom可以独立于Matlab运行,但需要外部的C++编译器,指定Matlab的位置是为了让编译文件中需要的一些系统函数找到路径用的。
安装完成后,在“<Matcom 根目录>lib”下,可以找到使用MatcomC++矩阵库(Matrix Lib)的头文件matlib.h和v4501v.lib文件,在Windows操作系统目录的system32目录下,可以找到使用MatcomC++矩阵库的动态链接库文件v4501v.dll。启动界面MIDEVA,如下图。MIDEVA集成开发环境包括命令行窗口、变量列表窗口、命令列表窗口和编译链接信息窗口等几部分,并有详细的帮助文档。
 

 


Matcom命令输入方法与Matlab相同。如果安装在中文版操作系统时,输入命令前加一空格,否则显示为乱码。

下面详细介绍如何将m文件编译后放入VC++中。
启动MIDEVA ,File->New,新建如下huatu.m文件。
m文件保存的默认位置为:matcom安装目录matcom45,生成的C++文件保存的默认位置为matcom安装目录matcom45Debug,本例matcom安装目录为C盘 即 C:matcom45Debug,在该目录下将会产生huatu.h、huatu.cpp、huatu.r 、huatu.obj文件。

在VC++中用MFC Wizard(exe)创建一个基于对话框名为Example的工程。在面板上添加一个ID为IDC_BUTTON1按扭。

C:matcom45Debug目录下的huatu.cpp文件的内容拷贝到void CExamleDlg::OnButton1()如下,
void CExampleDoc::OnButton1()
{
dMm(x); dMm(y);

#line 1 "c:/matcom45/huatu.m"
call_stack_begin;
#line 1 "c:/matcom45/huatu.m"
_ x = colon(-2.0,0.1,2.0);
#line 2 "c:/matcom45/huatu.m"
_ y = power(x,2.0);
#line 3 "c:/matcom45/huatu.m"
_ display( plot((CL(x),y)) );
call_stack_end
}

将C:matcom45lib下的matlib.h 和v4501v文件和C:matcom45debug下的huatu1.h文件拷贝到工程Example目录下,然后在VC中将库文件和头文件加入到工程中:工程->添加工程->Files,选择刚刚拷贝到Example目录下的matlib.h 、v4501v和huatu1.h文件
五,在ExamleDlg.cpp中加入如下代码:
#include "matlib.h"
#include "huatu.h"
在void CExamleDlg::OnButton1()中分别添加一个初始化类库调用函数”initM(MATCOM_VERSION)”和一个结束类库调用函数”exitM()”如下。
void CExampleDoc::OnButton1()
{
initM(MATCOM_VERSION)
dMm(x); dMm(y);

#line 1 "c:/matcom45/huatu.m"
call_stack_begin;
#line 1 "c:/matcom45/huatu.m"
_ x = colon(-2.0,0.1,2.0);
#line 2 "c:/matcom45/huatu.m"
_ y = power(x,2.0);
#line 3 "c:/matcom45/huatu.m"
_ display( plot((CL(x),y)) );
call_stack_end
exitM()
}
运行程序,点击画图按扭得图:
 


Matcom C++ 矩阵库的初始化和释放是成对出现的,在初始化时,调用函数initM(Matcom_VERSION),在需要释放的时候,调用函数exitM()即可。Matcom C++ 矩阵库的初始化需要一定的时间,为了加快程序的执行速度,应尽量减少Matcom C++ 矩阵库的初始化的次数。所以开发人员应仔细考虑Matcom C++ 矩阵库生存周期的长度,在Matcom C++ 矩阵库生存周期的开始初始化C++库,在生存周期结束的时候,释放 C++库。这样虽然会占用一定的内存,但是会提高程序运行的速度。
Matcom不但可以生成C++文件,而且还可以生成exe文件和dll文件。如图所示:
 


2.下面通过一个例子来说明Matcom C++ 矩阵库在Visual C++ 6.0中使用的过程:
在Visual C++ 6.0中,新建一个Win32 Console工程,如下图。实际上在任何类型的 C++工程中都可以使用Matrix<lib>,为了简单我们以控制台程序为例。
 


二.设置工程,打开Project|Setting的link标签,作如下修改见下图:

打开C/C++标签,作如下修改见下图:
 


加入头文件matlib.h,看是否成功?不成功检查设置!
在Example.cpp中输入如下程序
#include "stdafx.h"
#include "stdio.h"
#include "matlib.h"
int main(int argc, char* argv[])
{
initM(Matcom_VERSION);
 Mm a;
 a=rand(3,3);
 display(a);
 exitM();
 return 0;
}
输出结果:
ans (3x3)=9 double elements real (72 bytes)=
0.9501    0.4860    0.4565
0.2311    0.8913    0.0185
0.6068    0.7621    0.8214
在这说明一下,Matcom C++矩阵库采用面向对象的设计风格,矩阵数据和操作都封装在类Mm中。当需要创建矩阵的时候,只要声明一个Mm对象实例即可。如:Mm a;

关于Matlab所生成的COM组件,还有以下几个在实践中较为有用的说明:
1. 对于用于生成COM的任何一个Matlab函数,在COM组件中即为一个COM的方法,而Matlab函数中的全局变量(global)则为COM组件的一个属性。这一点对于神经网络编程中颇为有用,比如说,在ANN训练结束后,做仿真(simulate)时,我们需要调用Matlab生成的COM组件,但是,显然我们不能每调用一次COM就读一次ANN的配置(如权重、偏置等项目的值),也不能在VC中出现Matlab的结构体或者类。在这种情况下,我们就可以专门做一个Matlab函数,使用该函数调入ANN配置文件(一般为.mat文件)。而把ANN的配置量声明为全局变量,则可以在仿真函数中直接使用该变量。就像以下的示例:
function y = sim_ann(x)
global net
y = sim(net, x);

function LoadAnnParam
global net
% AnnMat.mat文件中存储了net变量
load AnnMat net

在VC中调用时,设COM对象为comObj,则有以下调用方式:
comObj.LoadAnnParam(); //载入ANN参数
for(int I = 0; I < n; I++)
comObj.sim_ann(1, x, y); //多次仿真ANN

2. 在Matlab中可以自定义数据类型,也就是VC中的类,但是这在生成COM组件时,会出现在load新类的对象时Matlab不认识该类型。这种情况下,我们可以在load该类以前,先初始化一个同名的该类型的对象。比如我们有NewClass这种新类,要load进来一个该类型的名字为NewObj的对象,对象的初始化函数为InitNewClass,则可以:
NewObj = InitNewClass;
Load mat_file NewObj;

3. 另外,在编程过程中曾遇到过这种情况,在生成的COM接口中如果输出变量为结构体时,有时会出现莫名其妙的峰鸣器常鸣的效果。这种情况经过多方查找无法找到原因,如果各位读者在使用中出现类似情况,可以从这个方面考虑问题的解决方法。



http://chatgpt.dhexx.cn/article/fchBdIeF.shtml

相关文章

深度学习(十二):Matconvnet小试牛刀与提特征

该节简单介绍一下如何使用Matconvnet的现有的模型进行图像分类实验以及提取图像对应层的特征。 先来看看如何用训练好的imagenet网络模型进行图像的预测&#xff0c;英文版的官网教程就在这里&#xff1a; http://www.vlfeat.org/matconvnet/quick/ 检测图像分类之前&#x…

项目总结四:神经风格迁移项目(Art generation with Neural Style Transfer)

1、项目介绍 神经风格转换 (NST) 是深部学习中最有趣的技术之一。它合并两个图像, 即 内容图像 C&#xff08;content image&#xff09; 和 样式图像S&#xff08;style image&#xff09;, 以生成图像 G&#xff08;generated image&#xff09;。生成的图像 G 将图像 C 的 内…

Matconvnet学习笔记

Introduction to Matconvnet MatConvNet是实现用于计算机视觉领域的卷积神经网络(CNN)的MATLAB工具箱。自从取得突破性工作以来,CNN在计算机视觉领域有一个重大影响&#xff0c;特别是图像理解&#xff0c;基本上取代了传统图像表示。有许多其他机器学习、深度学习和CNN开源库的…

20190812_解决anaconda下install库的问题

20190812_解决anaconda下install库的问题 一、起因二、开始解决三、解决方法1 创建虚拟环境2 在环境中安装库3 重新配置pycharm中的解释器4 运行5 其他 一、起因 在学习PYQT5例子时&#xff0c;需要在anaconda下使用plotly库 二、开始解决 使用&#xff1a; conda install …

matlab已停止工作 win7 64,win7系统笔记本运行软件弹出“Matlab已停止工作”的解决方法...

很多小伙伴都遇到过win7系统笔记本运行软件弹出“Matlab已停止工作”的困惑吧&#xff0c;一些朋友看过网上零散的win7系统笔记本运行软件弹出“Matlab已停止工作”的处理方法&#xff0c;并没有完完全全明白win7系统笔记本运行软件弹出“Matlab已停止工作”是如何解决的&#…

Map遍历方法及效率

在大学的时候记得学过通过迭代器进行Map的遍历&#xff0c;但是从参加工作后&#xff0c;基本都是通过for循环遍历&#xff0c;没用过迭代器&#xff0c;于是去了解了Map的几种遍历方法并通过运行测试各自的速度。 注意&#xff1a;这里只讲通过遍历同时能过获取key和value的遍…

java map集合如何遍历效率高 java中Map遍历的方式

java map集合如何遍历效率高 java中Map遍历的方式 一、前言 1、在看 《阿里巴巴java开发手册》时候&#xff0c;有一条推荐的规约&#xff1a; 【推荐】使用entrySet遍历Map类集合KV&#xff0c;而不是keySet方式进行遍历。 说明&#xff1a;keySet其实是遍历了2次&#xff0c…

【Java】Map遍历key-value的四种方法

Map遍历key-value的四种方法 &#xff08;1&#xff09;先用keySet()取出所有key值&#xff0c;再取出对应value——增强for循环遍历 &#xff08;2&#xff09;先用keySet()取出所有key值&#xff0c;再取出对应value——使用迭代器遍历 &#xff08;3&#xff09;通过entryS…

SVM——核函数

我们知道&#xff0c;SVM相对感知机而言&#xff0c;它可以解决线性不可分的问题&#xff0c;那么它是怎么解决的呢&#xff1f;它的解决思想很简单&#xff0c;就是对原始数据的维度变换&#xff0c;一般是扩维变换&#xff0c;使得原样本空间中的样本点线性不可分&#xff0c…

SVM核函数概述

特征空间的隐式映射&#xff1a;核函数 咱们首先给出核函数的来头&#xff1a;在上文中&#xff0c;我们已经了解到了SVM处理线性可分的情况&#xff0c;而对于非线性的情况&#xff0c;SVM 的处理方法是选择一个核函数 κ(⋅,⋅) &#xff0c;通过将数据映射到高维空间&#x…

聚类算法之核函数

一&#xff1a;监督学习与无监督学习 1&#xff0c;监督学习 监督学习就是人们常说的分类&#xff0c;通过训练已有样本得到一个最优模型&#xff0c;利用该模型将输入转化成输出&#xff0c;对输出进行判断&#xff0c;从而实现分类&#xff0c;也就是具有了对未知数据进行分类…

svm核函数的理解和选择

特征空间的隐式映射&#xff1a;核函数 咱们首先给出核函数的来头&#xff1a;在上文中&#xff0c;我们已经了解到了SVM处理线性可分的情况&#xff0c;而对于非线性的情况&#xff0c;SVM 的处理方法是选择一个核函数 κ(⋅,⋅) &#xff0c;通过将数据映射到高维空间&#x…

matlab rbf核函数,四类核函数(Sigmoid+RBF)

Q:有个疑问就是,模型本身不是线性的,为什么一定要先用线性模型做? A:有核函数和泰勒展开等等,可以无限逼近转化成线性? 小知识: 1.Sigmoid函数,即f(x)=1/(1+e-x)。是神经元的非线性作用函数。广泛应用在神经网络中。又叫Logistic函数。 机器学习中一个重要的预测模型逻辑…

SVM的核函数详解

文章目录 1、核函数背景核函数正式定义 2、高斯核函数2.2 参数带宽 σ \sigma σ的影响2.3高斯核函数的实际意义 2、多项式核函数4、参考资料 1、核函数背景 本文为核函数进阶教程&#xff0c;希望看文章之前最好对核函数有一些最基本的了解&#xff0c;不然有些地方可能会看不…

常见核函数

这篇博文开始的例子就很好地揭示了核函数的简单原理&#xff0c;写得很好&#xff01; 原地址&#xff1a;https://blog.csdn.net/zkq_1986/article/details/52448238 1 核函数K&#xff08;kernel function&#xff09;定义 核函数K&#xff08;kernel function&#xff09;就…

CUDA核函数

核函数是指在GPU端运行的代码&#xff0c;核函数内部主要干了什么&#xff1f;简而言之&#xff0c;就是规定GPU的各个线程访问哪个数据并执行什么计算。 文章目录 一、CUDA规范二、核函数内部线程的使用2.1 如何启动核函数 一、CUDA规范 编写核函数必须遵循CUDA规范&#xff…

SVM与核函数

文章目录 核技巧与SVM核函数本质线性可分的SVM与硬间隔最大化SVM对偶算法核技巧高斯核多种不同的核函数比较soft margin 问题核函数 核函数 核技巧与SVM SVM原本是用来解决二分类的分类模型 它和感知机不同的一点是它取到的分类器是在特征空间上的最大间隔的分类器 而为了解决…

核函数(核技巧)

核技巧Kernel trick 背景及含义&#xff1a; 对于 原始样本空间内或许不存在能正确划分两类样本的超平面 问题&#xff0c;考虑 将样本从原始空间映射到一个更高维的特征空间&#xff0c;使得样本在这个特征空间内线性可分。 令 ϕ ( x ) \phi(x) ϕ(x)表示将x映射后的特征向量…

了解核函数

1、核函数定义&#xff1a; 核函数包括线性核函数、多项式核函数、高斯核函数等&#xff0c;其中高斯核函数最常用&#xff0c;可以将数据映射到无穷维&#xff0c;也叫做径向基函数&#xff08;Radial Basis Function 简称 RBF&#xff09;&#xff0c;是某种沿径向对称的标量…

核函数

对于优化问题&#xff1a; 的求解需要计算这个内积&#xff0c;而如果输入样本线性不可分的话&#xff0c;我们采取的方法是通过函数映射将输入样本映射到另外一个高维空间并使其线性可分。 以库克定律为例(http://zh.wikipedia.org/zh-cn/%E9%9D%99%E7%94%B5%E5%8A%9B)&#x…