墨西哥人升级文件使用64位的API
的墨西哥人
命令使用-largeArrayDims
默认选项。这个主题描述了如何升级你的墨西哥人文件使用64位的API。
您可以继续使用32位的API调用墨西哥人
命令-compatibleArrayDims
选择。然而,使用这个选项的更多信息,请参阅如果我不升级呢?。
审查和更新墨西哥人文件源代码,使用下面的清单。
准备您的代码在编辑之前——看到的备份文件并创建测试。
迭代变化和测试代码。
建立你的墨西哥人文件之前有64位API,使用重构现有代码更新变量Fortran,升级Fortran墨西哥人文件使用64位的API。
每次改变后,构建和测试代码:
构建32位的API。例如,建造
myMexFile.c
类型:墨西哥人-compatibleArrayDims myMexFile.c
每次重构——看后测试测试、调试和解决分歧在每次迭代重构。
编译使用64位的API。构建
myMexFile.c
类型:墨西哥人myMexFile.c
——看到解决失败和警告解决-largeArrayDims构建失败和警告。
比较结果,看到执行64位墨西哥人文件和比较结果与32位版本。
检查内存,看实验大数组。
下面的程序使用C / c++术语和示例代码。Fortran墨西哥人文件共享的问题,描述的更多的任务升级Fortran墨西哥人文件使用64位的API。
备份文件并创建测试
修改你的代码之前,确认墨西哥人文件适用于32位API。至少,构建一个预期的输入和输出列表,或创建一个完整的测试套件。使用这些测试比较结果与更新的源代码。结果应该是相同的。
备份所有源代码、二进制和测试文件。
更新变量
处理大型数组,数组下标变量包含转换或大小使用mwSize
和mwIndex
而不是32位类型int
类型。回顾你的代码是否包含以下类型的变量:
矩阵变量直接使用的API函数,看看更新的参数调用函数用于64位API。
中间变量——看更新数组下标变量用于和大小。
变量用作大小/索引值和32位整数——看到的分析其他变量。
更新的参数调用函数用于64位API
识别64位API函数在您的代码中使用mwSize
/mwIndex
类型。函数的列表,请参阅使用64位的API。搜索您所使用的变量,调用函数。检查函数签名,显示下语法在功能上参考文档。签名识别的变量mwSize
/mwIndex
值作为输入或输出值。改变你的变量使用正确的类型。
例如,假设您的代码使用mxCreateDoubleMatrix
函数,见以下语句:
int nrows ncolumns;…y_out = mxCreateDoubleMatrix (nrows ncolumns mxREAL);
看到函数签名,类型:
医生mxCreateDoubleMatrix
的签名是:
mxArray * mxCreateDoubleMatrix (mwSize m, mwSize n, mxComplexity 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(类型的int
),来计算的价值ncolumns。如果你复制一个64位的值nrows到32位的变量,numDataPoints这样,生成的价值。墨西哥人文件可能会崩溃或产生不正确的结果。使用类型mwSize
为numDataPoints如下表所示。
替换: | : |
---|---|
int numDataPoints; |
mwSize numDataPoints; |
分析其他变量
你不需要改变代码的每个整数变量。例如,字段数据类型的结构和状态码int
。然而,您需要识别变量用于多种目的,如有必要,用多个变量替换他们。
下面的示例创建一个矩阵,myNumeric一个结构,myStruct基于传感器的数量。代码使用一个变量,numSensors两个数组的大小和结构中的字段的数量。
* myStruct mxArray * myNumeric;int numSensors;mwSize m, n;char * *字段名;…myNumeric = mxCreateDoubleMatrix (numSensors n mxREAL);myStruct = mxCreateStructMatrix (m, n, numSensors,字段名);
的函数签名mxCreateDoubleMatrix
和mxCreateStructMatrix
是:
mxArray * mxCreateDoubleMatrix (mwSize m, mwSize n, mxComplexity ComplexFlag) mxArray * mxCreateStructMatrix (mwSize m, mwSize n, int nfields, const char * *字段名);
为mxCreateDoubleMatrix
功能,你的代码使用numSensors为变量米。的类型米是mwSize
。为mxCreateStructMatrix
功能,你的代码使用numSensors为变量nfields。的类型nfields是int
。同时处理函数,取代numSensors两个新的变量,如下表所示。
替换: | : |
---|---|
int numSensors; |
/ *创建不同类型的两个变量* / / * * / mwSize numSensorSize;int numSensorFields; |
myNumeric = mxCreateDoubleMatrix (numSensors n mxREAL); |
/ *使用mwSize变量* / / * numSensorSize * / myNumeric = mxCreateDoubleMatrix (numSensorSize n mxREAL); |
myStruct = mxCreateStructMatrix (m, n, numSensors,字段名); |
/ *使用int变量* / / * numSensorFields * / myStruct = mxCreateStructMatrix (m, n, numSensorFields,字段名); |
测试、调试和解决分歧在每次迭代重构
构建myMexFile.c
有32位API,类型:
墨西哥人-compatibleArrayDims myMexFile.c
使用您创建的测试在这个过程的开始比较的结果你的墨西哥人更新文件与原始二进制文件。两个墨西哥人文件应该返回相同的结果。如果不是,调试和解决任何分歧。差异更容易解决现在比当你构建使用64位的API。
解决-largeArrayDims
构建失败和警告
后审查和更新你的代码,编译使用大阵墨西哥人文件处理API。构建myMexFile.c
有64位API,类型:
墨西哥人myMexFile.c
自mwSize
/mwIndex
类型是MATLAB®类型,编译器有时指的是他们size_t
,unsigned_int64
或其他类似的名字。
大多数构建相关问题类型不匹配32位和64位类型。参考第5步我怎么更新mex files使用大阵处理API (-largeArrayDims) ?来确定特定的编译器,共同构建问题和可能的解决方案。金宝搏官方网站
执行64位墨西哥人文件和比较结果与32位版本
比较的结果运行您的墨西哥人文件编译64位API与原始二进制的结果。如果有任何差异或失败,使用调试器对原因进行调查。有关你的调试器的功能的信息,请参考编译器文档。
识别问题和可能的解可能遇到你的墨西哥人文件运行时,参考步骤6金宝搏官方网站我怎么更新mex files使用大阵处理API (-largeArrayDims) ?。
你解决问题和升级你的墨西哥人文件之后,它复制原始代码的功能在使用大型数组处理API。
实验大数组
如果你访问一个机器和大量的内存,你可以尝试大数组。双精度浮点数的数组(默认在MATLAB) 232元素大约需要32 GB的内存。
一个示例,演示了使用大型数组,看到arraySize.c
墨西哥人文件处理大型mxArrays C墨西哥人文件。