Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示

2024-01-15 15:32

本文主要是介绍Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如下为本人亲证代码:

一:

编译器的安装与配置(环境不同,显示结果不同)

 要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器:

5.0、6.0版的MicroSoft Visual C++(MSVC)

5.0、5.2、5.3、5.4、5.5版的Borland C++

LCC(由MATLAB自带,只能用来产生MEX文件)

下面是安装与配置MATLAB编译器应用程序MEX的设置的步骤:

(1)在MATLAB命令窗口中运行mex –setup,出现下列提示:

Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n?

 
(2)选择y,MATLAB将自动搜索计算机上已安装的外部编译器的类型、版本及所在路径,并列出来让用户选择:

Select a compiler:

[1] Borland C++Builder version 6.0 in C:\Program Files\Borland

[2] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio

[3] Lcc C version 2.4 in D:\MATLAB6P5P1\sys\lcc

[4] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio

[0] None

Compiler:

 (3)选择其中一种(在这里选择了3),MATLAB让用户进行确认:

Please verify your choices:

Compiler: Lcc C 2.4

Location: D:\MATLAB6P5P1\sys\lcc

Are these correct?([y]/n):

 
(4)选择y,结束MATLAB编译器的配置。

二在matlab当前目录下新建 add.c文件。输入

复制代码
#include "mex.h" //使用MEX文件必须包含的头文件
//mex 通过
//a=add(b,c)
double add(double x,double y)
{
return x+y;
}
//MEX文件接口函数
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{   //步骤一:声明// 源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误// 源文件名后缀为.cpp时,没有上面的问题,...- -||double b,c;double *a;//步骤二:操作输入数据//对输入数据进行操作,根据需要选择这几个函数mxGetPr指针指向参数的数据地址、 mxGetM 、 mxGetN 得到矩阵数据的行和列 (返回整数)。b=*(mxGetPr(prhs[0]));//*代表取地址的内容c=*(mxGetPr(prhs[1]));//步骤三:操作输出数据,//对于输出数据,需要首先用专门的mex函数分配内存空间plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);//同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量a=mxGetPr(plhs[0]);//步骤四:调用add*a=add(b,c);}
复制代码

三、C文件已写好,名为add.c。那么在Matlab中,输入:

>> mex add.c

就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows多出MEX文件

 

>> output = add(1.1,5)

五、得到输出结果

 

output =

    6.1000

案例二:

在matlab中建立EstabHibert.cpp的文件,并插入如下代码

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//Matlab以MEX方式调用C代码示例二
//功能:建立一个n*n的Hibert 矩阵 ,n存放输入值,y存放输出的矩阵
// 【例1】用m文件建立一个1000×1000的Hilbert矩阵代码如下。
//
// tic
//
// m=1000;
//
// n=1000;
//
// a=zeros(m,n);
//
// for i=1:1000
//
// for j=1:1000
//
// a(i,j)=1/(i+j);
//
// end
//
// end
//
// toc
#include "mex.h"
//计算过程,该过程包含了MEX文件实现计算功能的代码,是标准的C语言子程序。
void  hilb( double  *y, int  n)
{
int  i,j;
for (i=0;i<n;i++){
for (j=0;j<n;j++){
*(y+j+i*n)=1/(( double )i+( double )j+2);
}
}
}
//接口过程
void  mexFunction( int  nlhs,mxArray *plhs[], int  nrhs, const  mxArray *prhs[])
{
//步骤一:声明
// 源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误
// 源文件名后缀为.cpp时,没有上面的问题,...- -||
//double x,*y;
// int n;
double * y;
int  n;
//检测输入、输出参数个数和类型的正确性
if (nrhs!=1)
mexErrMsgTxt( "One inputs required." );
if (nlhs!=1)
mexErrMsgTxt( "One output required." );
if (!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1)
mexErrMsgTxt( "input must be scalars" );
//scalars 代表标量,double型是标量的一种哦
n=mxGetScalar(prhs[0]);
plhs[0]=mxCreateDoubleMatrix(n,n,mxREAL);
// n=mxGetM(plhs[0]); //get rows
y=mxGetPr(plhs[0]);
hilb(y,n);
}

  

 

mex EstabHibert.cpp

a= EstabHibert(1000);

这篇关于Matlab与C/C++联合编程之Matlab以MEX方式调用C代码(五)完整过程加示的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/609367

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景