Stateflow でのベクトルおよび行列の演算
Simulink® モデルの Stateflow® チャートには、ベクトルおよび行列での計算に使用する構文を定義するアクション言語プロパティがあります。アクション言語プロパティは次のとおりです。
アクション言語は MATLAB®。
アクション言語は C。
詳細については、アクション言語構文としての MATLAB と C の相違点を参照してください。
インデックス表記
MATLAB をアクション言語として使用するチャートでは、かっこで区切られた 1 ベースのインデックスを使用して、ベクトルまたは行列の要素を参照します。異なる次元のインデックスはコンマで区切ります。
C をアクション言語として使用するチャートでは、大かっこで区切られた 0 ベースのインデックスを使用して、ベクトルまたは行列の要素を参照します。異なる次元のインデックスは、それぞれ大かっこで囲みます。
例 | アクション言語が 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 = 最低) に従ってまとめています。二項演算は左結合であるため、どの式でも、優先度が同じ演算子は左から右の順序で評価されます。MATLAB をアクション言語として使用するチャート内の行列の乗算演算子と除算演算子を除き、すべての二項演算子は要素単位の演算を行います。
演算 | 優先順位 | アクション言語が MATLAB | アクション言語が C の場合 |
---|---|---|---|
| 1 | 行列の乗算 | 要素単位の乗算。行列の乗算には、MATLAB 関数で |
| 1 | 要素単位の乗算 | サポートなし。演算 |
| 1 | 行列の右除算 | 要素単位の右除算。行列の右除算には、MATLAB 関数で |
| 1 | 要素単位の右除算 | サポートなし。演算 |
| 1 | 行列の左除算 | サポートなし。MATLAB 関数で |
| 1 | 要素単位の左除算 | サポートなし。MATLAB 関数で |
| 2 | 加算 | 加算 |
| 2 | 減算 | 減算 |
| 3 | 比較、等しい | 比較、等しい |
| 3 | 比較、等しくない | 比較、等しくない |
| 3 | サポートなし。演算 | 比較、等しくない |
| 3 | サポートなし。演算 | 比較、等しくない |
単項演算と単項アクション
次の表は、ベクトルと行列のオペランドに対するすべての単項演算および単項アクションの解釈をまとめています。単項演算は、
二項演算子より優先順位が高くなります。
右結合であるため、どの式でも、右から左の順序で評価されます。
要素単位の演算を行います。
例 | アクション言語が MATLAB | アクション言語が C の場合 |
---|---|---|
| 論理 NOT。ビット単位 NOT の場合は、関数 |
詳細については、ビット演算とC 言語のビット演算が可能を参照してください。 |
| サポートなし。演算 | 論理 NOT |
| 負数 | 負数 |
| サポートなし | ベクトルまたは行列のすべての要素をインクリメントします。 |
| サポートなし | ベクトルまたは行列のすべての要素をデクリメントします。 |
代入演算
次の表は、ベクトルと行列のオペランドに対する代入演算の解釈をまとめています。
演算 | アクション言語が 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 関数に適用されます。関数 f
の仮引数をスカラーとして定義するとします。次の表で、関数呼び出し y = f(u)
のスカラー拡張のルールを説明します。
出力 y | 入力 u | 結果 |
---|---|---|
スカラー | スカラー | スカラー拡張は行われません。 |
スカラー | ベクトルまたは行列 | チャートはサイズ不一致エラーを生成します。 |
ベクトルまたは行列 | スカラー | チャートはスカラー拡張を使用して y[i][j] = f(u) |
ベクトルまたは行列 | ベクトルまたは行列 | チャートはスカラー拡張を使用して y[i][j] = f(u[i][j]) y と u のサイズが異なる場合、チャートはサイズ不一致エラーを生成します。 |
複数の出力をもつ関数の場合、同じ規則が適用されますが、出力と入力がすべてベクトルまたは行列である場合は例外となります。その場合、チャートはサイズ不一致エラーを生成し、スカラー拡張は行われません。
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 をアクション言語として使用するチャートでは、演算 *
、/
、および \
は、標準的な行列の乗除算を実行します。これらの演算はステートと遷移アクションで直接使用できます。