在matlab中调用c程序
- 格式:docx
- 大小:16.55 KB
- 文档页数:2
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程序指南甄梓宁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提供了强大的信号处理工具箱,可以方便地进行波峰和波谷的提取。
在本文中,我将使用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`函数绘制波峰和波谷。
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 使用总结陈毅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语言模块仿真测试方法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)在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%其实各个包的目录结构都是一样的,所以,解压后的目录结构仍然为一样的。
libsvm安装教程(详细版)(本机matlab版本16b)第一步,把libsvm放到工具箱toolbox中。
把libsvm安装包解压,并放入matlab程序文件中toolbox中。
运行matlab程序,点击主页,找到布局旁边的设置路径,并点击设计路径选择添加并包含子文件,找到toolbox下面的libsvm添加即可,并点击保存。
第二步更新工具箱找到布局旁边的预测按钮,并点击预设按钮。
找到常规,选择更新工具箱路径缓存,并点击应用,最后点击确定。
第三步,更改libsvm文件在matlab文件行,打开如下地址:D:\B\toolbox\libsvm-3.24\matlab打开make.m文件,将make.m中的CFLAGS改为COMPFLAGS。
注:因为matlab中有自带的svm,为了防止libsvm和自带的svm发生冲突,所以将D:\B\toolbox\libsvm-3.24\matlab中将svmtrian.c和svmpredic.c前面加入lib,相应的make.m文件中也做修改第四步,安装编译器编译器采用最新版tdm64-gcc-9.2.0,安装教程很简单选择Creat,保存路径直接选择C盘即可,C:\TDM-GCC-64。
第五步,使用matlab读取C语言程序。
Matlab文件行调整到此目录下D:\B\toolbox\libsvm-3.24\matlab 并在命令行窗口输入:setenv('MW_MINGW64_LOC','C:\TDM-GCC-64')make点击回车,当命令行窗口出现:使用'MinGW64 Compiler (C)' 编译。
MEX 已成功完成。
使用'MinGW64 Compiler (C)' 编译。
MEX 已成功完成。
使用'MinGW64 Compiler (C)' 编译。
MEX 已成功完成。
本文由wolf1sky贡献doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
Matlab 与 VC 混合编程 1:一、采用 Matcom1、目标1. 测试在 VC 中调用 MatrixC++库,生成矩阵并显示 2. 测试 VC 中调用.m 文件2、步骤2.1 目标 1<1>建立 VC 工程,添加库 v4501v.lib,有两种方法:?向工程中添加文件 v4501v.lib 在 Setting/link 中添加库 v4501v.lib(这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)二者选其一就可以了。
<2> 添加头文件 #include "matlib.h" (这样写的前题是 VC 路径设置正确,即在 Options/Directories 中设置,否则请注明详细路径)建议:最好在工程中把文件 matlib.h 添加进来,方便查看函数详细说明 <3>现在就可以调用 Matrix中的C++函数了,例子如下:// Init matcom initM(MATCOM_VERSION); winaxes(AfxGetMainWnd()->GetSafeHwnd()); Mm a,b; a = (BR(1),2,3,semi,4,5,6,semi,7,8,9); a = transpose(a); b = (BR(1),2,3,semi,4,5,6,semi,7,8,9); m_1.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f %3f %3f \r\n",a.r(1,1),a.r(1,2),a.r(1,3),a.r(2,1),a.r(2,2),a.r(2,3),a.r(3,1),a.r(3,2),a. r(3,3));//m_1 是一个 CEdit 控件 UpdateData(FALSE); exitM();2.2 目标 2<1>首先用 Matlab 调试成功以下两个有依赖关系的.m 文件文件 1:equation.m function y = equation(a,b) y = a * b; 文件 2:CallE.m % function name function [o1,o2] = CallE(x) if (nargin ~= 1) error('arguments must be inputed!'); endif (x == 1) a = reshape(1:9,3,3); elseif (x == 2) a = reshape(11:19,3,3); else error('input error'); end b = magic(3); o1 = equation(a,b); o2 = o1 + 1; <2>将以上两个文件放在同一个目录下,启动 MatCom 编译运行 CallE.m, >> CallE(2) 则在同一目录下生成一个 DEBUG(或者是 Release,在 MatCom 的菜单项 Configuration 中选择)目录下可以找到相应的.cpp 及.h 文件,把它们全部拷贝到 VC 工程目录下,也可以自己建一个文件夹 <3>在 VC 项目中添加这些文件,并在头部添加相应.h 的引用,如下: #include "./matlib/equation.h" #include "./matlib/calle.h" <4>添加调用函数的代码,如下: Mm a,b,c; a = BR(2); 表示输入参数到输出参数的间隔,《MatrixLIB user's 详见calle(a,i_o,b,c); //i_o 是一个间隔符,Guide》m_2.Format("%3f %3f %3f \r\n%3f %3f %3f \r\n%3f \r\n",b.r(1,1),b.r(1,2),b.r(1,3),b.r(2,1),b.r(2,2),b.r(2,3),b.r(3,1),b.r(3,2),b. r(3,3)); %3f %3fUpdateData(FALSE);3、遇到的问题及解决方案<1>当在 VC 工程中添加由 Matcom 转换的 cpp 及 h 文件后,注:如果在编译中出现下列错误:fatal error C1010: unexpected end of file while looking for precompiled headerdirective 解决:进行下列设置:工程->设置-> C/C++ 选择 precompiled headers 选解决:择第一或第二项:自动选择预补偿页眉,如图:<2>使用Matcom 后,生成Debug 版没问题,而生成Release 时链接出错,nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj) 解决:解决:将"Project 属性" -> "C/C++" -> "代码生成(codegeneration)" -> "运行时库(run-time library)" 项下修改应用程序的默认标准库版本,我修改成 Debug Multithreads 就可以了,原因是安装Matcom 时库为调试版<3>在其它机器上运行出错解决:解决:将 ago4501.dll v4501v.dll glu32.dll opengl32.dll 附带发布即可 <4>关闭程序后进程没有退出解决:解决:添加语句winaxes(m_hWnd);参考文献1、何东健等.《数字图像处理》.西安电子科技大学出版社.20032、邓科.浅析 VC 与matlab 接口编程(一). VC 知识库,41 期3、邓科.浅析 VC 与 matlab 接口编程(二). VC 知识库,42 期4、Matcom 参考手册Matlab 与 VC 混合编程 2:二、通过 Matlab 引擎与 VC 混合编程--飞狼编程宝典--明明知道选择你是一个错误,却为何那么地坚持这个错误……基于 Matlab 引擎的混合编程方式无法脱离 Matlab 环境,却为何还要使用它?根据本人的实践,对于一般应用,如矩阵运算,图像操作等,使用 Matcom 就已经足够,而且能够脱离 Matlab 那个巨大的环境而独立运行,但是,对于很多好用的 Matlab 工具箱,我们却无法直接在 VC 中调用。
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中运行该文件,即可跳入端点处.。