主要内容

墨西哥人升级文件使用交错复杂的API

这个主题描述了如何升级你的墨西哥人文件使用交错复杂的API。你可以继续使用单独的复杂的API调用墨西哥人命令-R2017b选择。然而,使用这个选项的更多信息,请参阅我需要升级我的墨西哥人文件使用交错复杂的API呢?

请注意

如果你构建你的墨西哥人文件使用墨西哥人命令-compatibleArrayDims选项,那么您首先必须更新源代码,使用64位的API。信息,请参阅墨西哥人升级文件使用64位的API

更新你的墨西哥人的源代码,使用下面的清单。

  1. 回顾你的代码来使用公关π指针,返回的指针mxGetPr/mxGetPimxGetData/mxGetImagData功能。在交错复杂的API中,有一个指针,巴勒斯坦权力机构,返回的值mxGetDoubles和其他类型的数据功能。重要的是要检查输入数组的复杂性在试图读取数据。调用mxGetPrmxGetData在复杂的数组返回不同的结果比单独的复杂交错复杂的API API。

  2. 代码在编辑之前做好准备。

    修改你的代码之前,验证工作的墨西哥人功能-R2017bAPI。至少,构建一个预期的输入和输出列表,或创建一个完整的测试套件。使用这些测试比较结果与更新的源代码。结果应该是相同的。

    备份所有源代码、二进制和测试文件。

  3. 迭代重构现有代码通过检查以下条件。

  4. 每次改变后,编译使用交错复杂的API。构建myMexFile.c类型:

    墨西哥人-R2018a myMexFile.c
    构建myMexFile.F类型:

    墨西哥人-R2018a myMexFile.F
  5. 解决故障和警告。

  6. 每次重构后测试。

    比较的结果运行您的墨西哥人与交错复杂的API函数编译结果从你的原始二进制。如果有任何差异或失败,使用调试器对原因进行调查。有关你的调试器的功能的信息,请参考编译器文档。

  7. 构建信息添加到墨西哥人帮助文件

检查数组使用复杂性mxIsComplex

如果你的代码调用mxGetPi函数来确定复杂元素的数组,使用mxIsComplex函数来代替。这个函数构建的-R2017b-R2018aapi。代码搜索以下模式。

取代C源代码: :
mxArray * pa;…如果(mxGetPi (pa)){/ *处理复杂的数组* /}
mxArray * pa;…如果(mxIsComplex (pa)){/ *处理复杂的数组* /}
双* ptr;ptr = mxGetPi (pa);如果(ptr ! = NULL){/ *处理复杂的数组* /}

添加MX_HAS_INTERLEAVED_COMPLEX支持两金宝app个复数表示

写的代码构建的-R2017b-R2018aapi,添加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

使用类型的数据访问功能

使用mxGetDatamxGetImagData功能,您必须验证输入的类型mxArray和手动输出到正确的类型的指针。类型的数据访问功能验证的类型数组并返回正确的指针类型。当你使用mxGetInt16smxGetComplexInt16s下面的代码来处理的功能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变量和想要添加的实数和虚数xy创建数组z。数组xy是相同的大小。

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函数输入参数xy定义如下。

复杂* 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

你可以换电话mxGetPrmxGetPi与调用mxGetComplexDoubles。这个函数验证数组包含元素的类型mxComplexDouble。同样的,mxSetComplexDoubles替换mxSetPrmxSetPi

mxGetDatamxGetImagData功能不检查的类型数组。相反,您必须把返回值的指针类型相匹配的类型指定的输入。代替打电话mxGetDatamxGetImagData与单一、适当类型的数据访问功能,例如,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

-R2018aAPI,mxGetElementSize (C)函数返回sizeof (std::复杂< T >)对于一个复杂的mxArray与数据类型T。这个值是函数返回的值的两倍-R2017bAPI。同样的,mxGetElementSize (Fortran)-R2018aAPI返回的两倍值的函数-R2017bAPI。

考虑更换逐步废除功能

以下功能的-R2017b-R2018aapi。当你不需要用输入数据访问功能,输入数据功能提供了类型检查。另外,如果你使用mxGetPr,你可以选择mxGetPi对于任何复杂的阵列处理。在编写这个代码模式会导致错误-R2018a墨西哥人的功能。

你可以换电话mxGetPr与调用mxGetDoubles。这个函数验证数组包含元素的类型mxDouble。同样的,mxSetDoubles替换mxSetPr。来代替电话mxGetDatamxSetData功能,选择合适的输入数据访问功能,例如,mxGetInt64smxSetInt64s

取代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

另请参阅

相关的话题