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] |
ベクトル V の i 番目の要素 | V(i) | V[i-1] |
行列 M の 4 行 5 列目の要素 | M(4,5) | M[3][4] |
行列 M の i 行 j 列目の要素 | M(i,j) | M[i-1][j-1] |
二項演算
ベクトルと行列に対する二項演算は、次の標準的な優先順位規則 (1 = 最高、3 = 最低) に従います。演算子の優先順位が同じ場合は、左から右の順に評価されます。
すべての二項演算子は要素単位の演算を実行しますが、例外が 1 つあります。アクション言語として MATLAB を使用するチャートでは、*、/、および \ 演算子は代わりに行列演算を実行します。
乗算演算と除算演算 (優先順位 1)
演算 | アクション言語が MATLAB | アクション言語が C の場合 |
|---|---|---|
| 行列の乗算 | 要素単位の乗算。行列の乗算には、MATLAB 関数で |
| 要素単位の乗算。 | サポートなし。演算 |
| 行列の右除算 | 要素単位の右除算。行列の右除算には、MATLAB 関数で |
| 要素単位の右除算。 | サポートなし。演算 |
| 行列の左除算 | サポートなし。MATLAB 関数で |
| 要素単位の左除算 | サポートなし。MATLAB 関数で |
C をアクション言語として使用するチャートでは、演算 * および / は要素単位の乗算と除算を実行します。C チャートで標準的な行列の乗算や除算を実行する場合は MATLAB 関数を使用します。
正方行列 u1 と u2 に対して以下の演算を実行するとします。
標準的な行列積
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 の場合 |
|---|---|---|
| 加算。 | 加算。 |
| 減算。 | 減算。 |
比較演算 (優先順位 3)
演算 | アクション言語が MATLAB | アクション言語が C の場合 |
|---|---|---|
| 比較、等しい。 | 比較、等しい。 |
| 比較、等しくない。 | 比較、等しくない。 |
| サポートなし。演算 | 比較、等しくない。 |
| サポートなし。演算 | 比較、等しくない。 |
単項演算と単項アクション
単項演算は単一の値に適用され、二項演算とは動作が異なります。単項演算は、
二項演算子より優先順位が高くなります。
右結合です。つまり、チャートはそれらを右から左の順に評価します。
要素単位の演算を行います。
演算 | アクション言語が MATLAB | アクション言語が C の場合 |
|---|---|---|
| 論理 NOT。ビット単位 NOT の場合は、関数 |
詳細については、ビット演算およびC 言語のビット演算が可能を参照してください。 |
| サポートなし。演算 | 論理 NOT。 |
| 負数。 | 負数。 |
| サポートなし。 | ベクトルまたは行列のすべての要素をインクリメントします。 |
| サポートなし。 | ベクトルまたは行列のすべての要素をデクリメントします。 |
代入演算
代入演算は値を変数に格納します。アクション言語として C を使用するチャートでは、算術演算を代入と結合する複合代入演算子がサポートされます。
演算 | アクション言語が MATLAB | アクション言語が C の場合 |
|---|---|---|
| シンプルな代入 | シンプルな代入 |
| サポートなし。式 |
|
| サポートなし。式 |
|
| サポートなし。式 |
|
| サポートなし。式 |
|
行列の個々の要素への値の代入
チャートのアクション言語に適したインデックス付け構文を使用することにより、ベクトルまたは行列の個々のエントリに値を代入できます。
| 例 | アクション言語が 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 の各要素がスカラー出力 |
| ベクトルまたは行列 | ベクトルまたは行列 | 要素単位の演算
|
複数の出力をもつ関数の場合、同じ規則が適用されますが、出力と入力がすべてベクトルまたは行列である場合は例外となります。その場合、チャートはサイズ不一致エラーを生成し、スカラー拡張は行われません。
固定サイズの行列のみがスカラー拡張をサポートします。
MATLAB をアクション言語として使用するチャートでは、スカラー拡張はサポートされません。