MATLAB:多次元配列と特殊配列をマスターする
MATLABでは、すべてのデータ型の変数が多次元配列として扱われます。ベクトルは1次元配列、行列は2次元配列です。
ベクトルと行列については既に説明しました。この章では多次元配列について説明しますが、その前にいくつかの特殊な配列タイプについて見ていきましょう。
MATLABの特殊配列
このセクションでは、特殊な配列を作成する関数について説明します。これらの関数では、引数を1つ指定すると正方配列、2つ指定すると長方形配列が作成されます。
zeros()関数は、すべての要素が0の配列を作成します。
例:
ライブデモzeros(5)
MATLABは上記のステートメントを実行し、以下の結果を返します。
ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ones()関数は、すべての要素が1の配列を作成します。
例:
ライブデモones(4,3)
MATLABは上記のステートメントを実行し、以下の結果を返します。
ans = 1 1 1 1 1 1 1 1 1 1 1 1
eye()関数は、単位行列を作成します。
例:
ライブデモeye(4)
MATLABは上記のステートメントを実行し、以下の結果を返します。
ans = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1
rand()関数は、(0,1)の範囲で一様分布する乱数の配列を作成します。
例:
ライブデモrand(3, 5)
MATLABは上記のステートメントを実行し、以下の結果を返します。
ans = 0.8147 0.9134 0.2785 0.9649 0.9572 0.9058 0.6324 0.5469 0.1576 0.4854 0.1270 0.0975 0.9575 0.9706 0.8003
魔方陣
魔方陣とは、行方向、列方向、対角線方向に要素を加算したときに同じ合計になる正方行列です。
magic()関数は魔方陣配列を作成します。引数は正方行列のサイズを指定するスカラで、3以上でなければなりません。
ライブデモmagic(4)
MATLABは上記のステートメントを実行し、以下の結果を返します。
ans = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1
多次元配列
2つ以上の次元を持つ配列をMATLABでは多次元配列と呼びます。MATLABの多次元配列は、通常の2次元行列の拡張です。
一般的に多次元配列を生成するには、まず2次元配列を作成し、それを拡張します。
例えば、2次元配列aを作成してみましょう。
ライブデモa = [7 9 5; 6 1 9; 4 3 2]
MATLABは上記のステートメントを実行し、以下の結果を返します。
a = 7 9 5 6 1 9 4 3 2
配列aは3行3列の配列です。これに第3次元を追加するには、以下のように値を指定します。
ライブデモa(:, :, 2)= [ 1 2 3; 4 5 6; 7 8 9]
MATLABは上記のステートメントを実行し、以下の結果を返します。
a = ans(:,:,1) = 0 0 0 0 0 0 0 0 0 ans(:,:,2) = 1 2 3 4 5 6 7 8 9
ones()、zeros()、rand()関数を使って多次元配列を作成することもできます。
例:
ライブデモb = rand(4,3,2)
MATLABは上記のステートメントを実行し、以下の結果を返します。
b(:,:,1) = 0.0344 0.7952 0.6463 0.4387 0.1869 0.7094 0.3816 0.4898 0.7547 0.7655 0.4456 0.2760 b(:,:,2) = 0.6797 0.4984 0.2238 0.6551 0.9597 0.7513 0.1626 0.3404 0.2551 0.1190 0.5853 0.5060
cat()関数を使って多次元配列を構築することもできます。この関数は、指定された次元に沿って配列のリストを連結します。
cat()関数の構文は以下の通りです。
B = cat(dim, A1, A2...)
ここで、
Bは作成される新しい配列
A1、A2、...は連結される配列
dimは配列を連結する次元
例
スクリプトファイルを作成し、以下のコードを入力します。
ライブデモa = [9 8 7; 6 5 4; 3 2 1]; b = [1 2 3; 4 5 6; 7 8 9]; c = cat(3, a, b, [ 2 3 1; 4 7 8; 3 9 0])
ファイルを実行すると、以下が表示されます。
c(:,:,1) = 9 8 7 6 5 4 3 2 1 c(:,:,2) = 1 2 3 4 5 6 7 8 9 c(:,:,3) = 2 3 1 4 7 8 3 9 0
配列関数
MATLABには、配列の内容をソート、回転、順列変更、形状変更、シフトするための以下の関数が用意されています。
| 関数 | 目的 |
|---|---|
| length | ベクトルの長さまたは最大の配列次元 |
| ndims | 配列の次元数 |
| numel | 配列要素の数 |
| size | 配列の次元 |
| iscolumn | 入力が列ベクトルかどうかを判定 |
| isempty | 配列が空かどうかを判定 |
| ismatrix | 入力が行列かどうかを判定 |
| isrow | 入力が行ベクトルかどうかを判定 |
| isscalar | 入力がスカラかどうかを判定 |
| isvector | 入力がベクトルかどうかを判定 |
| blkdiag | 入力引数からブロック対角行列を構築 |
| circshift | 配列を循環シフト |
| ctranspose | 複素共役転置 |
| diag | 対角行列と行列の対角要素 |
| flipdim | 指定された次元に沿って配列を反転 |
| fliplr | 行列を左右反転 |
| flipud | 行列を上下反転 |
| ipermute | N次元配列の次元順序変更の逆操作 |
| permute | N次元配列の次元を並べ替え |
| repmat | 配列を複製してタイル状に配置 |
| reshape | 配列の形状を変更 |
| rot90 | 行列を90度回転 |
| shiftdim | 次元をシフト |
| issorted | 集合の要素がソート順かどうかを判定 |
| sort | 配列要素を昇順または降順でソート |
| sortrows | 行を昇順でソート |
| squeeze | シングルトン次元を削除 |
| transpose | 転置 |
| vectorize | 式をベクトル化 |
例
以下の例は、上記の関数のいくつかを示しています。
長さ、次元数、要素数
スクリプトファイルを作成し、以下のコードを入力します。
ライブデモx = [7.1, 3.4, 7.2, 28/4, 3.6, 17, 9.4, 8.9]; length(x) % ベクトルxの長さ y = rand(3, 4, 5, 2); ndims(y) % 配列yの次元数 s = ['Zara', 'Nuha', 'Shamim', 'Riz', 'Shadab']; numel(s) % sの要素数
ファイルを実行すると、以下の結果が表示されます。
ans = 8 ans = 4 ans = 23
配列要素の循環シフト
スクリプトファイルを作成し、以下のコードを入力します。
ライブデモa = [1 2 3; 4 5 6; 7 8 9] % 元の配列a b = circshift(a,1) % 第1次元の値を1つ下に循環シフト c = circshift(a,[1 -1]) % 第1次元の値を1つ下に % かつ第2次元の値を1つ左に循環シフト
ファイルを実行すると、以下の結果が表示されます。
a = 1 2 3 4 5 6 7 8 9 b = 7 8 9 1 2 3 4 5 6 c = 8 9 7 2 3 1 5 6 4
配列のソート
スクリプトファイルを作成し、以下のコードを入力します。
ライブデモv = [ 23 45 12 9 5 0 19 17] % 水平ベクトル sort(v) % vをソート m = [2 6 4; 5 3 9; 2 0 1] % 2次元配列 sort(m, 1) % mを行方向にソート sort(m, 2) % mを列方向にソート
ファイルを実行すると、以下の結果が表示されます。
v = 23 45 12 9 5 0 19 17 ans = 0 5 9 12 17 19 23 45 m = 2 6 4 5 3 9 2 0 1 ans = 2 0 1 2 3 4 5 6 9 ans = 2 4 6 3 5 9 0 1 2
セル配列
セル配列は、インデックス付きのセルの配列で、各セルに異なる次元とデータ型の配列を格納できます。
cell関数はセル配列の作成に使用します。cell関数の構文は以下の通りです。
C = cell(dim) C = cell(dim1,...,dimN) D = cell(obj)
パラメータ
Cはセル配列
dimはセル配列Cの次元を指定するスカラ整数または整数ベクトル
dim1, ... , dimNはCの次元を指定するスカラ整数
objは以下のいずれか
- Java配列またはオブジェクト
- .NETのSystem.StringまたはSystem.Object型の配列
例
スクリプトファイルを作成し、以下のコードを入力します。
ライブデモ c = cell(2, 5); c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}
ファイルを実行すると、以下の結果が表示されます。
c = { [1,1] = Red [2,1] = 1 [1,2] = Blue [2,2] = 2 [1,3] = Green [2,3] = 3 [1,4] = Yellow [2,4] = 4 [1,5] = White [2,5] = 5 }
セル配列のデータへのアクセス
セル配列の要素を参照するには2つの方法があります。
- インデックスを丸括弧()で囲んで、セルの集合を参照
- インデックスを波括弧{}で囲んで、個々のセル内のデータを参照
インデックスを丸括弧で囲むと、セルの集合を参照します。
滑らかな括弧でのセル配列インデックスは、セルの集合を参照します。
例:
ライブデモ c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}; c(1:2,1:2)
MATLABは上記のステートメントを実行し、以下の結果を返します。
ans = { [1,1] = Red [2,1] = 1 [1,2] = Blue [2,2] = 2 }
波括弧によるインデックスでセルの内容にアクセスすることもできます。
例:
ライブデモ c = {'Red', 'Blue', 'Green', 'Yellow', 'White'; 1 2 3 4 5}; c{1, 2:4}
MATLABは上記のステートメントを実行し、以下の結果を返します。
ans = Blue ans = Green ans = Yellow
MATLAB