Main Content

可変サイズの MATLAB Function ブロック変数の宣言

[可変サイズの配列をサポート] ブロック プロパティが有効になっている場合、MATLAB Function ブロックは、シミュレーション中にサイズが変化する変数をサポートします。可変サイズの配列をサポートを参照してください。ただし、シミュレーション中にサイズが変化するのは、可変サイズとして指定した変数だけです。スコープに応じて、MATLAB Function ブロック エディターを使用するか、関数 coder.varsize を使用するか、接続されたブロック信号からサイズの変動性を継承することで、変数を可変サイズとして設定できます。スコープの詳細については、スコープを参照してください。

出力変数

既定では、出力変数は可変サイズではありません。出力を可変サイズとして指定するには、以下を実行します。

  1. MATLAB Function ブロックをダブルクリックして MATLAB Function ブロック エディターを開きます。

  2. [シンボル] ペインとプロパティ インスペクターを開きます。[関数] タブで、[データの編集] をクリックします。

  3. [シンボル] ペインで出力変数を選択します。

  4. プロパティ インスペクターの [プロパティ] タブで、[可変サイズ] プロパティを選択します。

  5. [サイズ] プロパティで、サイズを上限として指定します。たとえば、許容できる最大サイズとして 2 行 4 列の行列を指定するには、「[2 4]」と入力します。

その他のスコープ タイプ

入力変数は接続された信号からサイズを継承します。そのため、入力変数を明示的に可変サイズとして定義しません。可変サイズ信号の作成の詳細については、可変サイズの信号の基礎を参照してください。

変数が入力変数または出力変数でない場合は、関数 coder.varsize を使用して変数を定義します。

フィルター アルゴリズムでの可変サイズ信号の使用

この例では、可変サイズ ベクトルを使ってホワイト ノイズ信号の値を格納します。信号の値は関数によって次のように間引きされるので、ベクトルのサイズは実行時に変化する可能性があります。

  • 指定された許容誤差内で互いに一意でないと見なされる信号の値を除去する。

  • 信号の値を 2 つずつ平均して、その結果の平均値のみを出力する。

このモデルでは、Band-Limited White Noise ブロックが、ホワイト ノイズの信号源として、一連の正規分布の乱数値を生成します。MATLAB Function ブロック Filter が、指定された許容誤差内で互いに一意でないと見なされる信号の値を除去します。次に、MATLAB Function ブロック Average が、指定された数の一意信号値を平均した値を出力します。Scope ブロックが、Filter ブロックと Average ブロックの出力を表示します。構成を確認するにはモデルを開きます。

model = "emldemo_process_signal";
open_system(model);

model_var_size_MLFB.png

ソース信号の検証

ソース信号のプロパティを確認するには、Band-Limited White Noise ブロックを開きます。[ノイズ パワー] パラメーターのサイズがその信号値を入れる配列のサイズを定義します。この配列は、double 値の 1 行 9 列のベクトルです。

ex_varsize_source.png

Filter MATLAB Function ブロックの検証

フィルター処理関数を検証するには、Filter を開きます。Filter は、許容誤差 0.2 内で互いに一意でない信号の値を除去します。関数は外部 MATLAB® 関数ファイル emldemo_uniquetol.m を呼び出して、信号値をフィルター処理します。関数は 1 行 9 列のホワイト ノイズ信号値のベクトルを 1 番目の引数として、許容誤差を 2 番目の引数として渡します。

function y = uniquify(u)
y = emldemo_uniquetol(u,0.2);

外部関数 emldemo_uniquetol のコードを確認するには、MATLAB 関数ファイル emldemo_uniquetol.m を開きます。emldemo_uniquetolA をフィルター処理した値を出力ベクトル B に入れて戻します。すべての ij に対して abs(B(i) - B(j)) > tol になります。

function B = emldemo_uniquetol(A,tol) 
%#codegen

A = sort(A);
B = A(1);
k = 1;
for i = 2:length(A)
    if abs(A(k) - A(i)) > tol
        B = [B A(i)];
        k = i;
    end
end

各タイム ステップにおいて、Band-Limited White Noise ブロックは一連の異なる乱数値を A として生成するため、emldemo_uniquetol が生成する B の出力信号の数はそのたびに異なる可能性があります。そのため、y は可変サイズでなければなりません。y を可変サイズにするには、[可変サイズ] プロパティを有効にする必要があります。この例では、y に対して [可変サイズ] が有効になっています。Filter で、[シンボル] ペインとプロパティ インスペクターを開きます。[関数] タブで、[データの編集] をクリックします。[シンボル] ペインで y をクリックすると、プロパティ インスペクターにプロパティが表示されます。可変サイズの出力については、[サイズ] プロパティを最大サイズの上限として指定する必要があります。この例では、[サイズ][1 9] です。

ex_varsize_output_uniquify.png

出力に対して [可変サイズ] プロパティを有効にするには、MATLAB Function ブロックで [可変サイズの配列をサポート] プロパティを有効にする必要があります。

Average MATLAB Function ブロックの検証

Average は、Filter でフィルター処理された値を次の条件に従って平均化します。

  • 信号の数が 1 より多く、2 の倍数である場合、Average は連続するすべての値のペアを平均化します。

  • 信号の数が 1 より多く、2 の倍数でない場合、Average は最初の値を除外して残りの連続するペアを平均化します。

  • 信号が 1 つだけの場合、Average は値を変更せずに返します。

Average を開いてコードを確認します。

function y = avg(u)

if numel(u) == 1
    y = u;
else
    k = numel(u)/2;
    if k ~= floor(k)
        u = u(2:numel(u));
    end
    y = emldemo_navg(u,2);
end

関数 avg は外部 MATLAB 関数 emldemo_navg を呼び出して 2 つの連続する信号値すべての平均を計算します。

function B = emldemo_navg(A,n) 
%#codegen

assert(n>=1 && n<=numel(A));

B = zeros(1,numel(A)/n);
k = 1;
for i = 1 : numel(A)/n
     B(i) = mean(A(k + (0:n-1)));
     k = k + n;
end

uy はどちらも可変サイズです。u は入力であるため、u を明示的に可変サイズとして定義する必要はありません。出力 y は、u から提供されるサイズに応じて要素数が変わるため、可変サイズ ベクトルとして宣言されています。y のプロパティを調べて、可変サイズになっていることを確認します。

モデルのシミュレーション

モデルをシミュレートして各 Scope ブロックで結果を確認します。Filter は実行されるたびに異なる数の信号値を出力します。

Scope_filter.png

Average は実行されるたびに異なる数の信号値を出力します。ブロックから返される一意の値の数はほぼ半分になります。

Scope_average.png

参考

関連するトピック