メインコンテンツ

MEX 関数を使用した MATLAB コードの問題の確認

C/C++ コードまたは高速化された MEX 関数を生成する前に、MEX 関数を生成して実行して、MATLAB® コードにコンプライアンスの問題がないかチェックします。この手順はコード生成のワークフローの重要な部分です。

MEX 関数を使用して問題をチェックすると、次のことが可能になります。

  • 生成されたコード内で診断するのが難しい実行時エラーを検出して修正する。MEX 生成に対して既定で有効になっている実行時エラー チェックは、スタンドアロン コード生成に対しては無効です。

  • 生成されたコードが元の MATLAB 関数と同じ機能を提供することを確認する。MATLAB コードをテストするスクリプト ("テスト ベンチ" とも呼ばれる) を作成する場合、同じテスト ベンチ スクリプトを使用して、生成された MEX 関数をテストできます。

  • エラーの特定とコード生成のサイクルをより迅速に完了する。MATLAB Coder™ アプリは、問題をチェックするときに Just-In-Time (JIT) コンパイルを使用し、コード生成時間を短縮します。コマンド ラインで問題をチェックするときに、JIT コンパイルを有効にすることもできます。

次のいずれかの方法を使用して、MATLAB コードに問題がないかチェックします。

  • MATLAB Coder アプリのコード生成ツールストリップで、[生成された MEX の実行] ボタンをクリックする。エントリ ポイントを実行するテスト ベンチ ファイルを提供する必要があります。

  • コマンド ラインで、codegen コマンドを使用して MEX 関数を生成する。その後、元の MATLAB コードの実行に使用したのと同じ入力を使用して、MATLAB で、生成された MEX 関数を実行します。あるいは、テスト ベンチ スクリプトを記述した場合は、coder.runTest を使用して生成された MEX をテストできます。

スタンドアロン C/C++ コードまたは高速化された MEX 関数を生成する前にエラーを修正します。問題の確認の手順中に発生したエラーを解決するには通常、MATLAB コードを改訂する必要がありますが、入力の型の再指定も必要になる場合があります。MATLAB コードを変更した場合は、改訂したコードを MATLAB 環境で実行して正しく実行されていることを確認してから、問題がないか再度チェックします。問題の確認の手順をエラーなしで完了するには、MEX 関数の生成と実行を複数回繰り返す必要が生じる場合があります。

MEX 生成中のエラーのトラブルシューティング

MATLAB Coder アプリを使用している場合、コード ジェネレーターが MEX 生成中にエラーまたは警告を検出すると、アプリはエラー レポートを生成します。コマンド ラインでコードを生成する場合、-report または -launchreport オプションを指定して codegen コマンドを呼び出すことで、エラー レポートを作成できます。エラー レポートでは、特定された問題が説明され、MATLAB コード内のエラーのある行が特定されます。コード生成レポートを参照してください。

通常、MEX 生成中に検出されたエラーは、MATLAB コードを変更することで修正できます。場合によっては、コード構成設定を変更するか、入力の型を再指定することでエラーを修正できることがあります。次の表では、コード生成中に発生する可能性のある一般的なエラーについて説明し、推奨される解決策を示します。

エラー メッセージ フラグメント問題考えられる解決策

配列要素 element が範囲外です

コード生成では、インデックス付けによる配列の作成はサポートされません

MATLAB コードが、既存のインデックス境界の外側に値を代入して配列を作成または拡張しています。MATLAB では、未定義の配列要素に値を代入することで配列を作成または拡張できます。コード生成では、この配列の作成および拡張方法はサポートされていません。行列の要素に値を代入する前に、行列を定義する必要があります。インデックス付けされた変数を代入する前に行列を定義するを参照してください。
この代入は実行できません。次元 dimension は、左辺が固定サイズであるにもかかわらず、右辺が可変サイズであるためですMATLAB コードが、固定サイズとして定義された変数に可変サイズの配列を代入しています。

次のいずれかの方法を使用して、このエラーを解決してください。

  • 明示的なインデックスを使用して変数を強制的に同じサイズにする。

  • coder.varsize を使用して左辺の変数を可変にする。

  • 不一致の原因が可変サイズの配列の暗黙的な拡張である場合、暗黙的な拡張を無効にする

エラーの解決: 左辺は固定サイズだが右辺は可変サイズを参照してください。

関数または変数 'name' が未定義ですMATLAB コードが、コード ジェネレーターにとって未知の関数または変数を使用しています。このコードは MATLAB 実行でも失敗する可能性があります。コードを生成する前に、コードが MATLAB で実行できることを確認してください。

