![]() 在前面,我们研究如何可以使用MATLAB C API来解决工程问题。在这篇文章中,我会告诉你如何可以使用MATLAB C数学库。 ?在MATLAB C数学库提供了两个独立的选区:MATLAB的程序员,寻求更多的解释MATLAB的速度或完全独立,并需要一个快速,易于使用的矩阵数学库的C程序员。每个,它提供了独特的优势。矩阵实验室 MATLAB是矩阵实验室的简称。这意味着每一个计算矩阵形式进行。另一方面包裹在矩阵形式和每个函数的每个数据类型作为输入参数矩阵。 比如你要乘以多项式如下:A =(3 × 2 5倍7)(4X5的3x3 - X2 1) 你可以使用任何多项式的系数矩阵: [3 5 7](3 × 2 5倍7)[4 0 3 -1 0 1](4X5的3x3 - X2 1),使用兑换功能,我们可以得到的结果系数:CONV([3 5 7 ],[4 0 3 -1 0 1]):A = [12 20 37 12 16 -4 5 7] 的意思是:一个= 12x7 20X6 37x5 12x4 16x3 - 4X2的5倍7C数学库 MATLAB C数学库包括约400 MATLAB数学函数。它包括内置在MATLAB数学函数和许多数学MATLAB的M文件实现的功能。 MATLAB C数学库是分层的MATLAB C数学库上。这个C层的增加值主要是易用性。 MATLAB C数学库,牢牢扎根在MATLAB的运行环境的传统。用MATLAB C数学库的编程是非常喜欢写在MATLAB M文件。虽然C语言对几个不同,由MATLAB C数学库使用的语法是MATLAB语言的语法非常相似。像MATLAB,MATLAB C数学函数库提供了自动内存管理,保护程序员从内存泄漏。 mwArray类,介绍了构建一个矩阵数据类型所代表的每一个矩阵。正如我以前说过,每一个数据必须被包裹在一个矩阵形式在另一方面:mwArray。 一个C原型支持所有可能的方法来调用特定的C数学库函数。您可以通过检查函数的语法重建的C原型。在下面的过程中,SVD()函数是用来说明这个过程。MATLAB Syntaxs = SVD(X)[U,S,V] = SVD(X)[U,S,V] = SVD(X,0) 在这个例子中,原型对应的[U,S,V] = SVD(X,0)构造一步一步。直到最后一步,原型是不完整的。 添加输出参数减去第一个输出参数,U是函数的返回值。返回值的数据类型是mwArray。 mwArray SVD(输出参数的剩余数量,S和V,作为参数的函数的第一,第二等,的原型。输出参数的数据类型是mwArray *. mwArray SVD(mwArray ・ S,mwArray * V,添加输入参数添加原型,X和零个,一个输入参数的数量,陆续以下输出参数。输入参数的数据类型是mwArray。 mwArray SVD(mwArray ・ S,mwArray,CONST mwArrayamp * V, 常量mwArrayamp X,零); 原型是完整的。如何翻译成C调用MATLAB呼叫 此过程转换MATLAB调用[U,S,V] = SVD(X,0)到C调用。该程序适用于一般库函数。请注意,在一个MATLAB C数学库函数的调用,前面是由放大器的输出参数;输入参数是没有。声明作为mwArray变量输入,输出和返回变量,输入变量和赋值。 function.U = SVD的返回值(设为第一MATLAB输出参数任何其他输出参数传递的第一个参数的功能 U = SVD(安培;,S,放大器,V,输入参数传递给C函数后,输出arguments.U = SVD(放大器,S,放大器,V,X,0); 翻译完成。 注意,如果你看到一个MATLAB的输入参数[],你应该通过C参数mwArray()。例如,B = cplxpair(A,[],朦朦胧胧) becomesB = cplxpair(一,mwArray(),DIM);mwArray类 mwArray类的公共接口是比较小,构造函数和析构函数重载new和delete运算符,一个用户定义的转换,四个索引运算符,赋值运算符,输入和输出操作符,数组大小查询例程组成。 mwArrays公共接口不包含任何数学运算符或函数。 构造函数 mwArray接口提供了许多有用的构造函数。从以下类型的数据,可以构造一个mwArray对象:一个数值标量,标量数组,字符串,mxArray *,或另一个mwArray对象 。 mwArray() 创建一个未初始化的数组。产生一个未初始化的数组传递给MATLAB C数学函数库的警告。如果使用此默认构造函数创建一个数组,必须是一个值分配给它之前将它传递到一个MATLAB C数学库函数。 要创建一个空的双矩阵对应[]在MATLAB中,使用 空() mwArray(常量字符* STR) 创建一个字符串数组。该构造的字符串复制。 mwArray(INT32 INT32行,COLS,双*实时,双* IMAG = NULL) 创建一个或两个双精度浮点数的阵列mwArray。如果指定了两个数组,构造函数创建一个复杂的数组;两个输入数组必须是相同的大小。在输入数组中的数据必须在列的大订单,通常的反向行的C S大订单。此构造输入数组复制。 注意最后一个参数,成像,被分配在构造函数中的NULL值。 IMAG是一个可选参数。当你调用这个构造函数,你不需要指定可选的参数。 mwArray(CONST mwArrayamp; mtrx) 复制mwArray。此构造是熟悉的C拷贝构造函数,复制输入数组。为了提高效率,这个例程实际上不复制数据,直到数据被修改。这些数据是通过指针引用,直到发生了修改。 mwArray(常量mxArray * mtrx) mxArray * mwArray,如可能在MATLAB C数学库或应用程序界面库的任何例程返回。此例程不输阵,但析构函数释放它复制;因此输入数组必须在堆中分配。在大多数情况下,例如,从应用程序接口库返回的矩阵,这是所期望的行为。 mwArray(双启动,双步,双停) 创建一个坡道。此构造就像MATLAB的冒号(:)运算符。例如,呼叫mwArray(1,0.5,3)创建矢量[1,1.5,2,2.5,3]。 mwArray(INT32开始,INT32,INT32步停止) 创建一个整数的坡道。 mwArray(常量mwSubArray放大器;) 从mwSubArray创建mwArray。当应用于数组索引操作,其结果是不是另一个数组,而是一个mwSubArray对象。 mwSubArray对象记得索引操作。评价操作被推迟,直到结果被分配或使用另一种表达方式。这个构造函数的计算结果mwSubArray对象编码的索引操作,并建立相应的数组 mwArray(双) 创建1 - 1从一个双精度浮点数mwArray。 mwArray(INT) 从一个整数创建一个mwArray。表1显示了简短。 mwArray构造函数构造创建范例 mwArray() 未初始化的数组 mwArray一个; mwArray(常量字符*) String数组 mwArray一个("MATLAB的Rulesquot); mwArray(INT32,INT32,双*双*) 复杂的数组 双真正的[] = {1,2,3,4} 双IMAG [] = {5,6,7,8} mwArray(2,2,真实,IMAG) ; mwArray(CONST mwArrayamp;) 复制输入数组 mwArray一个= RAND(4); mwArray B(A) mwArray(CONST mxArray *) 复制mxArray * mxArray * M = mlfScalar(1); mwArray垫(M); mwArray(双,双,双) 斜坡 mwArray A(1.2,0.1,3.5); mwArray(INT32,INT32,INT32) 整数坡道 mwArray一个(1,2,9); mwArray(CONST mwSubArrayamp;) 从子数组的数组(在索引中使用) mwArray一个= RAND(4) mwArray乙(A(3,3)); mwArray(双) 双标量数组 mwArray A(17.5); mwArray(INT) 标量整数数组 mwArray一(51); 数学函数 下面是一个有用的数学函数的MATLAB C数学库的清单:加,减mtimes,MPOWERACOS,ASINCONVconjDEC2BIN,DEC2HEXDISPFFT,fft2linspace最大值,最小值根rot90使用C数学库 若要添加C数学库的支持,请按照下列指示:\stdafx.h的末尾添加下面一行 #包括lt; matlab.hppgt; matlab.hpp C数学库接口。添加到Visual Studio(工具 - >选项 - >目录)目录接口文件(*. HPP)。例如:X:\ MATLAB \的extern \ INCLUDE \ CPP,其中x是驱动器的MATLAB路径信 将所需的库添加到您的项目(在这个例子中,libmatpm.lib) 编译您的项目!示例程序的#include"stdafx.hquot;#包括"; matlab.hppquot; / / CPP数学库的MATLAB接口/ /添加C数学库项目的#pragma评论(LIB,"libmatpm.libquot;)的#pragma评论(LIB,"libmx.libquot;)的#pragma评论(LIB,"libmatlb.libquot;)的#pragma评论(LIB,"libmat.libquot;)的#pragma评论(LIB,"libmmfile.libquot;)的#pragma评论(LIB,"libmatpm.libquot;)INT主(INT ARGC,CHAR * ARGV []){ mwArray,A,B,C; 一个魔术(mwArray(5)); 乙= TRANSPOSE(A)/ / B = A" C =加号(甲,乙); / / C = A B; 彗星=减去(A,B)/ / C = A - B; C = mtimes(一,二); / / C = A * B;& #160; 双arr1 [] = {3.0,2.0,5.0,-1.0}; 双arr2 [] = {8.0,1.0,3.0,-2.0}; mwArray D(1,4,arr1); 60; mwArray E(4,1,arr2); C = D * E / / 4 * 4矩阵mwArray F(0.0,0.1,5.0); / /创建双斜坡 &# 160; F = F *移调(F) A.打印("Aquot;); / /魔法阵,令= 5 C.打印("Cquot;); D.打印("Dquot;); 返回0;}已知问题编译matlab.hpp时,编译器会报告错误:C:\ MATLAB \的extern \ \ CPP \ matmtxif.h(16):致命错误C1083:无法打开包含文件strstream.h。没有这样的文件或目录。 : 这个错误是由于缺少在MSVC环境的预处理器定义。为了缓解这一问题,必须添加以下定义应用程序的项目文件:MSVCMSWINDIBMPCD__STDC_ 添加到您的项目:项目GT设置- GT的C / C - GT;预处理器定义的预处理器。链接器报告的错误时,将MATLAB库文件:LINK:警告LNK4098:defaultlib"; MSVCRTquot"与其他库的使用冲突; 使用/ NODEFUALTLIB:库\ ex1.exe:致命错误LNK1169:一个或多个多重定义的符号发现错误执行LINK.EXE 要解决这个问题的更改项目设置,建立多线程DLL在运行时库。请按照以下说明:从主菜单中选择项目选择设置点击C / C + +标签在"类别"下拉菜单中选择代码生成在运行时库场选择多线程DLL(调试多线程DLL"不会工作)单击"确定"重建您的项目需求 V5.0或更高 C数学库工具箱编程的知识!参考文献 MATLAB C数学库用户指南()C数学库参考() 享受! 关于作者:A。Riazi
![]() ![]() 我是一名编程爱好者,
谢谢为我们提供一个学习和分享的平台。 有什么问题。可以就本内容回复,我看到时。会尽量回复的。 评论会员:adityapatel_2006 时间:2011/11/29 您好,有谁知道如何解决稀疏线性系统的矩阵除法运算是在Matlab 执行 评论会员:。TolgaOzaslan 时间:2011/11/29 喜我要发送的数据从VC到MATLAB。我尝试UDP通信作为客户端和MATLAB的VC没有工作。 现在,我尝试使用演示程序engwindemo.c(其MATLAB帮助)使用MATLAB的发动机。所以我计划直接写入MATLAB的缓冲区或使用 在此,即使我我头文件丢失,即使我复制在各自的项目filder它包括必要的头文件。所以我在VC的主要文件夹复制。但我得到这些错误如: 1gt; C:\用户\阿迪亚\文件\ Visual Studio 2008中\ \ DATA \ \ data.cpp(40):错误C2664:"MessageBoxW":不能将参数2从"LPSTR"'LPCWSTR' 1gt;指向的类型无关;转换要求reinterpret_cast,C样式转换或函数样式转换 1gt; C:\用户\阿迪亚\文件\ Visual Studio 2008中\ \ DATA \ \ data.cpp(105):错误C2664:"MessageBoxW":不能将参数2从"LPSTR"'LPCWSTR' 1gt;指向的类型无关;转换要求reinterpret_cast,C样式转换或函数样式转换 1gt; C:\用户\阿迪亚\文件\ Visual Studio 2008中\ \ DATA \ \ data.cpp(114):错误C2664:"MessageBoxW":不能将参数2从"LPSTR"'LPCWSTR' 1gt;指向的类型无关;转换要求reinterpret_cast,C样式转换或函数样式转换 1gt; C:\用户\阿迪亚\文件\ Visual Studio 2008中\ \ DATA \ \ data.cpp(123):错误C2664:"MessageBoxW":不能将参数2从"LPSTR"'LPCWSTR' 1gt;指向的类型无关;转换要求reinterpret_cast,C样式转换或函数样式转换 请任何帮助,将高度赞赏 评论会员:ziey87 时间:2011/11/29 Selam Aleykum,我想用VS2005中使用MATLAB C库。有没有办法,我可以做到这一点? 我已经试过你的代码,但我得到了一些编译错误。但是他们没有涉及到您的代码,但做工。关于编译器和Matlab的假设上的编译器的可能的替代方案(即它不期望VS200X) 评论会员:sdas_ju 时间:2011/11/29 蒙特卡罗方法由一台计算机上的随机数实验解决的问题。他们一直围绕20世纪40年代中期以来,的估计进行实验,其中飞镖随机扔在一个边长为d的正方形板,如下所示相对简单的方式 由于圆的面积和面积的平方,然后按 在蒙特卡洛实验,ñ飞镖扔在板。让PI =(XI,YI)的第i镖(I = 1,2,3,...,N)的坐标点。点pi的圆圈内,如果是 如果在实验中X飞镖结束圆(X LT,N)内降落,然后蒙特卡罗估计是 分配问题 写一个MATLAB程序,将 1。本实验模拟产生对均匀分布的随机数的x坐标和y坐标的第二。随机数应调整,使他们覆盖的时间间隔[- D,D]。计算是否在于圆内的每一个数据点Pi。在实验结束时,总结飞镖的圆圈内,谎言和评估方程(*) 2。打印实验(N)(X)的圆圈内的试验点的总数,和蒙特卡洛。 估计总数的审判 3。上面画的图(X,Y)坐标飞镖投掷试验 评论会员:daisy02 时间:2011/11/29 我使用MSVC 6.0和MATLAB的版本6.5.0.180913a(R13)收到此错误: C:\ matlab6p5 \工作\ matlab_cpp \ matlab_cpp.cpp(3):致命错误C1083:无法打开预编译头文件:"调试/ MATLAB_CPP.pch":没有这样的文件或目录 执行cl.exe时出错 评论会员:。CATY 时间:2011/11/29 您好大家,我面临的一个问题,在我的MATLAB C编程我已经成功compliled和联系起来这段代码,但是当我跑。exe文件,结果显示"按任意键继续",所以我调试它,当它跑到线的主要(),跳了一个错误"在ex1.exe未处理的异常(NTDLL.DLL):0xC0000005:访问冲突。" 代码如下,运行在Windows XP2,视觉stidio C + + 6.0,MATLAB 6.5.1。 非常感谢你。 #包括"stdafx.h中" 包括"matlab.hpp" # 静态双数据[6] = {1,2,3,4,5,6} INT(INT ARGC的char ** argv中) { 法院<<"请输入一个矩阵:"< mwArray mat0(2,3,数据); 60; mwArray MAT1(3,2,数据); coutlt; LT,mat0 LT,LT; endl; 法院LT,LT; MAT1 LT,LT; endl; &# 160; coutlt; LT;"请输入一个矩阵:LT,LT; endl; CIN LT,LT; MAT1; 60;coutlt; LT; MAT1 LT,LT; endl; 返回0;} 评论会员:mahmoodhashmi 时间:2011/11/29 喜我Caty.I"硕士生电optics.I与MATLAB和C#的工作,我的问题是,"是有可能转换MATLAB项目exe文件MATLAB运行,而不能够安装在计算机上。如果是请帮助me.if有可能请回答"caty@ladyk.com" CATY威廉姆斯 欢呼 评论会员:游客 时间:2011/11/29 jstachera:|我亲爱的,我的哲学硕士学生,要实施MatalbApriori算法,如果你认为你对我的任何帮助,请做到这一点,我对你非常thankfull。的问候,马哈茂德哈什米不要和死亡。azbanafsh 评论会员:游客 时间:2011/11/29 我曾尝试做类似的东西在VisualStudio2005[MATLAB7,R14]#包括...mwArrayA,B,C,一个=魔术(mwArray(5))B=TRANSPOSE(A)...但它并不编译。我得到以下错误:没有发现错误C3861:"法宝":标识符没有发现错误C3861:"移调":标识符等..我一直在寻找头文件声明函数在matlab目录,但有什么像。只有mwArray声明。如何调用MATLABC代码的功能??请帮我!INDYkebitmat_f 评论会员:游客 时间:2011/11/29 我尝试打开一个图像在我的代码(VC++6.0)问题是,我可以打开MATLAB样本图像,但我不能公开我的照片。我可以打开这个图片:matlab.EvalString("我=imread('onion.png');");{BR}但我无法打开例如这个图片:matlab.EvalString("我=imread("C:\计划\MATLAB\R2007a\工具箱\图片\imdemos\p2.JPG');");{BR}imgsrc=http://www./upimg/2011_11_29_20_03_46_1.gif问题出在哪里。你认罪可以帮助我感谢会员4514057 评论会员:游客 时间:2011/11/29 我使用VC++6.0编译您的代码,做同样的什么写,但我发现这个问题:C:\matlab6p5\的extern\INCLUDE\CPP\init.h(17):错误C2079:"mwLibraryInitBuiltins"使用未定义类"DLL_EXPORT"C:\matlab6p5\的extern\INCLUDE\CPP\init.h(17):错误C2239:意外的标记"{"下面的声明"mwLibraryInitBuiltins"C:\matlab6p5\的extern\\CPP\init.h(27):错误C2146:语法错误:缺少";"在标识符"mathworks_math_library_initialize_builtins'C:\matlab6p5\的extern\INCLUDE\CPP\init.h(27):错误C2370:'mwLibraryInitBuiltins":重新定义,不同的存储类C:\matlab6p5\的extern\INCLUDE\CPP\init.h(17):见申报"mwLibraryInitBuiltins"C:\matlab6p5\的extern\INCLUDE\CPP\init.h(27):致命错误C1004:意外的文件结尾发现救救我!谢谢!dilaverv 评论会员:游客 时间:2011/11/29 得到错误消息,当我尝试的例子程序链接...libmatpm.lib(varargin.o):错误LNK2001:无法解析的外部符号_mclCreateNumericArraylibmatpm.lib(arrayidx.o):错误LNK2001:无法解析的外部符号_mclCreateNumericArrayMATLAB_CPP.obj:错误LNK2001:无法解析的外部符号_mclCreateNumericArraylibmatpm.lib(dblmtrx.o):错误LNK2001:无法解析的外部符号_mclCreateNumericArraylibmatpm.lib(stdexcpt.o):错误LNK2001:无法解析的外部符号_mclCreateNumericArraylibmatpm.lib(nsubarry.o):错误LNK2001:无法解析的外部符号_mclCreateNumericArrayMATLAB_CPP.exe-80(S)的错误,0警告(S)任何人都可以帮助我吗?BTW,我使用MATLAB5.3,MSVC6.0和WindowsVista提前thanx在..smzhaq 评论会员:游客 时间:2011/11/29 包括从MATLABmclmcr.lib\的extern\在您的项目的lib目录..smzhaq 评论会员:游客 时间:2011/11/29 您好,首先,非常感谢您所提供的所有信息。他们被证明是非常有用的。我有问题时,创建mwArray变量(我认为)!这里是一块从我的cpp文件CPP代码:双X=1.0;双Y=2.0;mwArrayMX(X);//mwArray我(Y);TestlibInitialize();//测试(MX,我的);TestlibTerminate();当我注释掉"mwArrayMX(X)",一切工作正常-我可以编译和运行我的程序没有任何问题。我已经包括了所有必需的。h和。lib文件。这里是我得到的输出,当我尝试编译我的程序没有注释掉该行(简单地说,因为它是以上):链接...的VisualCToolsDlg.obj:errorLNK2019:无法解析的外部符号_mclcppCreateError函数引用"公众:__thiscallmwException:mwException(无效)"(0mwException@@QAE@XZ?)mwException的VisualCToolsDlg.obj:errorLNK2019:无法解析的外部符号_ref_count_obj_addref引用功能"公众:__thiscallmwException:(类error_info*,BOOL)"(0mwException@@QAE@PAVerror_info@@_n@Z?)的VisualCToolsDlg.obj:错误LNK2019:无法解析的外部符号_ref_count_obj_release引用在函数"公众:虚拟__thiscallmwException:〜mwException(无效)"(?1mwException@@阿联酋@XZ)的VisualCToolsDlg.obj:errorLNK2019:无法解析的外部符号_error_info_get_message引用在函数"公众:虚拟字符常量*__thiscallmwException:(无效)常量"(?@mwException@@UBEPBDXZ)引用的VisualCToolsDlg.obj:错误LNK2019:无法解析的外部符号_mclcppGetLastError在功能上的"公共静态无效的__cdeclmwException:RAISE_ERROR(无效)"(?RAISE_ERROR@mwException@@SAXXZ)_mclGetScalarDouble的VisualCToolsDlg.obj:错误LNK2019:无法解析的外部符号在函数"公众:__thiscallmwArray:mwArray(双)"(?0mwArray@@QAE@N@Z)\发布/的VisualCTools.exe:致命错误LNK1120:无法解析的外部6这将是巨大的,如果我能得到这个响应很快,因为我已经非常有限的时间来完成我的项目。,Dilaversmzhaq 评论会员:游客 时间:2011/11/29 Assalam-O-Alaikum我面临的一个问题,在我的应用程序,我想使用MATLABC库之一。问题是,特别是与该应用程序,不与他人。当我包括Matlab.hpp,编译进来116错误消息。这些错误消息的"amiguous声明"如C2872错误:"复杂":模棱两可的符号是否有任何身体知道什么可以可能的原因。没有这样的错误,而编译的示例应用程序,但与自己的应用程序。我会很thankfull。齐亚Ttania 评论会员:游客 时间:2011/11/29 Assalam-O-Alaikum亲爱的兄弟(Jazak安拉),我提出真正有用的文章,发现我的任务非常有用,但我仍然有一个问题,我解决不了因与C的初学者。我希望你们能帮助我。我需要的是检索到传统的数据类型(双,浮法,长,整数等)专门的双精度浮点数的标值矩阵的元素。怎样才可以做什么?安拉哈菲兹齐亚-UL-哈克xb211 评论会员:游客 时间:2011/11/29 我得到了它。这是双功能mwArray(指数)();非常感谢您xb211 评论会员:游客 时间:2011/11/29 Assalam-O-Alaikumimgsrc=http://www./upimg/2011_11_29_20_03_46_2.gif高兴你找到答案!最好的问候,A.Riazixb211 |亲爱的先生Riazi, 我尝试从M文件(我使用MATLAB R2006a,WINXP) 共创一个C共享库 根据MATLAB的帮助,这是很容易的。 C共享库的例子 这个例子重写以前的C共享库的例子用C。从M文件创建C共享库的程序是相同的,以建立一个C共享库的程序,除非你使用cpplib的包装。在一行中输入以下命令: MCC - W cpplib的:libmatrixp - T链接:LIB addmatrix.m multiplymatrix.m eigmatrix.m - V - W cpplib的选项告诉MATLAB编译器生成一个共享库函数包装,并调用它。 - T链接:lib选项指定目标输出作为共享库。 注意编译器将共享库,因为您将需要在以后的目录。 我有一些M -文件:helpf.m proteinpointset.m SF.m Tangle.m vectorproduct.m mainpart.m,并希望共创库mylib中 但是,当我写 MCC - W cpplib的:mylib中T链接:LIB helpf.m proteinpointset.m SF.m Tangle.m vectorproduct.m mainpart.m - V 0; 错误:发生错误,同时炮击了mbuild(错误代码= 1)。 无法建立可执行文件。 ?错误执行MCC,返回状态= 1。 D:\ MATLAB \ BIN \ MEX.PL:错误:"mylib.cpp"编译失败。 我希望在这个问题上的任何assitance。 非常感谢你。 最亲切的问候 此致,Tatsiana 评论会员:Arris7 时间:2011/11/29 我没有在该目录matlab.hpp。我使用MATLAB7.3.0(R2006b) |
|