Main Content

カスタム関数からルックアップ テーブルへの置き換え

この例では、MATLAB® Coder™ アプリを使用して、カスタム関数をルックアップ テーブルの近似関数に置き換える方法を示します。

必要条件

この例には次の製品が必要です。

アルゴリズムとテスト ファイルの作成

ローカルの書き込み可能なフォルダーで以下を行います。

  1. MATLAB 関数 custom_fcn.m を作成します。これが置き換える元の関数です。

    function y = custom_fcn(x)
        y = 1./(1+exp(-x));
    end
  2. custom_fcn.m を呼び出すラッパー関数 call_custom_fcn.m を作成します。

    function y = call_custom_fcn(x)
        y = custom_fcn(x);
    end
  3. call_custom_fcn を使用するテスト ファイル custom_test.m を作成します。

    close all
    clear all
    
    x = linspace(-10,10,1e3);
    for itr = 1e3:-1:1
       y(itr) = call_custom_fcn( x(itr) );
    end
    plot( x, y );
    

MATLAB Coder アプリを開く

  1. この例で使用するファイルを含む作業フォルダーに移動します。

  2. MATLAB ツールストリップの [アプリ] タブの [コード生成] の下で、アプリ アイコンをクリックします。

ソース ファイルの選択

プロジェクトにエントリポイント関数 call_custom_fcn を追加するために、ファイル call_custom_fcn.m を探して [開く] をクリックします。既定では、アプリはこのプロジェクトの情報および設定を現在のフォルダーの call_custom_fcn.prj というファイルに保存します。

固定小数点変換の有効化

  1. [数値変換][固定小数点に変換] に設定します。

  2. [次へ] をクリックして [入力の型を定義] ステップに進みます。

    call_custom_fcn.m のコード違反およびコード生成の問題が検査されます。[コード生成の準備状態の確認] ページが開きます。

コード生成の準備状態の確認

  1. [問題の確認] をクリックします。関数 exp が固定小数点の変換に対応していないことがアプリによって示されます。exp を呼び出す関数である custom_fcn を置き換えるため、この警告は無視できます。

  2. [次へ] をクリックして [入力の型を定義] ステップに進みます。

入力の型の定義

  1. テスト ファイルとして custom_test を追加し、[入力の型の自動定義] をクリックします。

    テスト ファイルが実行されます。アプリはこのテスト ファイルから x を double のスカラーに決定します。

  2. [次へ] をクリックして [実行時の問題の確認] ステップに進みます。

実行時の問題の確認

[実行時の問題の確認] ステップでインストルメント化された MEX 関数が生成されます。call_custom_fcn の呼び出しを生成された MEX 関数の呼び出しで置き換えたうえで、テスト ファイル custom_test が実行されます。アプリが問題を検出した場合には警告およびエラー メッセージが出力されます。メッセージをクリックするとペイン内の問題のあるコードが強調表示され、ここでコードを編集できます。

  1. [実行時の問題の確認] ページでは、入力の型を定義するために使用したテスト ファイル custom_test が、アプリによってテスト ファイルのフィールドに入力されます。

  2. [問題の確認] をクリックします。

    アプリは問題を検出しません。

  3. [次へ] をクリックして [固定小数点に変換] ステップに進みます。

custom_fcn のルックアップ テーブルへの置き換え

  1. [関数の置き換え] タブを選択します。

    関数 exp を置き換えなければならないことがアプリによって示されます。

  2. 置き換える関数の名前 (custom_fcn) を入力し、[ルックアップ テーブル] を選択して をクリックします。

    ルックアップ テーブルに置き換えられる関数のリストに custom_fcn が追加されます。既定では、ルックアップ テーブルは線形内挿と 1000 個の点を使用します。[設計の最小値][設計の最大値]Auto に設定されます。これは、アプリがシミュレーションの実行か派生範囲の計算のいずれかによって検出された設計の最小値と最大値を使用することを意味します。

  3. [解析] 矢印 をクリックし、[ヒストグラム データを記録] を選択し、テスト ファイルが call_custom_test であることを確認します。

  4. [解析] をクリックします。

    シミュレーションが実行されます。[変数] タブにシミュレーションの最小範囲と最大範囲が表示されます。ソフトウェアは、シミュレーション範囲のデータを使用し、既定の型推奨の設定に基づき固定小数点の型を変数ごとに推奨し、[推奨された型] 列に表示します。[変換] オプションが有効になります。

  5. 推奨された型を検証して、これらの型がシミュレーション範囲全体をカバーしていることを確認します。ある変数の記録済みのヒストグラム データを表示するには、変数の [推奨された型] フィールドをクリックします。ヒストグラムに、範囲の情報と、シミュレーションの範囲のうち推奨されたデータ型がカバーする割合 (%) が示されます。

固定小数点への変換

  1. [変換] をクリックします。

    推奨された型がアプリによって検証され、エントリポイント関数の固定小数点バージョン call_custom_fcn_fixpt.m が生成されます。

  2. [出力ファイル] リストで、call_custom_fcn_fixpt.m を選択します。

    変換プロセスによって、関数 custom_fcn に対応する replacement_custom_fcn というルックアップ テーブルの近似が生成されています。固定小数点の変換プロセスで関数の値域が推定され、内挿されたルックアップ テーブルを使用してその関数が置き換えられます。既定では、ルックアップ テーブルは線形内挿と、1000 個の点、テスト ファイルの実行によって求めた最小値と最大値を使用します。

    生成された固定小数点の関数 call_custom_fcn_fixpt.m は、custom_fcn の代わりにこの近似を呼び出します。

    function y = call_custom_fcn_fixpt(x)
        fm = get_fimath();
    
        y = fi(replacement_custom_fcn(x), 0, 16, 16, fm);
    end

    これで、生成された固定小数点コードをテストして、結果を元の MATLAB 関数と比較することができます。生成された固定小数点コードの動作が元のコードの動作を十分に近似していない場合は、ルックアップ テーブルで使用する内挿法または点の数を変更してから、コードを生成し直してください。