'name' はコード生成でサポートされていません

メソッドはコード生成でサポートされていません

コード生成で、MATLAB コード内の関数のいずれかがサポートされていません。

コードにサポートされない関数が含まれている場合は、次のいずれかの回避方法を検討してください。

  • コード生成をサポートする代替の関数と System object があるかを確認します。

  • カスタムの MATLAB コードを記述して、サポートされていない関数を置き換えます。

  • サポートされていない関数を置き換えるカスタム C 関数を呼び出すには、coder.ceval を使用します。

  • スタンドアロン コードを生成する必要がない場合は、coder.extrinsic を使用してサポートされていない関数を呼び出します。

これらの回避方法の詳細については、エラーの解決: コード生成でサポートされていない関数を参照してください。

すべての変数を使用前に完全に定義する必要があります

すべての cell 配列要素を使用前に完全に定義する必要があります

コード ジェネレーターが、MATLAB コード内の 1 つ以上の変数の型を判別できません。cell 配列要素、構造体フィールド、クラス プロパティなど、すべての実行パス上のすべての変数を使用前に完全に定義してください。問題の解決: 変数は使用前に完全に定義する必要があるおよび問題の解決: cell 配列の要素は使用前に完全に定義する必要があるを参照してください。
コード生成では、代入時の型の変更をサポートしていませんMATLAB コードが、異なるクラスまたはサイズの値を変数に代入することで、変数のプロパティを変更しています。各変数に固定のクラスを代入してください。サイズが変化する変数を使用する必要がある場合は、可変サイズ配列のコード生成を参照してください。生成されたコードで変数を再利用する必要がある場合は、同じ変数を異なるプロパティで再利用するを参照してください。

配列のサイズに互換性がありません。

配列のサイズに互換性がないため、この演算を実行できません。

次のいずれかの場合に、コード ジェネレーターで配列サイズ非互換性エラーが生成されることがあります。

  • コード ジェネレーターで以前に固定サイズとして定義された変数のサイズが MATLAB コードによって変更される。

  • サイズに互換性がない 2 つの配列に対して MATLAB コードによって演算が実行される。

このエラーを解決するには、次のいずれかの方法を試してください。

  • coder.varsize を使用して変数のサイズ変更を許可するようにコード ジェネレーターに指示する。

  • 互換性のあるサイズの配列で二項演算を実行する。

エラーの解決: 配列のサイズに互換性がないを参照してください。

コード生成用の MATLAB コード設計における注意事項およびC/C++ コード生成でサポートされている MATLAB 言語機能も参照してください。

MATLAB コードが MATLAB パス上の関数を呼び出している場合、関数が外部関数でない限り、コード ジェネレーターは各関数のコードを生成しようとします。コード生成における関数呼び出しの解決を参照してください。

MEX 実行中のエラーのトラブルシューティング

生成された MEX 関数を MATLAB で実行すると、既定ではメモリ整合性チェックが実行されます。これらのチェックは、配列の範囲と次元のチェックを実行し、MATLAB 関数に対して生成されたコード内のメモリ整合性の違反を検出します。生成された MEX 関数は、既定で応答性チェックも実行します。これにより、Ctrl+C で MEX 実行を終了できます。

MEX 関数の実行時に発生するエラーの最も一般的な原因は次のとおりです。

  • 不適切な入力値 — MEX 関数に指定した入力が、生成されたコードで予期される入力と互換性がありません。多くの場合、これらの入力によって MATLAB 関数が MATLAB でも失敗します。MATLAB 関数の実行に使用するのと同じ入力を、生成された MEX 関数に指定してください。

  • 実行時の型またはサイズの不一致 — 実行時に MEX 関数に指定した入力が、コード生成時に指定した入力の型と一致していません。この問題を解決するには、コード生成レポートを使用して、生成されたコード内の変数定義を、実行時に渡した変数と比較してください。実行時に渡す入力に対応できるように MATLAB エントリポイント関数を改訂し、それに応じて入力の型を再指定してください。エントリポイント関数の入力の型の指定を参照してください。

  • 可変サイズ データ — 生成されたコード内の 1 つ以上の変数のサイズが MEX 実行中に変更され、該当する変数のサイズについてコード ジェネレーターによって行われた特定の仮定が、実行時の入力によって反証されています。このタイプのエラーを解決するために使用できる手法については、可変サイズ配列のコード生成を参照してください。

MEX 関数をデバッグするときのベスト プラクティスの詳細については、Debugging Generated MEX Codeを参照してください。

参考

|

トピック