Main Content

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

mxCalcSingleSubscriptmxGetJc
mxCallocmxGetM
mxCreateCellArraymxGetN
mxCreateCellMatrixmxGetNumberOfDimensions
mxCreateCharArraymxGetNumberOfElements
mxCreateCharMatrixFromStringsmxGetNzmax
mxCreateDoubleMatrixmxGetProperty
mxCreateLogicalArraymxGetString
mxCreateLogicalMatrixmxMalloc
mxCreateNumericArraymxRealloc
mxCreateNumericMatrixmxSetCell
mxCreateSparsemxSetDimensions
mxCreateSparseLogicalMatrixmxSetField
mxCreateStructArraymxSetFieldByNumber
mxCreateStructMatrixmxSetIr
mxGetCellmxSetJc
mxGetDimensionsmxSetM
mxGetElementSizemxSetN
mxGetFieldmxSetNzmax
mxGetFieldByNumbermxSetProperty
mxGetIr 

matlabroot/extern/examples/mex にある例 arraySize.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 またはその他の変数に代入しないようにしてください。

参考

| |