行列の作成、連結、および拡張
最も基本的な MATLAB® データ構造は行列です。行列とは、2 次元の、行と列に配置された方形配列のデータ要素です。この要素は数値、logical 値 (true
または false
)、日付と時刻、string、categorical
値、またはその他の MATLAB データ型のいずれでも構いません。
1 つの数値でも行列として格納されます。たとえば、値 100 を含む変数は double
型の 1 行 1 列の行列として格納されます。
A = 100;
whos A
Name Size Bytes Class Attributes A 1x1 8 double
データの行列の作成
特定のデータ セットがある場合、大かっこを使用して行列に要素を配置できます。1 行のデータには要素間にスペースまたはコンマがあり、セミコロンによって行が区切られます。たとえば、4 つの数値要素の 1 行を作成します。1 つの行と 4 つの列があるため、結果の行列のサイズは 1 行 4 列です。この形状の行列はよく行ベクトルと呼ばれます。
A = [12 62 93 -8]
A = 1×4
12 62 93 -8
sz = size(A)
sz = 1×2
1 4
次に、同じ数で行列を作成しますが、2 行に配置します。この行列には 2 つの行と 2 つの列があります。
A = [12 62; 93 -8]
A = 2×2
12 62
93 -8
sz = size(A)
sz = 1×2
2 2
特殊な行列関数
MATLAB には、特定の値または特定の構造体で行列を作成できるさまざまな関数があります。たとえば、関数 zeros
と関数 ones
はすべてが 0 の行列またはすべてが 1 の行列を作成します。これらの関数の 1 番目と 2 番目の引数はそれぞれ、行列の行数と列数です。
A = zeros(3,2)
A = 3×2
0 0
0 0
0 0
B = ones(2,4)
B = 2×4
1 1 1 1
1 1 1 1
関数 diag
は、行列の対角要素に入力要素を配置します。たとえば、4 つの要素を含む行ベクトル A
を作成します。次に、対角要素が A
の要素である 4 行 4 列の行列を作成します。
A = [12 62 93 -8]; B = diag(A)
B = 4×4
12 0 0 0
0 62 0 0
0 0 93 0
0 0 0 -8
行列の連結
大かっこを使用して既存の行列を追加することもできます。この行列の作成方法は、"連結" と呼ばれます。たとえば、2 つの行ベクトルを連結して、さらに長い行ベクトルを作成します。
A = ones(1,4); B = zeros(1,4); C = [A B]
C = 1×8
1 1 1 1 0 0 0 0
A
と B
を行列の 2 行として配置するには、セミコロンを使用します。
D = [A; B]
D = 2×4
1 1 1 1
0 0 0 0
いくつかの行列を連結するには、これらのサイズに互換性がなければなりません。言い換えれば、行列を水平に連結する場合、それらは同じ行数でなければなりません。垂直に連結する場合、それらは同じ列数でなければなりません。
たとえば、どちらも 2 行を持つ 2 つの行列を作成します。大かっこを使用して、2 番目の行列を最初の行列に水平方向に追加します。
A = ones(2,3)
A = 2×3
1 1 1
1 1 1
B = zeros(2,2)
B = 2×2
0 0
0 0
C = [A B]
C = 2×5
1 1 1 0 0
1 1 1 0 0
互換性のある行列を連結する代替方法として、連結関数vertcat
、cat
、およびhorzcat
を使用します。horzcat
を使用して、2 番目の行列を最初の行列に水平に追加します。
D = horzcat(A,B)
D = 2×5
1 1 1 0 0
1 1 1 0 0
数列の生成
colon
は、要素が連続している等間隔の行列を作成する場合に便利な方法です。たとえば、要素が 1 から 10 の整数である行ベクトルを作成します。
A = 1:10
A = 1×10
1 2 3 4 5 6 7 8 9 10
コロン演算子を使用して、任意の範囲内で 1 ずつインクリメントする数字のシーケンスを作成できます。
A = -2.5:2.5
A = 1×6
-2.5000 -1.5000 -0.5000 0.5000 1.5000 2.5000
このシーケンスのインクリメントの値を変更するには、範囲の開始値と終了値の間のインクリメント値をコロンで区切って指定します。
A = 0:2:10
A = 1×6
0 2 4 6 8 10
デクリメントするには、負の数値を使用します。
A = 6:-1:0
A = 1×7
6 5 4 3 2 1 0
整数値以外を使用してインクリメントさせることもできます。インクリメント値が指定した範囲を等間隔に分割しない場合、MATLAB は範囲を超える前に到達可能な最後の値で自動的にシーケンスを終了します。
A = 1:0.2:2.1
A = 1×6
1.0000 1.2000 1.4000 1.6000 1.8000 2.0000
行列の拡張
1 つ以上の要素を行列に追加するには、既存の行と列のインデックス境界の外に配置して実行できます。MATLAB は、行列を四角形に保つために、自動的にゼロをパディングします。たとえば、2 行 3 列の行列を作成して、要素を (3,4) の位置に挿入することで追加の行と列を加えます。
A = [10 20 30; 60 70 80]
A = 2×3
10 20 30
60 70 80
A(3,4) = 1
A = 3×4
10 20 30 0
60 70 80 0
0 0 0 1
新しい行列を既存のインデックス範囲外に挿入すると、サイズを拡張することもできます。
A(4:5,5:6) = [2 3; 4 5]
A = 5×6
10 20 30 0 0 0
60 70 80 0 0 0
0 0 0 1 0 0
0 0 0 0 2 3
0 0 0 0 4 5
for
ループ内などで行列のサイズが繰り返し拡張するため、作成予定の最大の行列に事前にスペースを割り当てることがベスト プラクティスです。事前に割り当てないと、サイズが大きくなるたびに MATLAB がメモリを割り当てなければならないため、操作が低速化します。たとえば、要素を 0 に初期化して、10,000 行と 10,000 列を保持する行列を事前に割り当てます。
A = zeros(10000,10000);
後で追加の要素を事前に割り当てなければならない場合、行列インデックスの範囲外に割り当てて拡張するか、事前に割り当てた別の行列を A
に連結できます。
空配列
MATLAB の空配列は、少なくとも 1 つの次元の長さが 0 に等しい配列です。空配列は、プログラムで "何もしない" という概念を表す場合に役立ちます。たとえば、ベクトルの 0 未満の要素をすべて見つけたいが、何もないとします。関数find
はインデックスの空のベクトルを返し、0 未満の要素が見つからなかったことを示します。
A = [1 2 3 4]; ind = find(A<0)
ind = 1x0 empty double row vector
多くのアルゴリズムには空配列を返すことができる関数呼び出しが含まれます。多くの場合、特殊なケースとして処理するのではなく、空配列がこれらのアルゴリズムを関数の引数として通過できるようにすると便利です。空配列の処理をカスタマイズしなければならない場合は、関数 isempty
を使用してチェックできます。
TF = isempty(ind)
TF = logical
1