在matlab中调用c程序

合集下载

matlab调用函数路径

matlab调用函数路径

matlab调用函数路径
在 MATLAB 中,要调用函数,首先需要确保 MATLAB 能够找到该函数所在的路径。

有几种方法可以实现这一点:
1. 将函数所在的文件夹添加到 MATLAB 的搜索路径中。

可以通过在 MATLAB 命令窗口中使用 `addpath` 命令来实现,比如,
`addpath('C:\myfolder\myfunctions')`。

这将把
`C:\myfolder\myfunctions` 添加到 MATLAB 的搜索路径中,使得MATLAB 能够找到该文件夹中的函数。

2. 使用 `cd` 命令切换当前工作目录到函数所在的文件夹。

这样,当你调用函数时,MATLAB 将会在当前工作目录中寻找函数。

3. 可以使用绝对路径或相对路径来调用函数。

比如,如果函数`myfunction.m` 存在于 `C:\myfolder\myfunctions` 文件夹中,你可以使用 `C:\myfolder\myfunctions\myfunction` 或者
`myfunctions\myfunction` 来调用该函数。

无论使用哪种方法,都需要确保 MATLAB 能够找到函数所在的文件夹。

这样,当你调用函数时,MATLAB 就能够正确地定位并执行
该函数。

希望这些信息能够帮助你理解如何在 MATLAB 中调用函数路径。

如果你有其他关于 MATLAB 的问题,也欢迎随时向我提问。

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南甄梓宁znzhen@Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。

本文就对如何在C程序中调用Matlab程序作说明。

在C程序中调用Matlab程序有两大类方法。

第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。

前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。

关于MCR,请见第四章的说明。

至于两种方法需要在C环境中如何配置请见第五章。

而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。

一、调用Matlab引擎调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。

下面是调用Matlab中的加法程序add.m的例子。

先在Matlab的work目录下创建add.m文件并编写程序如下:function s = add (a, b)s = a+b;在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)Engine *ep = engOpen (NULL);编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。

matlab提取波峰波谷c语言

matlab提取波峰波谷c语言

matlab提取波峰波谷c语言Matlab提供了强大的信号处理工具箱,可以方便地进行波峰和波谷的提取。

在本文中,我将使用Matlab提取信号中的波峰和波谷,并将其实现成C语言代码。

首先,我们需要明确波峰和波谷的定义。

在一个信号中,波峰是局部最大值,而波谷则是局部最小值。

因此,我们的目标是寻找信号中的这些极值点。

步骤1:加载信号数据首先,我们需要加载一个信号数据。

假设我们有一个一维的信号,我们可以通过以下代码将其加载到Matlab中:matlabsignal = load('signal_data.txt');步骤2:寻找波峰要寻找信号中的波峰,我们可以使用Matlab中的`findpeaks`函数。

该函数可以返回信号中的波峰位置及其对应的幅值。

matlab[peaks, locations] = findpeaks(signal);通过上述代码,`peaks`变量将存储信号中的波峰幅值,`locations`变量将存储波峰在信号中的位置。

步骤3:寻找波谷类似于寻找波峰,我们可以使用Matlab中的`findpeaks`函数来寻找信号中的波谷。

但是,由于该函数是寻找波峰的函数,默认情况下只返回波峰。

因此,我们需要将信号取负值,以便让波峰变成波谷。

然后,我们再次使用`findpeaks`函数来寻找信号中的波谷。

matlab[troughs, locations] = findpeaks(-signal);通过上述代码,`troughs`变量将存储信号中的波谷幅值,`locations`变量将存储波谷在信号中的位置。

步骤4:绘制结果为了验证我们的提取结果,我们可以使用Matlab中的`plot`函数将波峰和波谷绘制在信号图上。

matlabfigure;plot(signal);hold on;scatter(locations, peaks, 'r', 'filled');scatter(locations, -troughs, 'g', 'filled');legend('Signal', 'Peaks', 'Troughs');通过上述代码,我们先绘制信号,然后利用`scatter`函数绘制波峰和波谷。

C-MEX函数

C-MEX函数

