C MEX ファイルでの大規模な mxArrays
の処理
64 ビット プラットフォームでビルドされたバイナリ MEX ファイルでは、64 ビット mxArray
を処理できます。この大規模なデータ配列がもち得る最大要素数は 248-1 です。スパース mxArray
で可能な最大要素数は、248-2 です。
以下の指示に従うことで、プラットフォームに依存しないバイナリ MEX ファイルも作成されます。
システム構成が MATLAB® のパフォーマンスに影響を与える可能性があります。64 ビット プロセッサの要件を満たしている場合、mxArray
を作成して、そのデータにアクセスできるようになります。ただし、システム メモリ、特に RAM とバーチャル メモリのサイズによって MATLAB による mxArray
の処理速度は変わります。利用できるメモリ量が大きいほど、処理は速くなります。
また、RAM のサイズによって、MATLAB が一度に処理できるデータの量が制限されます。メモリ問題の詳細は、メモリを効率的に使用するための対策を参照してください。
64 ビット API の使用
次の表に示されている API 関数のシグネチャは、mwSize
型または mwIndex
型を使用して 64 ビット mxArray
を処理します。ソース コードでこれらの関数の呼び出しに使用する変数は、適切な型でなければなりません。
mwSize
/mwIndex
を使用する C の関数 mxArray
mxCalcSingleSubscript | mxGetJc |
mxCalloc | mxGetM |
mxCreateCellArray | mxGetN |
mxCreateCellMatrix | mxGetNumberOfDimensions |
mxCreateCharArray | mxGetNumberOfElements |
mxCreateCharMatrixFromStrings | mxGetNzmax |
mxCreateDoubleMatrix | mxGetProperty |
mxCreateLogicalArray | mxGetString |
mxCreateLogicalMatrix | mxMalloc |
mxCreateNumericArray | mxRealloc |
mxCreateNumericMatrix | mxSetCell |
mxCreateSparse | mxSetDimensions |
mxCreateSparseLogicalMatrix | mxSetField |
mxCreateStructArray | mxSetFieldByNumber |
mxCreateStructMatrix | mxSetIr |
mxGetCell | mxSetJc |
mxGetDimensions | mxSetM |
mxGetElementSize | mxSetN |
mxGetField | mxSetNzmax |
mxGetFieldByNumber | mxSetProperty |
mxGetIr |
例
にある例 matlabroot
/extern/examples/mexarraySize.c
で、大規模 mxArray
のメモリ要件を説明します。例を表示するには、MATLAB エディターで arraySize.c
を開きます。
この関数では 1 つの正のスカラー数値入力が必要で、正方行列を作成するために使用します。この関数は入力のサイズをチェックして、システムがこのサイズの行列を理論的に作成できることを確認します。入力が有効であれば、mxArray
のサイズをキロバイトで表示します。
この MEX ファイルをビルドします。
mex arraySize.c
MEX ファイルを実行します。
arraySize(2^10)
Dimensions: 1024 x 1024 Size of array in kilobytes: 1024
システムに十分なメモリがなく配列が作成できない場合は、MATLAB は Out of memory
エラーを表示します。
この関数を使用して、システムの性能と大規模配列の処理の限界をテストすることができます。
負の値を使用する場合の注意
64 ビット API を使用する場合、関数 mwSize
と関数 mwIndex
は C/C++ の size_t
と等価です。この型は符号なしで、32 ビット API で使用される型 int
とは異なります。mwSize
引数または mwIndex
引数を取る関数に負の値を渡さないように注意してください。負の int
値を関数 mwSize
または関数 mwIndex
にキャストしないでください。返される値を予測できません。代わりに、負の値が使用されないようにコードを変更してください。
クロスプラットフォーム アプリケーションのビルド
32 ビット アーキテクチャと 64 ビット アーキテクチャの両方で動作するプログラムを開発する場合は、mwSize
および mwIndex
の値の上限に注意してください。32 ビット アプリケーションはこれらの値を読み、これを C/C++ で int
として宣言された変数に割り当てます。大きい mwSize
または mwIndex
の値を、小さすぎる可能性がある int
またはその他の変数に代入しないようにしてください。