Main Content

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

行優先の配列レイアウトのための直接ルックアップ テーブル アルゴリズム

この例では、Simulink® がテーブル データからベクトルまたは 2 次元行列を選択する方法を示します。2 次元のテーブルでは、モデル コンフィギュレーション設定 [行優先の配列レイアウトに最適化されたアルゴリズムを使用] に応じて出力ベクトルが列または行になります。この例では、直接ルックアップ テーブル アルゴリズムを行優先の配列レイアウトに最適化します。列優先の配列レイアウトに最適化されている直接ルックアップ テーブル アルゴリズムも参照として示します。行優先の内挿アルゴリズムを使用して生成されたコードは、行優先の配列レイアウトのテーブル データを操作する場合に最適な速度とメモリ使用量によるパフォーマンスが得られます。列優先アルゴリズムを使用して生成されたコードは、列優先の配列レイアウトで最適なパフォーマンスが得られます。

この例では次を行います。

  • 列優先アルゴリズムまたは行優先アルゴリズムを使用した直接ルックアップの使用によるベクトルまたは平面の出力。

  • 列優先アルゴリズムから行優先アルゴリズムへの切り替え時のセマンティクスの保持。

  • 行優先アルゴリズムおよび配列のレイアウトを使用したコードの生成。

行優先アルゴリズムを使用したシミュレーション — 3 次元テーブルからのベクトルの出力

モデル例 RowDLUT3DSelectVector および ColumnDLUT3DSelectVector を開きます。

  open_system('RowDLUT3DSelectVector');
  open_system('ColumnDLUT3DSelectVector');

1. Simulink の既定の設定では、列優先アルゴリズムおよび列優先の配列レイアウトを使用するモデルが設定されます。モデル ColumnDLUT3DSelectVector は、列優先アルゴリズムを使用するように事前設定されています。モデルのシミュレーションを実行してワークスペース変数 yout に格納される出力を確認します。

2. 行優先アルゴリズムを有効にするために、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[数学とデータ型] ペインで、コンフィギュレーション パラメーター行優先の配列レイアウトに最適化されたアルゴリズムを使用を選択します。あるいは、MATLAB® コマンド ウィンドウで次のように入力します。

set_param('ColumnDLUT3DSelectVector','UseRowMajorAlgorithm','on');

3. [シミュレーション] タブで [実行] をクリックしてモデルをシミュレーションします。出力の次元およびワークスペース変数 yout に格納される数値の変更を確認します。

列優先アルゴリズムと行優先アルゴリズムは、出力ベクトルの選択において意味的に異なります。たとえば、2 次元テーブルでは、Simulink は列優先アルゴリズムの出力として列ベクトルを選択し、行優先アルゴリズムには行ベクトルを選択します。3 次元またはそれ以上の次元をもつテーブルでは、Simulink は列優先アルゴリズムのテーブルの最初の次元および行優先アルゴリズムのテーブルの最後の次元から出力ベクトルを選択します。選択されたベクトルの要素はテーブルのストレージ メモリ内で連続しています。この例では、最後の次元は 3 次元テーブルの 3 番目の次元です。セマンティクスの変更のために、列優先および行優先の直接ルックアップ テーブル アルゴリズムは、異なるベクトル サイズおよび数値を出力します。

次の図は、3 次元テーブルの行優先および列優先の直接ルックアップ テーブル アルゴリズムのベクトル出力を比較します。

テーブル置換の使用によるセマンティクスの保持

ベクトルまたは 2 次元行列を出力する直接ルックアップ テーブルの場合、列優先アルゴリズムから行優先アルゴリズムに切り替えるときにモデル セマンティクスが変更されます。セマンティクスを保持するか、同じ出力に同じブロック I/O 接続が必ず指定されるようにするには、テーブル データを置換しなければなりません。そうでない場合、Simulink は正しくない次元を下流ブロックに伝播します。

1. ブロック ColumnDLUT3DSelectVector/Direct Lookup Table (n-D) には 3 次元のテーブル データ "T3d = reshape([1:24], 3,2,4)" および値が "0""1" (両方とも 0 ベースのインデックス) の 2 つの入力端子があります。選択された出力ベクトルは、列優先アルゴリズムの T3d(:,1,2) (1 ベースのインデックス) です。同じモデル上の行優先アルゴリズムのセマンティクスを保持するには、同じインデックス端子の入力をもつ同じベクトルを選択し、テーブルを T3d_p = permute(T3d, [2,3,1]) として置換します。行優先アルゴリズムの場合、選択されるベクトルは T3d_p(1,2,:) です。

T3d_str = get_param('ColumnDLUT3DSelectVector/Direct Lookup Table (n-D)','Table');
set_param('ColumnDLUT3DSelectVector/Direct Lookup Table (n-D)','Table',...
['permute(',T3d_str,',[2,3,1])']);

2. テーブル データをファイルからインポートする場合、インポートする前にファイル内のテーブル データを置換しなければなりません。この置換により、テーブルはコード生成ワークフローおよびシミュレーション全体を通じて調整可能なままになります。

行優先アルゴリズムおよび配列のレイアウトを使用したコード生成

テーブル データを置換した後で、Simulink は行優先のシミュレーションのモデル ColumnDLUT3DSelectVector を設定します。このモデルは、置換されたテーブル データを含み、行優先アルゴリズムを使用する事前設定されたモデル RowDLUT3DSelectVector と同じです。

1. これらのモデルを行優先のコード生成用に設定するには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[行優先の配列レイアウトに最適化されたアルゴリズムを使用] コンフィギュレーション パラメーターの有効化に加えて、[コード生成]、[インターフェイス] ペインで、コンフィギュレーション パラメーター配列のレイアウトを [Row-Major] オプションに変更します。このコンフィギュレーション パラメーターにより行優先のコード生成用のモデルが有効になります。あるいは、MATLAB コマンド ウィンドウで次のように入力します。

% For model 'ColumnDLUT3DSelectVector'
set_param('ColumnDLUT3DSelectVector', 'ArrayLayout','Row-major');
% For model 'RowDLUT3DSelectVector'
set_param('RowDLUT3DSelectVector', 'ArrayLayout','Row-major');

2. Direct Lookup Table (n-D) ブロックのダイアログ ボックスで、置換された 3 次元のテーブル データを調べます。

3. MATLAB の現在のフォルダーを書き込み可能なフォルダーに変更します。[C コード] タブで [ビルド] をクリックし、C コードを生成します。生成されたコードで、関数 memcpyfor ループを置き換えます。memcpy を使用して、データを保存するメモリの量を削減します。この最適化によって実行速度が向上します。

行優先アルゴリズムによるシミュレーション — 3 次元テーブルからの平面の出力

open_system('RowDLUT3DSelectPlane');
open_system('ColumnDLUT3DSelectPlane');

1. 平面または 2 次元行列を 3 次元テーブルから出力するモデル例 RowDLUT3DSelectPlane を開きます。

2. ColumnDLUT3DSelectVector で実行した手順を繰り返して、モデルのシミュレーションとコード生成を行います。3 次元テーブルから 2 次元行列を出力する行優先および列優先の直接ルックアップ アルゴリズムを次に示します。

close_system('RowDLUT3DSelectVector',0);
close_system('ColumnDLUT3DSelectVector',0);
close_system('RowDLUT3DSelectPlane',0);
close_system('ColumnDLUT3DSelectPlane',0);

関連するトピック