//IDu(pnew)=[];
nu--; } else
nu=0; } }
/*下面这个mexFunction的目的是使MATLAB知道如何调用这个函数*/ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { if(nrhs!=3)
p--; IDp[0]=p;
for (i=0;i<n;i++) {
w[i]=D[n*i+p]; if ( i<p )
/blog/static/869642200971562433216/
2010/11/30
w
页码,3/4(W)
IDu[i]=i; else
首页推荐 洗澡时发现婆婆是双性恋 毛利:烂人完美标本 美国人忙着捡便宜 兽兽亮相车展遭围攻 游资为什么炒作农产品? 为何有些物种要变性
更多>>
mrows = mxGetM(prhs[0]); /* 获得输入矩阵的行数 */ ncols = mxGetN(prhs[0]); /* 获得输入矩阵的列数 */ if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1) )
mexErrMsgTxt("Input must be a noncomplex scalar double."); /* 判断输入矩阵是否是double类,以及它是否只包括单个元 素 */
/* 为输出创建一个矩阵,显然这个矩阵也应该是1x1的 */ plhs[0] = mxCreateDoubleMatrix(mrows,ntPr(prhs[0]); /* 获得指向输入/输出矩阵数据的指针 */ y = mxGetPr(plhs[0]);

Matlab调用VC生成的dll的具体步骤

Matlab调用VC生成的dll的具体步骤

Matlab调用C生成的dll的具体步骤一、C生成dll文件(以vs2008为例)1创建项目: Win32->Win32项目,名称:MyDLL2新建头文件testdll.h,并编写相关程序注:一定要注意头文件的写法,此法是支持C的头文件,Matlab调用DLL只支持用C 语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。

具体程序如下#ifndef MATLABDLLTEST_H#define MATLABDLLTEST_H#ifdef __cplusplusextern "C"{#endif__declspec(dllexport) double add(double x, double y);#ifdef __cplusplus}#endif#endif3新建源文件testdll.cpp,并编写相关程序具体程序如下所示:#include "stdafx.h"#include "testdll.h"double add(double x, double y){return (x+y);}4新建模块定义文件mydll.def,并编写相关程序二、Matlab调用生成的dll1、编译器准备1)在Matlab的命令窗口输入:mex -setup2)选择你的编译器,我的是:[2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.02、加载DLL:把编译连接之后产生的myDLL.dll和testdll.h文件拷贝到Matlab的当前工作目录下,并编写.m函数具体程序clc;clear all;close all;addpath('dll的具体路径即Matlab的当前工作路径')%输入dll文件具体的存储路径loadlibraryMyDLLtestDLL.h alias lib%加载MyDLL库,并重命名为lib,注意加载时常常需要MyDLL的头文件libfunctionsview lib %执行此命令后会生成如下窗口calllib('lib', 'add', 1.0,2.0)%只有出现上述窗口才能使用此命令参考链接:1、/s/blog_70b3b3a701015e98.html(此文忘记加模块定义文件mydll.def,而且在Matlab读取路径是的指令也是错误的,参考本文的指令就能跑通)2、/g710710/article/details/7255744(此链接的文章是VS生成dll的方法,但如果想用Matlab调用生成的dll在编写头文件时一定要用上文的编写指令,而不这篇链接里的指令,因为链接里的指令是生成C++的指令,而Matlab只识别C的写法)。

matlab coder

matlab coder

Matlab coder 使用总结陈毅2012.4.18很早就想总结一下,一直没时间,拖到现在,诶。

Matlab coder 能将matlab 代码转换成 C代码。

我们知道,matlab是专为数组或者说矩阵运算而设计的,所以先弄清楚matlab 的工作环境与 VC环境是很不一样的。

最重要的一点就是matlab中变量的size 是可以随意变化的,而这在vc中不行,即在vc中是要赋初值的。

我们在转换的过程中很多工作也正是做赋初值这件事。

1 使用之前先用 mex –setup 选择你的 C/C++ 编译器。

2 相应的函数Codegen其作用是告诉matlab你要转换代码,这个虽然不是必须的(不会报错但会有警告)但是很有用。

应为加上codegen 后matlab会直接提示哪些地方需要改动2 coder.allowpcodecoder.allowpcode('plain')在文件最前面使用这个设置,其作用是可以将P文件生成C代码。

这里顺便了解一下matlab的P文件。

这里P是Pseudocode(伪代码)的缩小。

(1)P文件运行速度快。

P文件是对应M文件的一种预解析版本(preparsed version)。

因为当你第一次执行M文件时,Matlab需要将其解析(parse)一次(第一次执行后的已解析内容会放入内存作第二次执行时使用,即第二次执行时无需再解析),这无形中增加了执行时间。

所以我们就预先作解释,那么以后再使用该M文件时,便会直接执行对应的已解析版本,即P文件。

但又因为Matlab的解析速度非常快,一般不用自己作预解析。

只有当一些程序要调用到非常多的M文件时,如GUI应用程序时,才会作预解析,以增加以后的调用速度。

(2)保密性好p文件是加密文件,只能运行,不能还原成m文件的。

如果你给别人一个M文件,别人可以打开来看到你所有的代码和算法。

如果你的代码不想被别人看到,那可以给他P文件。

MATLAB_SIMULINK C 语言模块仿真测试方法

MATLAB_SIMULINK C 语言模块仿真测试方法

MATLAB/SIMULINK C语言模块仿真测试方法iFTrue本文档描述了如何采用C语言编程的方式在MATLAB中进行仿真的方法,这里的C源文件可以按照模块化编程的方式进行编写,进而可以无需做任何更改便可以移植到CCS等编程环境中。

以下采用的MATLAB版本为Matlab 7.0,其余版本大同小异。

1 C语言编译器首先,需要在MALAB环境中设置C语言编译器,以便进行代码编译。

在MATLAN命令窗口中,使用mex -setup指令选择所需的编译器,按照提示进行操作:图1-1 MATLAB环境C编译器设置如果电脑中安装了其他C语言编译环境,如Microsoft Visual C++6.0等,在图1-1“Select a compiler”步骤中会相应地列出,可根据自己地喜好选择,差异不大。

2 创建SIMULINK工程2.1 工程目录为了方便代码管理,建议采用如下目录结构:1>> 新建文件夹,命名为仿真工程名,例如:SVPWM2>> 在该文件夹下依次新建4个文件夹:Include、Source、Model和Document3>> Include:存放头文件xxx.hSource:存放源文件xxx.cModel:存放SIMULINK模型文件xxx.mdlDocument:存放相关说明文档与版本控制文档等2.2 SIMULINK模型在SIMULINK中根据实际需要搭建仿真模型,并存放于Model文件夹中,其中控制算法部分使用Sfunction builder,这里以空间矢量脉宽调制(SVPWM)举例说明,模型如图2-1所示。

图2-1 SIMULINK仿真模型双击Sfunction builder模块设置(即图2-1中的SVPWM),首先填写S-function name,然后在Initialization选项卡中选择Sample mode为Discere,意味着使用离散采样模式,在Sample time value中设置采样周期,这里采用1e-4(单位:秒)。

gunmex在matlab中的配置(WinGW和cygwin)

gunmex在matlab中的配置(WinGW和cygwin)

gunmex在matlab中的配置(WinGW和cygwin)在Window xp/7下使用Linux的C/C++代码,编译成DLL供Matlab混合编程使用,目前有两个window 下的编译器cygwin和WinGW,这两个编译器都可以在Window下模拟Linux环境,并对C(gcc)和C++(g++)进行编译,cygwin以及WinGW,如果是混合Matlab编程,个人推荐使用WinGW,安装简单,使用方便。

以下是总结一些网上的文章,对我们初学者有些帮助,在此一并感谢原作者。

在windows下用的g++编译器,以前用过这方面的MinGW,今天上网下载这个程序,发现这边的网速不行,因为它支持的是在线安装。

在/上可以看到其安装程序。

里面的开发包都好老,在经历了很多次失败后,我决定手工安装。

一.手工安装方法:来自/articles/windows%E4%B8%8Bmingw%E7%9A%84%E5%AE%89%E8%A3%85 %E4%B8%8E%E4%BD%BF%E7%94%A8.htmlMinGW提供了一个编写Windows应用程序的完整开源工具包。

1)MinGW的安装MinGW的安装,其实非常简单。

