MATLAB コードの Stateflow フロー チャートへの変換
MATLAB® コードを Stateflow® フロー チャートとグラフィカル関数に変換するには、パターン ウィザードを使用します。変換でサポートされるパターンには次が含まれます。
if
、if-else
およびその他の入れ子形式の判定ステートメント。for
ループとwhile
ループ。switch
ステートメント。
パターン ウィザードでは MATLAB 関数とスクリプトを変換できます。
MATLAB 関数は Stateflow グラフィカル関数に変換されます。
MATLAB スクリプトは Stateflow フロー チャートに変換されます。
スタンドアロンの Stateflow チャートでのみ、MATLAB コードの変換がサポートされます。詳細については、MATLAB オブジェクトとして実行する Stateflow チャートの作成を参照してください。
MATLAB スクリプトからのフロー チャートの作成
次の MATLAB スクリプトはコラッツ予想の 1 インスタンスを経験的に検証します。数値入力 u
が指定されると、スクリプトは次の規則を反復してヘイルストーン数列 n0 = u
, n1, n2, n3, ⋯ を計算します。
ni が偶数の場合は、ni+1 = ni/2
ni が奇数の場合は、ni+1 = 3ni + 1
コラッツ予想では、すべての正の整数は、最終的に 1 に到達するヘイルストーン数列をもつことが主張されています。
% Hailstone sequence u, c(u), c(c(u)),... y = u; while y(end) ~= 1 y(end+1) = c(y(end)); end disp(y); function n = c(n) % Compute next number in hailstone sequence. % If n is even, then c(n) = n/2. % If n is odd, then c(n) = 3*n+1. if rem(n,2) == 0 n = n/2; else n = 3*n+1; end end
c
を繰り返し呼び出す while
ループを実行します。関数 c
は、出力が入力のパリティに依存する、条件付きの if
-else
ステートメントで構成されます。このスクリプトをフロー チャートとグラフィカル関数に変換するには、次を行います。
新しいスタンドアロン チャートを開きます。
edit hailstone.sfx
[ステート チャート] タブで [パターン]、[ファイルの選択] を選択します。
ダイアログ ボックスで、MATLAB スクリプトを選択して [開く] をクリックします。パターン ウィザードによって Stateflow チャートにフロー チャートとグラフィカル関数が追加されます。グラフィカル関数をダブルクリックして、その内容を表示します。
[シンボル] ペインで [未定義のシンボルを解決]
をクリックします。Stateflow エディターによって
u
とy
がローカル データとして解決されます。チャートを保存します。
チャートを Stateflow エディターから実行するには、[シンボル] ペインに
u
= 9 の値を入力して [実行]をクリックします。フロー チャートの実行中、Stateflow エディターではチャート アニメーションによってアクティブな遷移が強調表示されます。実行が停止すると、MATLAB コマンド ウィンドウに 9 の値から始まるヘイルストーン数列が表示されます。
9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
[停止]
をクリックします。
生成されたフロー チャートとグラフィカル関数をコピーして、Simulink® モデル内の Stateflow チャートを含む他のチャートに貼り付けることができます。MATLAB コードで Simulink のコード生成が制限される機能が使用されている場合、チャートのシミュレーションを行う前にフロー チャートのアクションを変更しなければなりません。詳細については、Stateflow チャートでの外部 MATLAB 関数の呼び出しを参照してください。
メモ
チャート内のグラフィカル関数に変換する MATLAB 関数で nargin
が使用されているとします。nargin
はチャート オブジェクトをグラフィカル関数の入力引数の 1 つとしてカウントするため、グラフィカル関数の nargin
の値は、元の MATLAB 関数での nargin
の値に 1 を加えたものと等しくなります。詳細については、スタンドアロンのチャートの実行を参照してください。