简介
在前面,我们研究如何可以使用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数学库参考()
享受!