因为手动安装有着更多的灵活性,所以这里重点说一下手动安装的步骤。

安装MinGW至少需要四个包:* binutils* gcc-core* mingw-runtime* w32api把这些包下载下来,放到C:/MinGW目录下(当然,放到哪里都一样),然后在windows的cmd里,用下面的命令解压出来:C:/MinGW>gzip -d -c binutils-2.17.50-20060824-1.tar.gz | tar xC:/MinGW>gzip -d -c gcc-core-3.4.5-20060117-3.tar.gz | tar xC:/MinGW>gzip -d -c mingwrt-3.15.1-mingw32-dev.tar.gz | tar xC:/MinGW>gzip -d -c w32api-3.12-mingw32-dev.tar.gz | tar xC:/MinGW> set path=C:/MinGW/bin;%path%其实各个包的目录结构都是一样的,所以,解压后的目录结构仍然为一样的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.Maltab 编译Mex文件(不可调试)
1.1hello word
在matlab命令行中输入:mex -setup选择合适编译器,完成设置。

新建一个文件,输入:
#include <mex.h>
void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[])
{
mexPrintf("Hello word!");
}
把上面程序保存为一个C文件,如 hello.c
在command window下运行
>> mex hello.c
>>
结束之后在current folder 窗口里会有一个hello.mexw32文件。

