Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

単精度の変換におけるベスト プラクティス

インデックス変数に整数を使用

単精度に変換する MATLAB® コードでは、インデックス変数に整数を使用することをお勧めします。ただし、インデックス変数に整数を使用しないコードの場合、codegen-double2single と共に使用する単精度の変換は、可能であればインデックス変数の検出を試み、その int32 型を選択します。

assert ステートメントの使用制限

  • assert ステートメントを使用して入力引数のプロパティを定義しないでください。

  • assert ステートメントを使用して変数の型をテストしないでください。たとえば、次を使用しないでください。

    assert(isa(a, 'double'))

コンストラクターでの MATLAB クラス プロパティの初期化

MATLAB クラス プロパティを properties ブロックで初期化しないでください。代わりに、コンストラクターを使用してクラス プロパティを初期化します。

MATLAB 関数を呼び出すテスト ファイルの指定

コア アルゴリズムを、結果のテストと確認に使用する他のコードから分離します。倍精度の MATLAB アルゴリズムを呼び出すテスト ファイルを作成します。このテスト ファイルは以下の目的で使用できます。

  • 最上位の関数入力のプロパティを自動的に定義します。

  • 倍精度アルゴリズムが予想どおりに動作することを確認します。倍精度アルゴリズムの動作は、単精度バージョンのアルゴリズムの動作と比較する際のベースラインとなります。

  • 単精度バージョンのアルゴリズムの動作を、倍精度のベースラインと比較します。

最良の結果を得るには、テスト ファイルによってアルゴリズムが動作範囲全体にわたって実行されなければなりません。

コード生成用のコードの準備

単精度に変換する MATLAB コードはコード生成の要件に準拠しなければなりません。コード生成のための MATLAB プログラミングを参照してください。

MATLAB コード内のサポートされていない関数または構造体を特定するには、MATLAB ファイルの先頭に %#codegen プラグマを追加します。MATLAB エディターでコードを編集すると、MATLAB コード アナライザーにより、コード生成でサポートされていない関数と構造体にフラグが付けられます。コード アナライザーによるコードのチェックを参照してください。MATLAB Coder™ アプリを使用する場合、アプリはコード生成の準備状態に対してコードのスクリーニングを行います。関数行でコード生成の準備状態ツールを使用できます。コード生成の準備状態ツールを使ったコードのチェックを参照してください。

単精度の変換前に倍精度コードを確認

単精度の変換プロセスを開始する前に、倍精度の MATLAB コードからコードを正常に生成できることを確認します。倍精度の MATLAB コードの MEX バージョンを生成して実行すると、次が可能になります。

  • コンパイルの問題の検出と修正。

  • 生成された単精度コードが倍精度の MATLAB コードと同じ動作をすることの確認。

MATLAB で MEX 関数をテストする理由 を参照してください。

単精度の C/C++ コードの生成におけるベスト プラクティス

MATLAB Coder アプリまたは -singleC オプションと共に codegen を使用して単精度の C/C++ コードを生成する場合は、次のベスト プラクティスに従います。

C99 標準の数学ライブラリの使用

C/C++ ライブラリまたは実行可能ファイルを生成する場合、既定では、コード ジェネレーターは C99 (ISO) 規格の標準の数学ライブラリを使用します。C89/C90 (ANSI) ライブラリを使用して単精度 C/C++ コードを作成する場合、このライブラリ内の関数が倍精度を使用していると、コード ジェネレーターは警告を表示します。この警告を回避するには、言語標準を C99 (ISO) に設定します。単精度 C/C++ コードへの変換からの警告を参照してください。

大規模な double の定数を整数にキャスト

元の倍精度の MATLAB 関数で 2^24 より大きい定数の場合、定数値に対して十分なサイズの整数型に定数をキャストします。以下に例を示します。

a = int32(2^24 + 1);

単精度の C/C++ コードを生成する前に単精度の MEX を生成して実行

単精度の C コードを生成する前に、単精度の MEX バージョンの MATLAB コードを生成して実行します。この方法に従うことで、コンパイラの問題を検出して修正できます。単精度の MEX 関数に MATLAB コードと同じ機能があることを確認できます。

codegen-singleC と共に使用する場合、次を行います。

  1. 単精度の MEX を生成します。

  2. coder.runTest を呼び出して、倍精度の MATLAB コードの呼び出しを単精度の MEX コードの呼び出しで置き換えてテスト ファイルを実行します。

MATLAB Coder アプリを使用する場合、単精度の変換を有効にした状態で [実行時の問題の確認] ステップを実行します。

単精度の MATLAB コードの生成におけるベスト プラクティス

codegen-double2single オプションと共に使用して単精度の MATLAB コードを生成する場合は、次のベスト プラクティスに従います。

-args オプションを使用して入力プロパティを指定

単精度の MATLAB コードを生成する場合、テスト ファイルを指定する際に -args オプションを使用して引数のプロパティを指定する必要はありません。この場合、コード ジェネレーターはテスト ファイルを実行して入力の型のプロパティを決定します。ただし、テスト ファイルを実行するとコード生成の速度を低下させる可能性があります。入力プロパティを coder.getArgTypes で一度決定しておくことをお勧めします。その後で、プロパティを -args に渡します。以下に例を示します。

types = coder.getArgTypes('myfun_test', 'myfun');
scfg = coder.config('single');
codegen -double2single scfg -args types myfun -report

同じ MATLAB セッションでコード生成を繰り返す場合は、この方法によって時間を短縮できます。

数値のテストと I/O データのログ

関数 codegen-double2single オプションと共に使用して単精度の MATLAB コードを生成する場合、比較プロット用に数値テストと I/O データ ログを有効にします。数値テストを使用するには、MATLAB 関数を呼び出すテスト ファイルを指定しなければなりません。数値テストと I/O データ ログを有効にするには、coder.SingleConfig オブジェクトを作成します。TestBenchNameTestNumerics および LogIOForComparisonPlotting プロパティを設定します。次に例を示します。

scfg = coder.config('single');
scfg.TestBenchName = 'mytest';
scfg.TestNumerics = true;
scfg.LogIOForComparisonPlotting = true;

関連するトピック