Main Content

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

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

  • アクション言語は MATLAB®

  • アクション言語は C。

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

インデックス表記

MATLAB をアクション言語として使用するチャートでは、かっこで区切られた 1 ベースのインデックスを使用して、ベクトルまたは行列の要素を参照します。異なる次元のインデックスはコンマで区切ります。

C をアクション言語として使用するチャートでは、大かっこで区切られた 0 ベースのインデックスを使用して、ベクトルまたは行列の要素を参照します。異なる次元のインデックスは、それぞれ大かっこで囲みます。

アクション言語が 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 = 最低) に従ってまとめています。二項演算は左結合であるため、どの式でも、優先度が同じ演算子は左から右の順序で評価されます。MATLAB をアクション言語として使用するチャート内の行列の乗算演算子と除算演算子を除き、すべての二項演算子は要素単位の演算を行います。

演算

優先順位

アクション言語が MATLAB

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

a * b

1

行列の乗算

要素単位の乗算。行列の乗算には、MATLAB 関数で * 演算を使用します。MATLAB 関数を使用した行列の算術演算を参照してください。

a .* b

1

要素単位の乗算。

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

a / b

1

行列の右除算

要素単位の右除算。行列の右除算には、MATLAB 関数で / 演算を使用します。MATLAB 関数を使用した行列の算術演算を参照してください。

a ./ b

1

要素単位の右除算。

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

a \ b

1

行列の左除算

サポートなし。MATLAB 関数で \ 演算を使用します。MATLAB 関数を使用した行列の算術演算を参照してください。

a .\ b

1

要素単位の左除算

サポートなし。MATLAB 関数で .\ 演算を使用します。MATLAB 関数を使用した行列の算術演算を参照してください。

a + b

2

加算。

加算。

a - b

2

減算。

減算。

a == b

3

比較、等しい。

比較、等しい。

a ~= b

3

比較、等しくない。

比較、等しくない。

a != b

3

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

比較、等しくない。

a <> b

3

サポートなし。演算 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 と等価です。

代入演算

次の表は、ベクトルと行列のオペランドに対する代入演算の解釈をまとめています。

演算

アクション言語が 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 関数に適用されます。関数 f の仮引数をスカラーとして定義するとします。次の表で、関数呼び出し y = f(u) のスカラー拡張のルールを説明します。

出力 y入力 u結果
スカラースカラースカラー拡張は行われません。
スカラーベクトルまたは行列チャートはサイズ不一致エラーを生成します。
ベクトルまたは行列スカラー

チャートはスカラー拡張を使用して f(u) のスカラーの出力値を y のすべての要素に代入します。

y[i][j] = f(u)

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

チャートはスカラー拡張を使用して u の各要素の出力値を計算し、y の対応する要素に代入します。

y[i][j] = f(u[i][j])
yu のサイズが異なる場合、チャートはサイズ不一致エラーを生成します。

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

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

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

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

関連するトピック