単精度の変換におけるベスト プラクティス
インデックス変数に整数を使用
単精度に変換する 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
と共に使用する場合、次を行います。
単精度の MEX を生成します。
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
オブジェクトを作成します。TestBenchName
、TestNumerics
および LogIOForComparisonPlotting
プロパティを設定します。次に例を示します。
scfg = coder.config('single'); scfg.TestBenchName = 'mytest'; scfg.TestNumerics = true; scfg.LogIOForComparisonPlotting = true;