メインコンテンツ

空配列

MATLAB® の空配列は、要素のない配列です。空配列は、プログラムで "何もしない" という概念を表す場合に役立ちます。空配列には特定の次元があり、そのうち少なくとも 1 つの次元は 0 です。最も単純な空配列は 0 行 0 列ですが、空配列には 0 行 5 列や 3×0×5 など、非ゼロの次元が含まれる場合もあります。

空配列の作成

0 行 0 列の配列を作成するには、値を指定せずに大かっこを使用します。size関数を使用して配列の次元を確認します。

A = []
A =

     []
size(A)
ans = 1×2

     0     0

空配列を作成する必要があるほとんどの場合において、0 行 0 列の配列で十分です。ただし、zerosonesなどの関数を使用して、異なるサイズの空配列を作成できます。たとえば、0 行 5 列の行列と 3×0×5 の配列を作成します。

B = zeros(0,5)
B =

  0×5 empty double matrix
C = ones(3,0,5)
C =

  3×0×5 empty double array

大かっこ、zeros、および ones では、既定の double データ型の空の数値配列が作成されます。テキストをデータとして処理する空配列を作成するには、strings関数を使用します。この関数では、文字を含まない任意の指定サイズの string 配列が作成されます。たとえば、0 行 5 列の空の string 配列を作成します。

S = strings(0,5)
S = 

  0×5 empty string array

任意のデータ型の空配列を作成するには、createArrayを使用できます ("R2024a 以降")。たとえば、8 ビット符号付き整数型 int8 の 5 行 0 列の行列を作成します。

D = createArray(5,0,"int8")
D =

  5×0 empty int8 matrix

演算からの空の結果

一部の演算では空配列が返される場合があります。これらの空配列は、特別なケース処理を必要とせずにアルゴリズムで処理できるため、役立ちます。

たとえば、find 関数を使用して、行ベクトルの 0 未満のすべての要素を求めます。ベクトルのすべての要素が 0 より大きい場合、指定された条件を満たす要素がないため、find はインデックスの空の行ベクトルを返します。

A = [1 2 3 4];
ind = find(A < 0)
ind =

  1×0 empty double row vector

空の行ベクトルでインデックスを付けても、空の行ベクトルが返されます。

B = A(ind)
B =

  1×0 empty double row vector

空の結果は行列または多次元配列になることもあります。たとえば、次のコードは、行列 A から部分行列 B を抽出します。ここで、B には A の非ゼロのすべての行が含まれます。

A = zeros(5,3);
dim = 2;
B = A(any(A,dim),:)
B =

  0×3 empty double matrix

任意の行列 A について、B のサイズは pq 列です。ここで、pA の行のうち非ゼロの値をもつ行の数であり、qA の列の数です。A 内の行に非ゼロの値がない場合、B はサイズが 0 行 q 列の空配列になります。B は空配列になることができるため、空の場合に特別な処理を行うことなく、A 内の非ゼロの行の数を求めることができます。

n_nonzero_rows = size(B,1)
n_nonzero_rows = 
0

空の結果かどうかを明示的にチェックする場合は、isempty 関数を使用します。

if isempty(B)
   disp("All rows of A contain all zeros.")
else
   disp("There are " + size(B,1) + " rows in A with nonzero values.")
end
All rows of A contain all zeros.

空配列での演算

通常の行列および配列に対して定義されているすべての演算は、空配列にも拡張されます。演算には、m または n がゼロの場合でも、mn 列の配列が含まれる場合があります。このような演算の結果のサイズは、空でない配列を処理するときに生成される結果のサイズと一致します。

互換性のあるサイズをもつ配列は、"要素単位" の演算の実行中に自動的に同じサイズに拡張されます。詳細については、基本的な演算で互換性のある配列サイズを参照してください。

たとえば、プラス演算子 (+) は要素単位の演算子です。b がスカラーの場合、A が空であっても、A + b では A と同じサイズの出力が生成されます。

A = zeros(1,0,2)
A =

  1×0×2 empty double array
C = A + 5
C =

  1×0×2 empty double array

