C++的matlab接口转换方法详解

目录
  • 一.工程配置
    • 1.配置生成文件
    • 2.配置附加目录
    • 3.添加附加依赖项
  • 二.接口编写
    • 1.添加头文件
    • 2.接口函数编写
    • 3.输入参数获取
    • 4.出错信息发布函数mexErrMsgTxt,mexWarnMsgTxt
    • 5.输出参数设置
    • 6.参数转置
  • 总结

由于matlab的运算速度较慢,因此常常需要使用c++对关键部分进行运算。Matlab针对这一需求提供了相应的api方便参数传递以及封装。

这里使用的vs工程,对文件进行修改生成.mexw64文件,对于matlab可识别的文件。

这里的操作都是针对vs进行配置和操作。

一.工程配置

1.配置生成文件

右键->属性->常规->配置类型 动态库(.dll)

右键->属性->高级->目标文件扩展名 .mexw64

2.配置附加目录

右键->属性->c++->附加包含目录  添加$(Matlab_Dir)\extern\include; 

其中$(Matlab_Dir)为matlab安装地址

右键->属性->链接器->附加库目录 添加$(Matlab_Dir)\extern\lib\win64\microsoft;;

其中$(Matlab_Dir)为matlab安装地址

3.添加附加依赖项

右键->属性->链接器->输入->附加依赖项

输入libmx.lib;libmex.lib;libmat.lib;libeng.lib;

二.接口编写

1.添加头文件

#include "mex.h"是matlab提供的头文件,利用提供的api进行接口函数编写

2.接口函数编写

入口过程的名称必须是mexFunction,并且包含四个参数

void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]);

nlhs 输出参数个数,plhs 输出参数指针

nrhs 输入参数个数,prhs 输入参数指针

注意: 输出和输入参数的操作都是通过指针的方式进行的MATLAB可以通过这些指针,访问内存中的数据

3.输入参数获取

接口过程要把参数传递给计算过程,还需要从prhs中读出矩阵的信息,这就要用到下面的mx-函数和mex-函数。

  • mxGetM(prhs[0]); 获取其行数
  • mxGetN(prhs[0]); 获取其列数
  • mxGetNumberOfDimensions(prhs[0]);获取其维度

主要介绍的是数据获取的两个函数 mxGetData 和 mxGetPr。

mxGetData返回值为void类型的指针,必须转换为正确数据类型的指针的指针。

mxGetPr返回值为double类型的指针,可以理解为它会自动转换 mxGetData的输出作为double指针。

在使用上这两种都可以获取参数内容。

还有一点需要注意的是,无法对未获取的值进行操作。

下面的代码在调试时会报错,无法对于未保存的变量进行操作。

Number = ((double*)mxGetData(mxGetCell(prhs[0], 19)))[0]-1;

4.出错信息发布函数mexErrMsgTxt,mexWarnMsgTxt

两函数的具体格式如下:

#include "mex.h"

void mexErrMsgTxt(const char *error_msg);

void mexWarnMsgTxt(const char *warning_msg);

其中error_msg包含了要显示错误信息,warning_msg包含要显示的警告信息。两函数的区别在于mexErrMsgTxt显示出错信息后即返回到MATLAB,而mexWarnMsgTxt显示警告信息后继续执行。

5.输出参数设置

对于程序的返回结果需要将其保存在plhs指针当中,而且保存在plhs的返回指针类型必须是mxArray。

这里介绍两个api进行数组,矩阵的创建。由于常用的数据类型为double,这里列举的均为double类型的数组。

plhs[0] = mxCreateNumericArray(3, dims,mxDOUBLE_CLASS, mxREAL);
plhs[1] = mxCreateDoubleMatrix(n, n, mxREAL);    

6.参数转置

由于matlab的数据存储顺序与c++不同,因此在数据输入时需要对数据进行转换。在数据输出传递的时候,同样也需要对数组进行转换。

