墨西哥人升级文件使用交错复杂的API
这个主题描述了如何升级你的墨西哥人文件使用交错复杂的API。你可以继续使用单独的复杂的API调用墨西哥人
命令-R2017b
选择。然而,使用这个选项的更多信息,请参阅我需要升级我的墨西哥人文件使用交错复杂的API呢?
请注意
如果你构建你的墨西哥人文件使用墨西哥人
命令-compatibleArrayDims
选项,那么您首先必须更新源代码,使用64位的API。信息,请参阅墨西哥人升级文件使用64位的API。
更新你的墨西哥人的源代码,使用下面的清单。
回顾你的代码来使用
公关
和π
指针,返回的指针mxGetPr
/mxGetPi
和mxGetData
/mxGetImagData
功能。在交错复杂的API中,有一个指针,巴勒斯坦权力机构
,返回的值mxGetDoubles
和其他类型的数据功能。重要的是要检查输入数组的复杂性在试图读取数据。调用mxGetPr
和mxGetData
在复杂的数组返回不同的结果比单独的复杂交错复杂的API API。代码在编辑之前做好准备。
修改你的代码之前,验证工作的墨西哥人功能
-R2017b
API。至少,构建一个预期的输入和输出列表,或创建一个完整的测试套件。使用这些测试比较结果与更新的源代码。结果应该是相同的。备份所有源代码、二进制和测试文件。
迭代重构现有代码通过检查以下条件。
每次改变后,编译使用交错复杂的API。构建
myMexFile.c
类型:墨西哥人-R2018a myMexFile.c
myMexFile.F
类型:墨西哥人-R2018a myMexFile.F
解决故障和警告。
每次重构后测试。
比较的结果运行您的墨西哥人与交错复杂的API函数编译结果从你的原始二进制。如果有任何差异或失败,使用调试器对原因进行调查。有关你的调试器的功能的信息,请参考编译器文档。
检查数组使用复杂性mxIsComplex
如果你的代码调用mxGetPi
函数来确定复杂元素的数组,使用mxIsComplex
函数来代替。这个函数构建的-R2017b
和-R2018a
api。代码搜索以下模式。
取代C源代码: | : |
---|---|
mxArray * pa;…如果(mxGetPi (pa)){/ *处理复杂的数组* /} |
mxArray * pa;…如果(mxIsComplex (pa)){/ *处理复杂的数组* /} |
双* ptr;ptr = mxGetPi (pa);如果(ptr ! = NULL){/ *处理复杂的数组* /} |
添加MX_HAS_INTERLEAVED_COMPLEX
支持两金宝app个复数表示
写的代码构建的-R2017b
和-R2018a
api,添加MX_HAS_INTERLEAVED_COMPLEX
宏。这个宏的回报真正的
如果你构建的墨西哥人文件-R2018a
选择。
包装下面的代码在一个#如果MX_HAS_INTERLEAVED_COMPLEX
声明确保这段代码将建立的-R2017b
或-R2018a
墨西哥人
选择。然而,在这个例子中,没有代码执行时用-R2018a
。
取代C源代码: | : |
---|---|
静态孔隙analyze_double (const mxArray * array_ptr) {mwSize total_num_of_elements,指数;双*公关,*π;total_num_of_elements = mxGetNumberOfElements (array_ptr);公关= mxGetPr (array_ptr);π= mxGetPi (array_ptr);(指数= 0;指数< total_num_of_elements;索引+ +){如果(mxIsComplex (array_ptr)) {mexPrintf (“% g + % gi \ n”*公关+ +,* pi + +);其他}{mexPrintf (“% g \ n”*公关+ +);}}} |
静态孔隙analyze_double (const mxArray * array_ptr) {mwSize total_num_of_elements,指数;total_num_of_elements = mxGetNumberOfElements (array_ptr);#如果MX_HAS_INTERLEAVED_COMPLEX / *交错复杂的API处理* / mxComplexDouble *电脑;mxDouble * p;如果(mxIsComplex (array_ptr)){电脑= mxGetComplexDoubles (array_ptr);(指数= 0;指数< total_num_of_elements;指数+ +){mexPrintf (“= % g + % gi \ n ", (* pc) .real, (* pc) .imag);pc + +;其他}}{p = mxGetDoubles (array_ptr); for (index=0; index |
取代Fortran源代码: | : |
---|---|
mwPointer prhs(*),公关公关= mxGetPr (prhs (1)) |
mwPointer prhs(*),公关#如果MX_HAS_INTERLEAVED_COMPLEX公关= mxGetDoubles (prhs(1) #其他公关= mxGetPr (prhs (1) # endif |
使用类型的数据访问功能
使用mxGetData
和mxGetImagData
功能,您必须验证输入的类型mxArray
和手动输出到正确的类型的指针。类型的数据访问功能验证的类型数组并返回正确的指针类型。当你使用mxGetInt16s
和mxGetComplexInt16s
下面的代码来处理的功能int16
数组,你不需要记住相应的C类型,短整型
。
取代C源代码: | : |
---|---|
静态孔隙analyze_int16 (const mxArray * array_ptr){短int *公关,*π;公关= (int *) mxGetData (array_ptr);π= (int *) mxGetImagData (array_ptr);如果(mxIsComplex (array_ptr)){/ *处理复杂数据*公关,*π* /}其他{/ *过程实际数据*公关* /}} |
静态孔隙analyze_int16 (const mxArray * array_ptr) {mxComplexInt16 *电脑;mxInt16 * p;如果(mxIsComplex (array_ptr)){电脑= mxGetComplexInt16s (array_ptr);/ *处理复杂数据(* pc) .real, (* pc)。其他图像放大* /}}{p = mxGetInt16s (array_ptr);/ *过程实际数据* p * /}}} |
处理复杂的mxArrays
下面的例子展示如何用MATLAB®使用一个数组变量来表示一个复杂的数组。
复杂的CmxArrays
假设您有以下复杂mxArray
变量和想要添加的实数和虚数x
和y
创建数组z
。数组x
和y
是相同的大小。
mxArray * x, y, z;
而不是创建两个指针xr
和习
为数组x
,创建一个指针xc
类型的mxComplexDouble
。来访问元素的实部和虚部我(我)
,使用我[我].real
和我[我].imag
。
取代C源代码: | : |
---|---|
双* xr, *, *, *, *锆、*子;/ *获取指针数组* /的实部和虚部xr = mxGetPr (x);ξ= mxGetPi (x);年= mxGetPr (y);易= mxGetPi (y);zr = mxGetPr (z);子= mxGetPi (z);…/ *对元素执行加法我* / zr[我]= xr[我]+年(我);子[我]=[我]+ yj[我]; |
/ *获取复杂的数组指针* / mxComplexDouble * xc = mxGetComplexDoubles (x);mxComplexDouble * yc = mxGetComplexDoubles (y);mxComplexDouble *佐= mxGetComplexDoubles (z);…/ *对元素执行加法我* /佐[我]。真正的=我[我]。真正+ yc[我].real;佐[我]。图像放大=我[我]。图像放大+ yc[我].imag; |
下面的代码复制一个mxArray
到一个输出参数。和复制的代码显示了如何测试复杂的数组。
取代C源代码: | : |
---|---|
mxGetPr (plhs [0]) [0] = mxGetPr (prhs[0])(指数);如果(mxIsComplex (prhs [0])) {mxGetPi (plhs [0]) [0] = mxGetPi (prhs[0])(指数);} |
如果(mxIsComplex (prhs [0])) {mxGetComplexDoubles (plhs [0]) [0] = mxGetComplexDoubles (prhs[0])(指数);其他}{mxGetDoubles (plhs [0]) [0] = mxGetDoubles (prhs[0])(指数);} |
复杂的FortranmxArrays
假设你有两个复杂的两倍mxArrays
并想通过Fortran函数输入参数x
和y
定义如下。
复杂* 16 x (*), y (*)
而不是分别将各自的实部和虚部mxArray
,可以使用mxGetComplexDoubles
函数。
取代Fortran源代码: | : |
---|---|
mwPointer mxGetPr mxGetPi C的数据复制到本地复杂的Fortran数组。调用mxCopyPtrToComplex16 (+ mxGetPr (prhs (1)), + mxGetPi (prhs (1)), x, nx)调用mxCopyPtrToComplex16 (+ mxGetPr (prhs (2)), + mxGetPi (prhs (2)), y,纽约) |
mwPointer mxGetComplexDoubles整数* 4 * 4 mxCopyPtrToComplex16地位整数,mxCopyComplex16ToPtr C的数据复制到本地复杂的Fortran数组。状态= + mxCopyPtrToComplex16 (mxGetComplexDoubles (prhs (1)), x, nx) C测试错误条件的地位状态= + mxCopyPtrToComplex16 (mxGetComplexDoubles (prhs (2)), y,纽约)C测试错误条件的地位 |
维护的复杂性mxArray
这个C代码片段展示了如何将一个真实的,双、输入数组prhs [0]
成一个复杂的数组。下面的代码设置变量用来填满复杂的部分数组连续数字。
/ /代码检查数量和预期的参数类型mwSize行= mxGetM (prhs [0]);mwSize关口= mxGetN (prhs [0]);mwSize深圳= mxGetElementSize (prhs [0]);
下面的代码展示了如何使用mxMakeArrayComplex
把一个真实的、双、输入数组交错复杂mxArray
。更多的例子,请参阅mxMakeArrayComplex (C)
。
取代C源代码: | : |
---|---|
plhs [0] = mxDuplicateArray (prhs [0]);mxDouble * dc = (mxDouble *) mxMalloc(行*关口* sz);mxSetImagData (plhs[0]特区);for (int i = 0;我<行*关口;我+ +){直流[我]= i + 1;} |
plhs [0] = mxDuplicateArray (prhs [0]);如果(mxMakeArrayComplex (plhs [0])) {mxComplexDouble * dt = mxGetComplexDoubles (plhs [0]);for (int i = 0;我<行*关口;我+ +){dt[我]。图像放大= i + 1;}} |
取代分离复杂的功能
以下功能不交错复杂的API。你必须用交错复杂的函数在处理复杂的数据。
mxGetPi
mxSetPi
mxGetImagData
mxSetImagData
你可以换电话mxGetPr
和mxGetPi
与调用mxGetComplexDoubles
。这个函数验证数组包含元素的类型mxComplexDouble
。同样的,mxSetComplexDoubles
替换mxSetPr
和mxSetPi
。
的mxGetData
和mxGetImagData
功能不检查的类型数组。相反,您必须把返回值的指针类型相匹配的类型指定的输入。代替打电话mxGetData
和mxGetImagData
与单一、适当类型的数据访问功能,例如,mxGetComplexInt64s
。
取代C源代码: | : |
---|---|
mxArray * pa;mwSize numElements;int64_T *公关,*π;公关= (int64_T *) mxGetData (pa);π= (int64_T *) mxGetImagData (pa);numElements = mxGetNumberOfElements (pa); |
mxArray * pa;mwSize numElements;mxComplexInt64 *电脑;电脑= mxGetComplexInt64s (pa);numElements = mxGetNumberOfElements (pa); |
计算数组数据大小mxGetElementSize
在-R2018a
API,mxGetElementSize (C)
函数返回sizeof (std::复杂< T >)
对于一个复杂的mxArray
与数据类型T
。这个值是函数返回的值的两倍-R2017b
API。同样的,mxGetElementSize (Fortran)
在-R2018a
API返回的两倍值的函数-R2017b
API。
考虑更换逐步废除功能
以下功能的-R2017b
和-R2018a
api。当你不需要用输入数据访问功能,输入数据功能提供了类型检查。另外,如果你使用mxGetPr
,你可以选择mxGetPi
对于任何复杂的阵列处理。在编写这个代码模式会导致错误-R2018a
墨西哥人的功能。
mxGetPr
mxSetPr
你可以换电话mxGetPr
与调用mxGetDoubles
。这个函数验证数组包含元素的类型mxDouble
。同样的,mxSetDoubles
替换mxSetPr
。来代替电话mxGetData
和mxSetData
功能,选择合适的输入数据访问功能,例如,mxGetInt64s
和mxSetInt64s
。
取代C源代码: | : |
---|---|
双* y;/ *创建一个指针输入矩阵* / y = mxGetPr (prhs [1]); |
mxDouble * p;p = mxGetDoubles (prhs [1]); |
取代Fortran源代码: | : |
---|---|
mwPointer公关mwPointer mxGetPr C创建一个指向输入矩阵公关= mxGetPr (prhs (1)) |
mwPointer公关mwPointer mxGetDoubles公关= mxGetDoubles (prhs (1)) |
构建信息添加到墨西哥人帮助文件
考虑创建一个帮助文件中描述使用帮助文件,墨西哥人的功能,包含构建信息。例如,创建一个文件displayTypesafeNumeric.m
包含以下文本。
% displayTypesafeNumeric。m帮助文件displayTypesafeNumeric C墨西哥人的功能%%使用下面的命令来构建这个墨西哥人文件:%墨西哥人-R2018a displayTypesafeNumeric.c
在MATLAB命令提示符,键入:
帮助displayTypesafeNumeric
displayTypesafeNumeric.mHelp file for displayTypesafeNumeric C MEX function Use the following command to build this MEX file: mex -R2018a displayTypesafeNumeric.c