Main Content

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

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

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

出力変数

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

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

    This image shows the MATLAB Function Block Editor that opens for a new MATLAB Function block. The Function tab is selected in the Simulink Editor.

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

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

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

  5. [サイズ] プロパティで、サイズを上限として指定します。たとえば、許容できる最大サイズとして 2 行 4 列の行列を指定するには、「[2 4]」と入力します。サイズの上限がわからない場合は、上限として Inf を使用して非有界の可変サイズの配列を作成します。 (R2023b 以降)詳細については、可変サイズのカスタマイズおよびUnbounded Variable-Size Signalsを参照してください。

その他のスコープ タイプ

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

変数が入力変数または出力変数でない場合は、関数 coder.varsize を使用して変数を定義します。coder.varsize を使用した可変サイズ データの明示的な定義を参照してください。

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

この例では、可変サイズ ベクトルを使ってホワイト ノイズ信号の値を格納します。

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

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

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

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

ソース信号の検証

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

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] です。

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 は実行されるたびに異なる数の信号値を出力します。

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

参考

関連するトピック