服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++的matlab接口转换方法详解

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

2022-11-01 15:48菜鸟小白进化ing C/C++

这篇文章主要为大家详细介绍了C++的matlab接口转换方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助

由于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,并且包含四个参数

?
1
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指针。

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

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

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

?
1
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类型的数组。

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

6.参数转置

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
        }
    }
}

总结

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

原文链接:https://blog.csdn.net/ltd0924/article/details/123817651

延伸 · 阅读

精彩推荐
  • C/C++C语言数据结构之判断循环链表空与满

    C语言数据结构之判断循环链表空与满

    这篇文章主要介绍了C语言数据结构之判断循环链表空与满的相关资料,希望通过本文能帮助到大家,让大家掌握这部分内容,需要的朋友可以参考下...

    yzs874722021-06-07
  • C/C++《战狼》中两军作战入侵代码竟然是输出星期几的!

    《战狼》中两军作战入侵代码竟然是输出星期几的!

    这篇文章主要介绍了《战狼》中两军作战入侵代码竟然是输出星期几的,喜欢战狼和编程的同学可以了解下。...

    mengwei3882021-06-09
  • C/C++C语言初学者代码中的常见错误与问题

    C语言初学者代码中的常见错误与问题

    C语言初学者犯过的很多错误都非常典型,在初学者中非常普遍,于是整理了一下,应该对其他初学者有借鉴意义...

    C语言教程网10882021-01-09
  • C/C++Qt实现闹钟小程序

    Qt实现闹钟小程序

    这篇文章主要为大家详细介绍了Qt实现闹钟小程序,利用Qt的designer设计需要的闹钟界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    飘云之下9962021-08-01
  • C/C++C语言是怎么写操作系统的

    C语言是怎么写操作系统的

    C语言几乎是写操作系统的唯一语言,就是因为它可以手动管理内存,而又不像汇编的可读性那么差。本文就给大家分享下C语言是怎么写操作系统的,有需...

    底层技术栈7472022-11-01
  • C/C++C++ RTTI与4种类型转换的深入理解

    C++ RTTI与4种类型转换的深入理解

    这篇文章主要给大家介绍了关于C++ RTTI与4种类型转换的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    程序员杨小哥8662021-10-26
  • C/C++C语言实现电话簿项目管理

    C语言实现电话簿项目管理

    这篇文章主要为大家详细介绍了C语言实现电话簿项目管理,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    往明6552021-12-07
  • C/C++Qt CEF融合技QCefView使用教程(推荐)

    Qt CEF融合技QCefView使用教程(推荐)

    QCefView是一个与Chromium Embedded Framework集成的Qt第三方开源库,LGPL许可,可以在项目中免费使用,功能类似CEF、QWebEngineView,提供C++和web交互的能力,本文给大...

    令狐掌门5992022-07-13