同様に、一方の入力が空行列 A で、もう一方が A と同じ行数の列ベクトル B である場合、A + B では A と同じサイズの出力が生成されます。

A = zeros(4,0)
A =

  4×0 empty double matrix
B = ones(4,1)
B = 4×1

     1
     1
     1
     1

C = A + B
C =

  4×0 empty double matrix

ただし、prod 関数や sum 関数などの一部の関数は "ベクトル単位" で動作します。これらの関数では、ベクトルの入力に対してスカラーの出力が生成され、行列の入力に対してベクトルの出力が生成されます。これらの関数は、入力に空配列が含まれている場合、数学の規則に従います。

空でない入力行列の場合、prod 関数は入力行列の各列ベクトルに対してベクトル単位の演算を行います。空の入力配列の場合、0 個の因子を乗算した結果として空積になるため、prod 関数は 1 を返します。数学の規則により、この積の結果は乗法単位元と等しくなります。たとえば、空でない行列と空行列の各列の要素の積を求めます。

C = prod([1 2 3; 2 3 4; 3 4 5])
C = 1×3

     6    24    60

C = prod([])
C = 
1
C = prod(zeros(0,3))
C = 1×3

     1     1     1

空配列の連結

データに特定の初期値がない場合、データを保存および整理するときに空配列を使用できます。空配列を空でない配列と連結することで、空配列を動的に拡張できます。

空配列を空でない配列と連結すると、MATLAB では空の配列が省略され、出力でその次元が無視されます。たとえば、data という名前の空配列を作成し、それをループで展開します。

data = [];
for k = 1:3
    data = [data rand(1,2)]
end
data = 1×2

    0.8147    0.9058

data = 1×4

    0.8147    0.9058    0.1270    0.9134

data = 1×6

    0.8147    0.9058    0.1270    0.9134    0.6324    0.0975

最初のループ反復では、サイズが 0 行 0 列の空配列がサイズが 1 行 2 列の空でない配列と連結され、サイズが 1 行 2 列の出力が生成されます。反復ごとに配列に新しいデータが追加されます。

互換性のあるサイズをもつ 2 つの空配列を連結すると、結果は、入力が空でない場合と同様に、出力サイズと等しいサイズの空配列になります。たとえば、サイズが 0 行 5 列の空配列を作成します。これらの配列 2 つを水平方向および垂直方向に連結して、他の配列を作成します。結果は、それぞれ 0 行 10 列と 0 行 5 列の空配列になります。

A = zeros(0,5);
B_horizontal = [A A]
B_horizontal =

  0×10 empty double matrix
B_vertical = [A; A]
B_vertical =

  0×5 empty double matrix

プレースホルダー入力引数としての空配列

一部の MATLAB 関数では、プレースホルダー入力引数として空配列が受け入れられます。

たとえば、max 関数は配列の最大の要素を求めます。A が行列の場合、max(A) を使用して A の各列の最大値を求めることができます。

A = [1 7 3;
     6 2 9];
m = max(A)
m = 1×3

     6     7     9

max 関数に空でない 2 つ目の入力を指定すると、2 つの入力の最大の要素が返されます。

B = [5 5 5;
     8 8 8];
M = max(A,B)
M = 2×3

     5     7     5
     8     8     9

A のすべての要素の最大値を求めるには、max の 2 つ目の引数として空配列を渡し、"all" を指定します。

m = max(A,[],"all")
m = 
9

大かっこを使用した行または列の削除

既存の行列から行または列を削除するための構文でも、大かっこが使用されます。

たとえば、行列から 3 番目の列を削除します。

A = magic(3)
A = 3×3

     8     1     6
     3     5     7
     4     9     2

A(:,3) = []
A = 3×2

     8     1
     3     5
     4     9

このコンテキストでは、[] はサイズが 0 行 0 列の空配列を表しません。A(:,3) = zeros(0,0) のように A(:,3) に空配列を代入すると、代入の左辺と右辺のサイズが一致しないため、コードでエラーが返されます。

参考

トピック