的梅克斯
命令用来-largeArrayDims
选项默认情况下。本主题介绍如何升级MEX文件以使用64位API。
您可以继续使用32位API来调用梅克斯
司法-compatiblearraydims.
选择。但是,有关使用此选项的更多信息,请参见如果不升级怎么办?.
要查看和更新MEX文件源代码,请使用以下清单。
在编辑之前准备您的代码 - 查看备份文件并创建测试.
迭代地更改和测试代码。
在使用64位API构建MEX文件之前,请使用以下方法重构现有代码更新变量而且,对于fortran,升级Fortran MEX文件以使用64位API.
每次修改后,构建和测试代码:
使用32位API进行构建。例如,建造mymexfile.c.
,键入:
墨西哥人-compatibleArrayDims myMexFile.c
每次重构后进行测试-参见每次重构迭代后测试,调试和解决差异.
使用64位API编译。建造mymexfile.c.
,键入:
mex mymexfile.c.
解决故障和警告 - 请参阅解决-largearraydims构建故障和警告.
比较结果-参见执行64位MEX文件,并与32位版本的结果进行比较.
检查内存 - 查看大阵列实验.
下面的过程使用C/ c++术语和示例代码。Fortran MEX文件共享问题,更多的任务描述在升级Fortran MEX文件以使用64位API.
在修改代码之前,请验证MEX文件是否可以使用32位API。至少,构建一个预期输入和输出的列表,或者创建一个完整的测试套件。使用这些测试将结果与更新后的源代码进行比较。结果应该是相同的。
备份所有源文件、二进制文件和测试文件。
要处理大型数组,请将包含数组索引或大小的变量转换为使用mwSize
和mwIndex
类型而不是32位㈡
类型。检查你的代码,看看它是否包含以下类型的变量:
矩阵API函数直接使用的变量-参见更新用于调用64位API中的函数的参数.
中间变量 - 见更新用于数组索引和大小的变量.
变量用作大小/索引值和32位整数 - 请参阅分析其他变量.
的64位API函数mwSize
/mwIndex
类型。有关函数列表,请参见使用64位API.搜索用于调用函数的变量。检查功能签名,显示在下语法函数参考文档中的标题。该签名标识接受的变量mwSize
/mwIndex
值作为输入或输出值。更改变量以使用正确的类型。
例如,假设您的代码使用mxCreateDoubleMatrix
函数,如下所示:
int nrows ncolumns;... y_out = mxcreatedoublematrix(nrows,ncolumns,mxreal);
要查看函数签名,请键入:
doc mxcreatedoublematrix.
的签名是:
mxarray * mxcreatedoublematrix(mwsize m,mwsize n,mx互补性complexflag)
输入参数的类型米
和n
是mwSize
.更改如表所示的代码。
替换: | : |
---|---|
int nrows ncolumns; |
mwSize nrows ncolumns; |
如果您的代码使用中间变量来计算大小和索引值,请使用mwSize
/mwIndex
为这些变量。例如,下面的代码声明了输入mxCreateDoubleMatrix
作为类型mwSize
:
mwSize nrows ncolumns;/ *输入到mxcreatedoublematrix * / int numdatapoints;nrows = 3;numdatapoints = nrows * 2;ncolumns = numdatapoints + 1;... y_out = mxcreatedoublematrix(nrows,ncolumns,mxreal);
这个例子使用了中间变量,numDataPoints(类型㈡
),计算价值ncolumns.如果复制64位值nrows变成32位变量,numDataPoints,结果值截断。您的MEX文件可能会崩溃或产生不正确的结果。使用类型mwSize
为numDataPoints,如下表所示。
替换: | : |
---|---|
int numDataPoints; |
mwSize numDataPoints; |
您无需在代码中更改每个整数变量。例如,结构和状态代码中的字段编号是类型的㈡
.但是,您需要识别用于多种目的使用的变量,并且如有必要,请用多个变量替换它们。
以下示例创建一个矩阵,mynumeric.,和结构,mystruct.,基于传感器的数量。代码使用一个变量,numsensors.,对于数组的大小和结构中的字段数。
mxarray * mynumeric,* mystruct;int numsensors;mwsize m,n;char **野外名;... mynumeric = mxcreatedoublematrix(numsensors,n,mxreal);mystruct = mxcreateStructmatrix(m,n,numsensors,fieldnames);
的函数签名mxCreateDoubleMatrix
和mxCreateStructMatrix
是:
mxarray * mxcreatedoublematrix(mwsize m,mwsize n,mxComplexity complexFlag)MxArray * mxcreateStructMatrix(MWSize M,MWSize n,int nfields,const char ** fieldnames);
为mxCreateDoubleMatrix
函数,您的代码使用numsensors.为变量米.的类型米是mwSize
.为mxCreateStructMatrix
函数,您的代码使用numsensors.为变量nfields.的类型nfields是㈡
.要同时处理这两个功能,请替换numsensors.有两个新变量,如下表所示。
替换: | : |
---|---|
int numsensors; |
/*创建2个变量*/ /*不同类型的变量*/ mwSize numSensorSize;int numSensorFields; |
myNumeric = mxCreateDoubleMatrix(numSensors, n, mxREAL); |
/ *使用mwsize变量* / / * numsensize * / mynumeric = mxcreatedoublematrix(numsensize,n,mxreal); |
myStruct = mxCreateStructMatrix(m, n, numSensors, fieldnames); |
/ *使用int变量* / / * numsensorfields * / mystruct = mxcreatestructmatrix(m,n,numsensorfields,fieldnames); |
建造mymexfile.c.
使用32位API,类型:
墨西哥人-compatibleArrayDims myMexFile.c
使用在此过程开始时创建的测试来比较更新后的MEX文件与原始二进制文件的结果。两个MEX文件应该返回相同的结果。如果不是,调试并解决任何差异。与使用64位API构建时相比,现在更容易解决差异。
-largeArrayDims
构建失败和警告查看和更新代码后,使用大型数组处理API编译MEX文件。建造mymexfile.c.
使用64位API,键入:
mex mymexfile.c.
自从此以来mwSize
/mwIndex
类型是matlab.®类型,编译器有时称它们为size_t.
,unsigned_int64.
,或其他类似的名称。
大多数构建问题与32位和64位类型之间的类型不匹配有关。请参阅第5步我如何更新mex文件使用大数组处理API (- largearraydimms)?识别特定编译器的常见构建问题和可能的解决方案。金宝搏官方网站
将使用64位API编译的MEX文件的结果与原始二进制文件的结果进行比较。如果存在任何差异或失败,请使用调试器调查原因。有关调试器功能的信息,请参阅编译器文档。
要识别问题和可能的解决方案 - 您可能会在运行MEX文件时遇到,金宝搏官方网站请参阅步骤6我如何更新mex文件使用大数组处理API (- largearraydimms)?.
在解决问题并升级MEX文件之后,它在使用大型数组处理API的同时复制原始代码的功能。
如果您可以访问具有大量内存量的机器,则可以使用大型数组进行实验。一系列双精度浮点号(Matlab中的默认值),232元素大约需要32 GB的内存。
有关演示大数组使用的示例,请参阅arraysize.c
墨西哥人文件在C MEX文件中处理大型mxArrays.