matlab对于数组存储是按照列进行保存的,而c++是按照行进行保存,因此在数据计算时需要格外注意。

这里是常用的行列转换的代码。

template <class T1, class T2>
void cTranspose3d(T1* dst, T2* src, int srcRow, int srcCol, int channel)
{
	int i = 0, k = 0;
	T1* dst1 = NULL;
	T2* src1 = NULL;
	for (k = 0; k < channel; k++)
	{
		dst1 = dst + k * srcRow * srcCol;
		src1 = src + k * srcRow * srcCol;
		for (i = 0; i < srcRow * srcCol; i++)
		{
			dst1[i] = src1[(i % srcRow) * srcCol + (i / srcRow)];//th/ srcRow//src's  col -> dst's row,th%srcRow//src's   row -> dst's col
		}
	}
}

总结

至此整个接口书写就结束了。该篇教程也是记录一下自己整个学习过程,希望能够看的人一点点帮助。

(0)

相关推荐

  • C++调用Matlab函数求特征值

    最近需要用到C++和Matlab的混编,记录一下学习过程. 要实现的是调用Matlab函数,求矩阵前k个最小的特征值及其特征向量. //C++ #include "engine.h" //使用Matlab引擎需要包含的头文件 #include <iostream> using namespace std; int main() { Engine *m_engine; //创建Matlab引擎 m_engine = NULL; //初始化引擎 if((!m_engine &a

  • ubuntu系统下C++调用matlab程序的方法详解

    前言 最近因为工作的需要在研究C++怎么调用matlab程序,发现网上的资料较少,所以将自己学习的内容总结分享出来,下面话不多说了,来一起看看详细的介绍吧. 实验平台: ubuntu  matlab R2016b   g++ 步骤: 1.    设置matlab的编译器 在命令行窗口下,输入并执行如下命令:mex –setup 在出现的编译器中,选择mex -setup C++ 然后在输入命令:mbuild –setup 同样选择mex -setup C++ -client MBUILD 2. 

  • windows系统下C++调用matlab程序的方法详解

    前言 之前已经跟大家介绍了在ubuntu系统下C++调用matlab程序的方法,需要的朋友们可以参考这篇文章,本文将给大家介绍关于windows下C++调用matlab程序的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 实验平台: matlab R2016b   VS2013 思路: 1. 设置matlab的编译器,使用外部的VC或者gcc等编译器. 2. 编译m文件成dll 3. 设置VS的Include路径和lib链接库的路径 4. 编写C++调用dll 步骤:

  • C++如何调用matlab函数

    本来电脑上安装的是matlab2012b,但是好像2012b只有64位的,故重新安装matlab7,安装完注册一下,cmd cd到matlab7的程序目录bin文件夹下,注册 matlab /regserver,就可以调用matlab了,先测试第一种方法,调用引擎,engOpen.engSetVisible.engClose engEvalString(m_pEngine, "x1 = 0.01 : 0.01 : 10 * pi"); engEvalString(m_pEngine,

  • C++的matlab接口转换方法详解

    目录 一.工程配置 1.配置生成文件 2.配置附加目录 3.添加附加依赖项 二.接口编写 1.添加头文件 2.接口函数编写 3.输入参数获取 4.出错信息发布函数mexErrMsgTxt,mexWarnMsgTxt 5.输出参数设置 6.参数转置 总结 由于matlab的运算速度较慢,因此常常需要使用c++对关键部分进行运算.Matlab针对这一需求提供了相应的api方便参数传递以及封装. 这里使用的vs工程,对文件进行修改生成.mexw64文件,对于matlab可识别的文件. 这里的操作都是针

  • java中的interface接口实例详解

     java中的interface接口实例详解 接口:Java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法. java接口的特点如下: 1.java接口不能被实例化 2.java接口中声明的成员自动被设置为public,所以不存在private成员 3.java接口中不能出现方法的具体实现. 4.实现某个接口就必须要实现里面定义的所有方法. 接下来看一个实现接口的案例: package hello;   interface competer{ //定义接口 void set_comp

  • zookeeper python接口实例详解

    本文主要讲python支持zookeeper的接口库安装和使用.zk的python接口库有zkpython,还有kazoo,下面是zkpython,是基于zk的C库的python接口. zkpython安装 前提是zookeeper安装包已经在/usr/local/zookeeper下 cd /usr/local/zookeeper/src/c ./configure make make install wget --no-check-certificate http://pypi.python

  • Java对象Serializable接口实现详解

    这篇文章主要介绍了Java对象Serializable接口实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 导读 最近这段时间一直在忙着编写Java业务代码,麻木地搬着Ctrl-C.Ctrl-V的砖,在不知道重复了多少次定义Java实体对象时"implements Serializable"的C/V大法后,脑海中突然冒出一个思维(A):问了自己一句"Java实体对象为什么一定要实现Serializable接口呢?&qu

  • 关于TensorFlow新旧版本函数接口变化详解

    TensorFlow版本更新太快 了,所以导致一些以前接口函数不一致,会报错. 这里总结了一下自己犯的错,以防以后再碰到,也可以给别人参考. 首先我的cifar10的代码都是找到当前最新的tf官网给的,所以后面还有新的tf出来改动了的话,可能又会失效了. 1.python3:(unicode error) 'utf-8' codec can't decode 刚开始执行的时候就报这个错,很郁闷后来发现是因为我用多个编辑器编写, 保存.导致不同编辑器编码解码不一致,会报错.所以唯一的办法全程用 一

  • Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在 java.util.function 包中被提供. 下面是最简单的Supplier接口及使用示例. Supplier接口概述 // Supplier接口源码 @FunctionalInterface public interface Supplier<T>

  • python+flask编写接口实例详解

    环境:Pycharm :其他环境:安装Anaconda 最近在做一个小型项目练手,涉及到大量的IP和相关数据处理,所以选用了Python来处理数据,但是处理完怎么给前端调用呢,今天这篇就是在Python方便地处理完数据后以接口形式把数据返回给前端. flask就是使用Python编写接口实例的关键库,先配置项目: ①(这一步可以使用Python默认解释器,但是后续安装库可能还需要配置,建议使用Anaconda)首先打开PyCharm,在file->settings->Project->p

  • Java多态性抽象类与接口细致详解

    目录 1.多态性 1.1 向上转型 1.2 向下转型 2.抽象类 2.1 抽象类的基本概念 3.接口 3.1 接口的基本概念 3.2 接口的使用限制 3.3 使用接口定义标准 3.4 抽象类与接口的区别 1.多态性 多态性是面向对象的最后一个特征,它本身主要分为两个方面: ​ 方法的多态性:重载与覆写 ​ 1 重载:同一个方法名称,根据参数类型以及个数完成不同功能: ​ 2 覆写:通一个方法,根据操作的子类不同,所完成的功能也不同. ​ 对象的多态性:父子类对象的转换. ​ 1 向上转型:子类对

  • Java 实现限流器处理Rest接口请求详解流程

    Maven依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.0.1-jre</version> </dependency> 代码 上代码,不废话. 首先是限流器代码. package com.huyi.csdn.tools.rate; import com.google.c

  • C#实现数组元素的数据类型转换方法详解

    目录 一.场景假设 二.解决方案 三.问题延伸 四.数组类的静态转换方法 五.刨根问底 一.场景假设 假设有一串字符串如下所示,字符串中的数字之间已用英文状态下的逗号隔开.要求用此字符串中的数字快速生成int类型的数组,且尽可能使用最少的代码量. string str = "1,2,3,4,5,6,7,8,9"; 二.解决方案 我相信大多数同学在拿到这题的时候,一般都会给出以下的解决方案: public int[] String2IntArray(string str) { var s

随机推荐