在command window下运行
>> hello()
Hello word!
1.2如果是多维数组并不能用Arr[i][j]的格式寻址,在参数在C里只是一维数组,
一维数组按列排列,C语言是按行排列的,
如[a b c d;e f g h]C语言在内存中是按a b c d e f g h排列,而matlab是按 a e b f c g d h排列的。

如果要变成C语言可Arr[i][j]索引的格式,可用for循环转化
打印函数:
mexPrintf()相当于matlab的disp函数,
mexPrintf函数里需要打印的部分必须用""而不能用''
子函数的问题:
子函数有两种方式,一种采用return值得方式返回值
另一种方式为利用参数返回值,把需要return的值直接赋给形参。

多个.c文件的编译:
多个.c文件中只能存在一个mexFunction函数
可用mex ('a.c','b.c','d.c')的格式编译
在VS中调试mex
在vs中建立dll工程,建立project.cpp文件,输入
#include "project.h"
#include <mex.h>
void mexFunction(int nlhs ,mxArray *plhs[] ,int nrhs, const mxArray *prhs[])
{
mexPrintf("Hello word!");
}
建立.h文件,输入
#include "matrix.h"
#include "mex.h"
#define TESTMATLAB_EXPORTS
#ifdef TESTMATLAB_EXPORTS
#define MEX_FUNCTION_API __declspec(dllexport)
#else
#define MEX_FUNCTION_API __declspec(dllimport)
#endif
MEX_FUNCTION_API void mexFunction(int nlhs, mxArray* plhs[], int nrhs, mxArray* prhs[]);
建立project.def文件,输入
LIBRARY
EXPORTS
mexFunction
添加include和lib路径
若matlab为32位,liblujing为:
D:\Program Files\MATLAB\R2014a\extern\lib\win32
64位则为:
D:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft
include路径为:D:\Program Files\MATLAB\R2014a\extern\include
添加链接器附加依赖项libmx.lib libeng.lib libmat.lib libmex.lib,将连接器输出的文件名称后缀,project.dll改为project.mexw32,64位改为project.mexw64
设置C/C++-代码生成-运行库为多线程调试(/Mtd)
若为64位matlab,还需将vs的编译平台设置为x64
生成解决方案,会在debug目录生成project.mexw64.
打开matlab,将工作目录改到如上debug目录,包含project.mexw64文件
开始调试,在vs中cpp文件设置端点,选择工具-附件到进程-matlab-添加,再在matlab中运行该文件,即可跳入端点处.。

相关文档
最新文档