在MATLAB环境下访问外部函数的共享库文件
- 格式:doc
- 大小:99.50 KB
- 文档页数:11
[原创]Matlab通过ODBC的方式调用数据库Matlab数据库编程指南-GodmanMatlab与数据库链接有三种方法,本文只讲述其中以ODBC的方式进行链接。
第一部分:读取数据其相关信息查看1. 配置数据源“控制面板”----“管理工具”——“数据源(ODBC)”——“添加”——“创建数据源名称和选择数据库文件”(具体操作见GIF图片操作)。
2. 建立链接对象——database调用格式:conna=database(‘datasourcename’,’username’,’password’);如conna=database('SampleDB','','');其中SampleDB为上文中创建的数据源名称,当默认情况下,数据库文件的username和password为空。
3. 建立并打开游标——exec调用格式:curs=exec(conna,'sqlquery');如curs=exec(conna,'select * from database')其中conna为上文中链接对象,select * from database表示从表database中选择所有的数据.4. 把数据库中的数据读取到Matlab中——fetch调用格式:curs=fetch(curs,RowLimit);Data=curs.Data;%把读取到的数据用变量Data保存.如curs=fetch(curs);把所有的数据一次全部读取到Matlab中,RowLimit为每次读取的数据参数的行数,默认为全部读取,但是全部读取会很费时间(和计算机性能很大关系)。
上述四点是matlab从数据库文件中读取数据到matlab中的基本步骤。
5. 数据返回类型从数据库中读取数据到matlab有三种数据类型(默认为元胞类型cellarray),分别为元胞类型(cellarray),数字型(numeric),结构型(structure)。
Matlab调⽤动态链接库matlab帮助⽂档⾥有详细⽂档Call Functions in shared Libaries什么是共享库共享库是⼀组函数的集合,在程序运⾏期间可以动态加载。
共享库中的函数可以⽤不同的语⾔实现,但只要这些函数提供了C语⾔接⼝,那Matlab就⽀持该共享库,⽽且Matlab ⽀持在不同平台下链接共享库。
平台共享库⽂件扩展名Micsoft Windows动态链接库⽂件.dllUNIX and Linus共享⽬标⽂件.soApple Macintosh动态共享⽂件.dylib共享库必须要提供⼀个头⽂件,⽤来声明共享库中的函数。
函数签名中明确了函数的名称,参数的个数和类型。
你还需要⼀个已安装好的matlab⽀持的C编译器。
matlab可以通过命令⾏接⼝调⽤外部共享库中的函数。
这个接⼝允许你将⼀个外部共享库加载到Matlab内存中,并调⽤共享库中的函数。
虽然matlab语⾔和C语⾔差异较⼤,但是通常你可以直接传递⼀个类型到C函数中,不需要做转换,因为matlab在后⾯已经帮你做好了这部分⼯作。
当你使⽤完了共享库,有个重点是你需要卸载共享库以释放内存。
加载和卸载共享库为了让matlab调⽤共享库中的函数,⾸先需要将共享库加载到内存中去,加载完之后,你可以获取库中的函数信息和直接在matlab中调⽤这些函数,当不再需要共享库时,还需要卸载共享库来维持内存使⽤情况。
加载共享库到matlab中,使⽤loadlibray函数,函数语法是:loadlibrary('shrlib','hfile')其中shrlib表⽰共享库⽂件的名称,hfile表⽰包含函数声明的头⽂件名称。
⽤unloadlibrary命令去卸载共享库并释放内存。
命令语法:unloadlibrary libname其中libname表⽰共享库名称。
查看共享库函数在命令⾏窗⼝中查看函数为了在命令⾏窗⼝中显⽰共享库中的函数信息,可以⽤libfunctions,例如,查看libmx共享库中有哪些可⽤的函数,可以输⼊如下命令:if not(libisloaded('libmx'))hfile = [matlabroot '\extern\include\matrix.h'];loadlibrary('libmx',hfile)endlibfunctions libmxmatlab命令⾏窗⼝中显⽰:MATLAB displays (in part):Functions in library libmx:mxAddField mxGetScalarmxArrayToString mxGetString_730mxCalcSingleSubscript_730 mxGetUserBitsmxCalloc mxIsCellmxCreateCellArray_730 mxIsCharmxCreateCellMatrix_730 mxIsClass. .. .. .如果想看具体的函数签名,在命令后加-full指令,这个选项能够显⽰matlab调⽤共享库中函数的语法,其中函数⽤的参数列表和返回类型均为matlab类型,⽽不是C版本的类型。
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 的问题,也欢迎随时向我提问。
在Matlab中,S函数是一种特殊的函数,它可以调用其他函数来实现特定的功能。
在实际应用中,常常会遇到需要在S函数中调用其他函数来完成一些复杂的计算任务或者实现特定的算法。
本文将详细介绍在Matlab中如何使用S函数来调用其他函数,并且给出一些实际的应用示例。
一、S函数简介S函数是Simulink中的一种特殊的函数块,可以用来实现自定义的非线性动态系统。
它可以通过Matlab代码来定义系统的动态特性,包括状态方程、输出方程和控制逻辑等。
S函数可以调用Matlab中的其他函数来实现特定的功能,这使得S函数具有了很大的灵活性和通用性。
二、S函数调用其他函数的基本方法在S函数中调用其他函数,一般需要遵循以下几个基本步骤:1. 在S函数所在的Matlab工作目录下创建其他函数的.m文件。
2. 在S函数的Matlab代码中使用函数调用语句来调用其他函数。
具体来说,假设有一个S函数的代码如下所示:function [sys,x0,str,ts] = my_s_function(t,x,u,flag)switch flagcase 0[sys,x0,str,ts] = mdlInitializeSizes;case 3sys = mdlOutputs(t,x,u);otherwisesys = [];end```在这个S函数中,我们可以使用Matlab中的函数调用语句来调用其他函数,例如:```matlabfunction y = my_other_function(x)y = x^2 + 1;```这样,在S函数的代码中就可以直接调用my_other_function来实现特定的功能,例如:function y = mdlOutputs(t,x,u)y = my_other_function(u);```通过这种方法,S函数可以方便地调用其他函数来实现特定的功能,从而实现自定义的非线性动态系统。
三、S函数调用其他函数的实际应用示例下面我们通过一个具体的实例来说明在Matlab中如何使用S函数来调用其他函数。
matlab中对其自带库函数进行导出的方法在MATLAB 的使用过程中,有时需要将MATLAB 自带的库函数导出为其他格式,以便在其他环境或应用程序中使用。
本文将详细介绍在MATLAB 中对其自带库函数进行导出的几种方法。
### 方法一:使用MATLAB CompilerMATLAB Compiler 是一种强大的工具,可以将MATLAB 程序转换为独立的应用程序、共享库或Web 应用程序。
以下是如何使用MATLAB Compiler 导出自带库函数的步骤:1.打开MATLAB,在命令窗口中输入`mbuild -setup`,设置MATLAB 编译器。
2.准备需要导出的函数,将其保存在一个单独的`.m` 文件中。
3.在MATLAB 命令窗口中,使用`mbuild` 命令编译该函数。
例如,如果函数名为`myFunction.m`,则输入`mbuild myFunction.m`。
4.编译成功后,会生成一个`.mex` 文件,该文件可以在其他安装了MATLAB 运行环境的计算机上运行。
### 方法二:使用MATLAB CoderMATLAB Coder 可以将MATLAB 代码转换为C/C++ 代码,以便在其他非MATLAB 环境中使用。
以下是如何使用MATLAB Coder 导出自带库函数的步骤:1.打开MATLAB,在命令窗口中输入`coder -setup`,设置MATLAB Coder。
2.将需要导出的函数保存在一个单独的`.m` 文件中。
3.在MATLAB 命令窗口中,使用`codegen` 命令生成C/C++ 代码。
例如,`codegen myFunction.m`。
4.生成成功后,会在指定文件夹中生成相应的C/C++ 文件,这些文件可以在其他编程环境中使用。
### 方法三:使用MATLAB Engine APIMATLAB Engine API 允许用户在其他应用程序中调用MATLAB。
matlab函数中调用函数在Matlab中,我们经常需要调用不同的函数来完成各种任务。
函数的调用是Matlab编程中非常重要的一部分,它使得我们能够将代码模块化,提高代码的可读性和重用性。
本文将从不同的角度探讨在Matlab函数中调用函数的方法和注意事项。
我们来看一下如何在Matlab函数中调用其他函数。
在Matlab中,我们可以使用函数名加上括号的形式来调用函数。
例如,我们可以使用`result = sin(x)`来调用`sin`函数,并将结果保存在`result`变量中。
调用其他函数时,我们可以通过传递参数的方式将需要的数据传递给被调用的函数。
例如,我们可以使用`result = power(x, y)`来调用`power`函数,其中`x`和`y`分别是函数的两个参数。
在使用函数调用时,我们还需要注意函数的输入和输出。
在Matlab 中,函数可以有零个或多个输入参数,以及零个或多个输出参数。
在函数调用时,我们需要根据被调用函数的定义来传递正确的参数,并接收返回的结果。
如果函数有多个输出参数,我们可以使用方括号将它们括起来,例如`[result1, result2] = myFunction(x)`。
除了调用内置函数,我们还可以在Matlab函数中调用自定义函数。
自定义函数是我们根据自己的需求编写的函数,可以根据实际情况进行调用。
在调用自定义函数时,我们需要确保函数的定义在调用之前。
可以将自定义函数放在同一个文件夹中,然后使用`addpath`命令将该文件夹添加到Matlab的搜索路径中,以便能够正确找到并调用这些函数。
在函数调用过程中,我们还需要注意函数的作用域和变量的命名冲突问题。
在Matlab中,函数有自己的作用域,函数内部定义的变量在函数外部是不可见的。
如果在函数内部使用了和外部函数或脚本中同名的变量,会导致变量冲突的问题。
为了避免这种情况,我们可以使用不同的变量名或者在函数内使用`clear`命令清除冲突的变量。
使用Matlab调用不同文件夹的函数概述在Matlab中,我们经常会遇到需要调用不同文件夹下的函数的情况。
不同的函数可能存放在不同的文件夹中,而我们需要在自己的程序文件中调用它们。
本文将介绍使用Matlab调用不同文件夹的函数的方法,并详细讨论如何正确地设置路径和使用函数。
设置路径要在Matlab中调用不同文件夹的函数,首先需要设置路径。
路径告诉Matlab去哪里查找函数。
具体的设置方法如下:1.打开Matlab软件。
2.点击”文件”菜单并选择”设置路径”。
3.在”设置路径”对话框中,点击”添加文件夹”按钮。
4.在弹出对话框中,选择你想要添加的文件夹,并点击”选择文件夹”按钮。
5.点击”确定”按钮,完成路径设置。
调用函数设置路径之后,就可以在自己的程序中调用不同文件夹下的函数了。
下面介绍几种常见的调用函数的方法:方法一:直接调用函数名如果要调用的函数在当前路径下或已经被添加到路径中,可以直接使用函数名进行调用。
例如,要调用一个名为”myFunction”的函数,可以使用以下语法:myFunction(arg1, arg2, ...)方法二:使用文件夹名称调用函数如果要调用的函数存放在一个文件夹中,并且该文件夹已经被添加到路径中,可以使用以下语法:folderName.functionName(arg1, arg2, ...)其中,“folderName”是存放函数的文件夹名称,“functionName”是要调用的函数名。
方法三:使用绝对路径调用函数如果要调用的函数存放在一个未添加到路径中的文件夹中,可以使用绝对路径来调用函数。
绝对路径指的是函数文件所在的完整路径,包括文件夹名称和文件名。
例如:C:\path\to\folder\functionName(arg1, arg2, ...)实例演示为了更好地理解如何使用Matlab调用不同文件夹的函数,我们来进行一个实例演示。
假设我们有两个文件夹,分别是”folder1”和”folder2”,它们存放着不同的函数。
我们若可以根据需要建立自己的函数文件,他们能够像库函数一样方便地调用,从而极大地扩展MATLAB地能力.
如果对于一类特殊地问题,建立起来许多函数M文件,就能最终形成独立地工具箱.
1.函数M文件地基本用法
function 因变量=函数名 (自变量)
其它各行为从自变量计算因变量地语句,并最终将结果赋予因变量.
这个M文件地文件名最好是函数名.m
function a = randint (m, n)
% RANDINT Randomly generated integral matrix
a = floor (10*rand(m,n))
当需要一个这样地2*3随机矩阵时,只需
>>x=randint(2,3)
x= 9 6 8
2 4 7
2.函数M文件有多个因变量
要用[]将他们括起来,请看下例:
function [mean, stdev] = stat(x)
% STAT Mean and standard deviation
[m n] = size(x);
if m =1
m=n
end
mean= sum(x)/m;
stdev=sqrt(sum(x^2)/m-mean^2)
其用途,如求一个数组X地平均值和均方差,只需:
>>x= [ 2 4 -7 0 5 -1];
[xm.xd]=stat(x)
xm=0. 5
xd=3.9476。
Matlab曲线拟合输出拟合函数在其他文件调用在使用Matlab进行曲线拟合时,我们通常会得到一个拟合函数,用于描述实验数据的趋势和规律。
然而,有时候我们需要在其他文件中调用这个拟合函数,以便进行进一步的分析和处理。
本文将介绍如何在Matlab中输出拟合函数,并在其他文件中调用这个函数。
让我们来看一下如何在Matlab中进行曲线拟合,并输出拟合函数。
假设我们已经有了一组实验数据x和对应的y,我们可以使用Matlab 中的polyfit函数来进行多项式拟合。
我们可以使用二次多项式来拟合数据:```matlabp = polyfit(x, y, 2);```这将得到一个二次多项式拟合的系数p。
接下来,我们可以使用polyval函数来计算拟合后的y值,并且将拟合结果绘制成图表:```matlaby_fit = polyval(p, x);plot(x, y, 'o', x, y_fit, '-');```通过这样的步骤,我们就可以在Matlab中完成曲线拟合,并且得到拟合函数的系数。
接下来,我们需要将这个拟合函数输出到其他文件中,以便在其他程序中进行调用。
为了实现这一点,我们可以将拟合函数写入到一个独立的文件中。
我们可以创建一个名为"fitting_function.m"的文件,将拟合函数写入其中:```matlabfunction y_fit = fitting_function(x, p)y_fit = polyval(p, x);end```在这个文件中,我们定义了一个名为"fitting_function"的函数,用于计算拟合后的y值。
这个函数需要输入实验数据x和拟合函数的系数p,然后返回拟合后的y值。
现在,我们可以在其他文件中调用这个函数了。
假设我们需要在一个名为"main_program.m"的文件中调用拟合函数。
在MA TLAB环境下访问外部函数的共享库文件,必须首先把该库文件加载到内存中。
一旦加载成功,就能直接在MA TLAB中直接请求关于函数的任何信息。
而当不再需要该库时,就应当及时把库文件从内存中卸载以节省内存开销。
加载库语法:loadlibrary(…shrlib‟,‟hfile‟)其中shrlib为加载的动态链接库文件名(filename.dll),hfile为头文件名,它包含函数原型。
例如,当加载包含MA TLAB中mx程序的libmx库时,可以使用下列语句。
hfile=[matlabroot‟\extern\include\matrix.h‟];loadlibray(…libmx‟, hfile)卸载库语法:unloadlibrary libmx使用两个函数可以获取加载库的信息:libfunctions(…libname‟) or libfunctions libnamelibfunctionsview(…libname‟) or libfunctionsview libname这两个函数的不同之处在于显示结果的方式不同,后者是以图形的方式显示在新的窗口中。
而前者返回库libmx中有哪些可用的函数。
请看示例:libfunctions libmxMethods for class lib.libmx:mxAddField mxGetFieldNumber mxIsLogicalScalarTruemxArrayToString mxGetImagData mxIsNaNmxCalcSingleSubscript mxGetInf mxIsNumericmxCalloc mxGetIr mxIsObjectmxClearScalarDoubleFlag mxGetJc mxIsOpaquemxCreateCellArray mxGetLogicals mxIsScalarDoubleFlagSet如果加上命令开头-full,则可以显示函数返回值的细节。
libfunctions libmx -fullMethods for class lib.libmx:[mxClassID, MA TLAB array] mxGetClassID(MA TLAB array)[lib.pointer, MA TLAB array] mxGetData(MA TLAB array)[MA TLAB array, voidPtr] mxSetData(MA TLAB array, voidPtr)[lib.pointer, MA TLAB array] mxGetPr(MA TLAB array)[MA TLAB array, doublePtr] mxSetPr(MA TLAB array, doublePtr)uint8 mxIsFinite(double)uint8 mxIsInf(double)值得注意的是,这两个函数返回值的类型均是MA TLAB的数据类型,虽然函数是利用C语言编写的。
调用库函数一旦库函数被加载到了内存空间,只要指定库名、函数名和变量就可以使用calllib函数调用库中的任何函数了。
语法格式:calllib(…libname‟,‟funcname‟,arg1,…,argn)下列语句显示如何操作:hfile=['C:\MA TLAB7\extern\include\matrix.h'];loadlibrary(…libmx‟,hfile);y=rand(4,7,2); %produce a 3D array, there are 56 elements in itcalllib(…libmx‟,‟mxGetNumberOfElements‟,y)ans=56Calllib(…libmx‟,‟mxGetClassID‟,y)ans=mxDouble_CLASS传递变量当调用外部库里的函数时,该为函数提供哪种类型的变量呢?MA TLAB的extern\examples\shrlib\shrlibsample库里对每一种特殊的变量类型都作出了说明。
但我们首先必须把该库文件的路径添加到MA TLAB的搜索路径中来,或者使该库文件所在的目录成为当前目录,两种做法的命令如下。
addpath(…C:\MA TLAB7\extern\examples\shrlib‟)cd(…C:\MA TLAB7\extern\examples\shrlib‟)下面的例子就是加载该库并显示了其中的一些函数。
loadlibrary shrlibsample shrlibsample.hlibfunctions shrlibsample –full执行上述两行后,返回:Functions in library shrlibsample:[double, doublePtr] addDoubleRef(double, doublePtr, double)double addMixedTypes(int16, int32, double)[double, c_structPtr] addStructByRef(c_structPtr)double addStructFields(c_struct)c_structPtrPtr allocateStruct(c_structPtrPtr)voidPtr deallocateStruct(voidPtr)doublePtr multDoubleArray(doublePtr, int32)[lib.pointer, doublePtr] multDoubleRef(doublePtr)int16Ptr multiplyShort(int16Ptr, int32)string readEnum(Enum1)[string, string] stringToUpper(string)这里所有的函数都是用C语言编写的。
一些通用的规则在函数的输入输出变量问题上,以下几点应注意:1.许多变量类型,象int32、double与C语言的数据类型非常相象。
这些变量只需要传递MA TLAB型的数据就可以了。
2.而有些C语言的变量类型,象**double、还有预定义型与标准MA TLAB数据类型是完全不同的。
这种情况下,有两种选择,要么给外部函数的入参传递标准的MA TLAB数据类型,让MA TLAB程序自动转化,要么先使用MA TLAB提供的转化函数,如libstruct、libpointer自己转化。
关于转化,可以参考Data Conversion。
3.C语言通常可以按形参传递变量,但MA TLAB不支持这种做法,不过可以创造MA TLABPtr或PtrPtr型的变量,去兼容C语言的形参。
4.C语言通常还可以通过形参来返回输入变量的值,而MA TLAB需要额外的变量来获得返回值。
传递变量的通用规则1.库函数传递形参时,标量不必非得声明。
2.如果库函数使用单下标来引用二维矩阵元素时,请记住,C语言是逐行处理矩阵元素,而MA TLAB是按列优先处理的。
因此迎合C语言的习惯,可以在给MA TLAB函数传递变量之前把矩阵进行转置,从函数返回后再转置回来就行了。
3.由上可知,当传递的矩阵超过二维时,MA TLAB会改变矩阵的行列结构,为了确保矩阵的结构不被破坏,可以事先记录矩阵的结构,在调用结束后利用reshape函数还原即可。
例如:vs=size(vin); %suppose the dimention of vector vin is 2-by-5-by2vout=calllib(…shrlibsample‟,‟multDoubleArray‟,vin,20); %dimention have been alteredans=2 10vout=reshape(vout,vs); %Restore the array to 2-by-5-by-2size(vout)ans=2 5 24.当支持可选参数时,可用一空矩阵来传递一个NULL型参数。
这是在变量为Ptr或PtrPtr型时唯一的选择。
传参外部库的许多函数是传递形参的,为了能与这些函数交互,MA TLAB通常传递一个叫“指针对象”的变量,不过别把它与传参混同了。
数据转化在多数情况下,传递给外部库函数或从外部库函数返回的数据类型自动被MA TLAB转化,然而,或许你偶尔也希望有些时侯能手动转化:1.当需要传递相同的数据给一系列库函数时,可能手动转化要比让MA TLAB自动转化更为明智,更能节省时间。
2.当传递大结构的数据时,手动转化数据使之匹配C结构而不是直接采用通用的MA TLAB型数据的做法,比直接使用libstruct函数把C结构型的数据转换成MA TLAB型数据更能节省内存。
3.当外部函数使用超过一层引用(例如,指向指针的指针变量double **)时,用libpointer函数构造一个参数,比直接让MA TLAB自动转化数据要好。
原始类型共享库接口支持所有标准C数据类型。
下表显示了C与MA TLAB等价的数据类型。
MA TLAB可以自动把转化数据为外部库函数所需要的任何原型数据,这就意味着可以传递一个双精度型数据给一个8位整数型变量。
下述C函数接受短整型、整型和双精度型数据:double addMixedTypes(short x, int y, double z){return (x+y+z);}你可以极其简单地在MA TLAB中只传递给该函数以双精度变量,MA TLAB自动判断每个变量接受何种类型的变量,并作近似转化。
calllib (…shrlibsample‟,‟addMixedTypes‟, 127, 33000, pi)ans=3.3130e+004转化参数当外部函数原型定义一个形参时,MA TLAB能自动地把一个按值传递的变量转化为形参。
因此,当给一个双精度指针变量赋一双精度变量时,MA TLAB会自动地把该双精度变量转化为双精度形参。
addDoubleRef是一个接受双精度指针型形参的函数:double addDoubleRef( double x, bouble *y, double z){return (x+ *y +z);}用三个双精度变量调用该函数,MA TLAB自动处理数据转化:calllib (…shrlibsample‟, …addDoubleRef‟, 1.78, 5.42, 13.3)ans=20.5000字符串当变量需要字符型指针数据时,你可以传递一个MA TLAB型字符串(矩阵)。
下述C函数接受一个字符指针型数据:char * stringToUpper (char *input){char *p=input;if (p!=NULL)while (*p!=0)*p++=toupper(*p);return input;}libfunctions显示,你可以用一个MA TLAB字符串作为输入。