メインコンテンツ

Stateflow でのベクトルおよび行列の演算

Simulink® モデルの Stateflow® チャートには、ベクトルおよび行列での計算に使用する構文を定義するアクション言語プロパティがあります。アクション言語プロパティは次のとおりです。

  • アクション言語は MATLAB®

  • アクション言語は C。

詳細については、アクション言語構文としての MATLAB と C の相違点を参照してください。

インデックス表記

ベクトルと行列の要素にアクセスする方法は、チャートのアクション言語に応じて異なります。

アクション言語として MATLAB を使用するチャートでは、1 ベースのインデックスと小かっこを使用します。多次元配列の場合は、1 組の小かっこ内でインデックスをコンマで区切ります (M(i,j))。

アクション言語として C を使用するチャートでは、0 ベースのインデックスと大かっこを使用します。多次元配列の場合は、各次元のインデックスをそれぞれ大かっこのペアで囲みます (M[i][j])。

アクション言語が MATLAB

アクション言語が C の場合
ベクトル V の最初の要素V(1)V[0]
ベクトル Vi 番目の要素V(i)V[i-1]
行列 M45 列目の要素M(4,5)M[3][4]
行列 Mij 列目の要素M(i,j)M[i-1][j-1]

二項演算

ベクトルと行列に対する二項演算は、次の標準的な優先順位規則 (1 = 最高、3 = 最低) に従います。演算子の優先順位が同じ場合は、左から右の順に評価されます。

すべての二項演算子は要素単位の演算を実行しますが、例外が 1 つあります。アクション言語として MATLAB を使用するチャートでは、*/、および \ 演算子は代わりに行列演算を実行します。

乗算演算と除算演算 (優先順位 1)

演算

アクション言語が MATLAB

アクション言語が C の場合

a * b

行列の乗算

要素単位の乗算。行列の乗算には、MATLAB 関数で * 演算を使用します。

a .* b

要素単位の乗算。

サポートなし。演算 a * b を使用します。

a / b

行列の右除算

要素単位の右除算。行列の右除算には、MATLAB 関数で / 演算を使用します。

a ./ b

要素単位の右除算。

サポートなし。演算 a / b を使用します。

a \ b

行列の左除算

サポートなし。MATLAB 関数で \ 演算を使用します。

a .\ b

要素単位の左除算

サポートなし。MATLAB 関数で .\ 演算を使用します。

C をアクション言語として使用するチャートでは、演算 * および / は要素単位の乗算と除算を実行します。C チャートで標準的な行列の乗算や除算を実行する場合は MATLAB 関数を使用します。

正方行列 u1u2 に対して以下の演算を実行するとします。

  • 標準的な行列積 y1 = u1 * u2 を計算する。

  • 方程式 u1 * y2 = u2 を解く。

  • 方程式 y3 * u1 = u2 を解く。

これらの計算を C チャートで完了するには、このコードを実行する MATLAB 関数を追加します。

function [y1, y2, y3] = my_matrix_ops(u1, u2)
%#codegen

y1 = u1 * u2;  % matrix multiplication
y2 = u1 \ u2;  % matrix division from the right
y3 = u1 / u2;  % matrix division from the left
関数を呼び出す前に、データ プロパティの設定の説明に従って、入力データと出力データのプロパティを指定します。

MATLAB をアクション言語として使用するチャートでは、演算 */、および \ は、標準的な行列の乗除算を実行します。これらの演算はステートと遷移アクションで直接使用できます。

加算演算と減算演算 (優先順位 2)

演算

アクション言語が MATLAB

アクション言語が C の場合

a + b

加算。

加算。

a - b

減算。

減算。

比較演算 (優先順位 3)

演算

アクション言語が MATLAB

アクション言語が C の場合

a == b

比較、等しい。

比較、等しい。

a ~= b

比較、等しくない。

比較、等しくない。

a != b

サポートなし。演算 a ~= b を使用します。

比較、等しくない。

a <> b

サポートなし。演算 a ~= b を使用します。

比較、等しくない。

単項演算と単項アクション

単項演算は単一の値に適用され、二項演算とは動作が異なります。単項演算は、

  • 二項演算子より優先順位が高くなります。

  • 右結合です。つまり、チャートはそれらを右から左の順に評価します。

  • 要素単位の演算を行います。

演算

アクション言語が MATLAB

アクション言語が C の場合

~a

論理 NOT。ビット単位 NOT の場合は、関数 bitcmp を使用します。

  • ビット単位 NOT (既定)。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティを選択します。

  • 論理 NOT。この演算を有効にするには、[C 言語のビット演算が可能] チャート プロパティをオフにします。

詳細については、ビット演算およびC 言語のビット演算が可能を参照してください。

!a

サポートなし。演算 ~a を使用します。

論理 NOT。

-a

負数。

負数。

a++

サポートなし。

ベクトルまたは行列のすべての要素をインクリメントします。a = a+1 と等価です。

a--

サポートなし。

ベクトルまたは行列のすべての要素をデクリメントします。a = a-1 と等価です。

代入演算

代入演算は値を変数に格納します。アクション言語として C を使用するチャートでは、算術演算を代入と結合する複合代入演算子がサポートされます。

演算

アクション言語が MATLAB

アクション言語が C の場合

a = b

シンプルな代入

シンプルな代入

a += b

サポートなし。式 a = a+b を使用します。

a = a+b と等価です。

a -= b

サポートなし。式 a = a-b を使用します。

a = a-b と等価です。

a *= b

サポートなし。式 a = a*b を使用します。

a = a*b と等価です。

a /= b

サポートなし。式 a = a/b を使用します。

a = a/b と等価です。

行列の個々の要素への値の代入

チャートのアクション言語に適したインデックス付け構文を使用することにより、ベクトルまたは行列の個々のエントリに値を代入できます。

アクション言語が MATLAB

アクション言語が C の場合
ベクトル V の最初の要素に値 10 を代入V(1) = 10;V[0] = 10;
行列 M の 2 行目、9 列目の要素に値 77 を代入M(2,9) = 77;M[1][8] = 77;

すべての要素への値の代入

MATLAB をアクション言語として使用するチャートでは、単一のアクションを使用してベクトルまたは行列のすべての要素を指定できます。たとえば、次のアクションは、2 行 3 列の行列 A の各要素を別の値に代入します。

A = [1 2 3; 4 5 6];

C をアクション言語として使用するチャートでは、スカラー拡張を使用して、ベクトルまたは行列のすべての要素を同じ値に設定できます。スカラー拡張は、スカラー データをベクトルや行列のデータの次元に一致するように変換します。たとえば、次のアクションは、行列 A のすべての要素を 10 に設定します。

A = 10;

スカラー値は、ベクトルや行列の次元と一致するようにスカラー拡張によって自動的に変換されます。これは、グラフィカル、真理値表、MATLAB、Simulink の各関数に適用されます。

スカラー仮引数を使用する関数 y = f(u) の場合:

出力 y入力 u結果
スカラースカラースカラー拡張なし。
スカラーベクトルまたは行列サイズ不一致エラー。
ベクトルまたは行列スカラー

y の各要素がスカラー出力 y[i][j] = f(u) を受信。

ベクトルまたは行列ベクトルまたは行列

要素単位の演算 y[i][j] = f(u[i][j])

yu のサイズが異なる場合はサイズ不一致エラーが発生。

複数の出力をもつ関数の場合、同じ規則が適用されますが、出力と入力がすべてベクトルまたは行列である場合は例外となります。その場合、チャートはサイズ不一致エラーを生成し、スカラー拡張は行われません。

固定サイズの行列のみがスカラー拡張をサポートします。

MATLAB をアクション言語として使用するチャートでは、スカラー拡張はサポートされません。

参考

トピック