5.配列


5-1 配列と配列名

 ベクトルや行列,テンソルあるいは表形式のようなデータを扱う場合,配列という添字付きの変数が用いられる.これを配列変数と呼ぶこともある.配列も変数であるから,変数同様,先頭文字が英字または日本語から始まる255文字以内の文字列(数字や_が使用できる)で名前を付けることができる.ただし,VBAの予約語は使用できない.これを配列名という.
(1)1次元配列
 A君のテスト結果を以下のように,表形式に整理して考えてみる.
テスト国語算数理科社会
A 君 82 74 65 95
 このとき,テストは 4 種類であるから,配列名を A として A 君のテスト結果を以下のように記憶する.
  A(1) = 82  (国語)
  A(2) = 74  (算数)
  A(3) = 65  (理科)
  A(4) = 95  (社会)
 このように,カッコ付きの 1 とか 2 といった添字を,それぞれ,国語とか算数などに対応させれば変数名は1つですむ.すなわち
テスト国語算数理科社会
A 君A(1)A(2)A(3)A(4)
のように,各科目と変数を対応させる.
 以上のように添字が 1 つの配列を1次元配列と呼んでおり,また,A(1) とか A(2) などの個々の配列を配列要素と呼んでいる.
(2)2次元配列
 1クラスの人数分のテスト結果を記憶する配列名を B とし,添字を2つにすることを考えてみよう.初めの添字には個人名を,2番目の添字にはテストの種類を以下のように対応させる.
  B(個人名、テストの種類)
 これを表形式で表すと以下のようになる.
テスト国語算数理科社会
A 君B(1,1)B(1,2)B(1,3)B(1,4)
B 君B(2,1)B(2,2)B(2,3)B(2,4)
C 君B(3,1)B(3,2)B(3,3)B(3,4)
 このように,2つの添字を持つ配列を2次元配列と呼んでいる.通常,2次元以上の配列は計算機内部で
  B(1,1) B(2,1) B(3,1) B(1,2) B(2,2) B(3,2) B(1,3)...
のように記憶される.すなわち,左側の添字に関するデータを記憶した後,順次右側へと記憶してゆく.

5-2 配列の宣言と部分範囲指定配列

 配列は,Dim 文,(または,Static文,Private文,Public文)を使って他の変数と同じように宣言する.配列変数の宣言では,配列名と同時にサイズ (要素数) を指定する必要がある.サイズが指定されている配列は,固定長配列と呼ばれる.配列の最大次元数は60である
  (固定長配列の宣言)
Dim 配列名(要素数,要素数,…) As データ型
 配列の添字の最小値の既定値は0である.すなわち,A(2,3)と宣言すると,以下の表のように,A(0,0)から始まって,12要素からなる配列と解釈される.
A(0,0)A(0,1)A(0,2)A(0,3)
A(1,0)A(1,1)A(1,2)A(1,3)
A(2,0)A(2,1)A(2,2)A(2,3)
 この既定値を変更して1からにするためには,Option Base文を用いるか,あるいは宣言時にTo節を用いる.以下の配列の宣言例は,配列Aの添字の最小値が0,配列Bの最小値が1とした場合の例である.
  (配列の宣言例)
  Dim A(2,3) As Integer
  Dim B(1 To 2, 1 To 3) As Integer
このようにTo節では,(配列サイズの最小値To最大値)という指定の方法を用いる.このような配列を部分範囲指定配列と呼んでいる.この方法にしたがえば,最小値を1以外の他の整数にすることもできる.
 一方,配列の最大サイズは,オペレーティングシステムや利用可能なメモリ量により異なる.システムで利用可能な RAM の容量を超える配列を使用すると,ディスクとの読み書きにより処理速度が遅くなる.

プログラム例5-1:整数型の1次元配列A(3)を宣言し,配列要素1~3に値を代入したあと,その値を出力するプログラムを作成する.

プログラム例5-2:整数型の2次元配列A(2,3)を宣言し,配列要素A(1,1), A(1,2), A(2,1), A(2,2)に値を代入した後,A(1,3) = A(1,1) + A(1,2), A(2,3) = A(2,1) + A(2,2)の演算を行い,それらの値を表示するプログラムを作成する.

5-3 動的配列

 データのサイズに応じて配列の大きさを指定することができる.このような,プログラムを実行中にサイズを変更できる配列は,動的配列と呼ばれる.動的配列を宣言するには,以下の例のように,一旦Dim文などによりかっこの中のインデックス番号を省略して宣言する.続いて,配列要素数が確定した段階で,必要な分だけ配列宣言をReDimにより行う.
  (ReDimによる動的配列の宣言例)
Dim 配列名() As データ型
 ……
ReDim 配列名(配列要素数)

プログラム例5-3:データの大きさによって,配列サイズを変えるプログラムを作成する.

 配列サイズを途中で何度でも変更することも可能である.この場合はReDimを用いて再定義すればよい.ここで,配列サイズを再定義する度に,その中身はクリアされる.ただし,ReDim Preserve ステートメントを使用すると,配列の現在値を保持した状態で配列を拡張できる.
  (配列サイズの再定義)
Dim A() As Integer
……
ReDim A(10)
……
ReDim A(20)
……
 上の例は,はじめの配列サイズをA(10)で宣言し,次にA(20)で再宣言している.配列のサイズは自由に設定できる.

プログラム例5-4:配列数2と宣言した後,現在の値を保持したまま,配列サイズを4に増加させ,新たな要素にのみ値を代入するプログラムを作成する.

5-4 配列の演算

(1)一括代入
 配列では要素の値を一括代入することができる.ここでは、具体的なプログラム例を用いて説明する。

プログラム例5-5:プログラム例は配列Aの要素の値を全て配列Bの対応する要素に代入した例である.ここで,配列Bの宣言は型のみで,配列要素数は指定していないことに注意してほしい.

(2)行列の演算
 数値解析では行列演算が頻繁に現れる.こういった行列演算は基本パターンを覚えておくのが良い.ここではその一助のため,いくつかの代表的な行列演算のプログラム例を示す.

プログラム例5-6:行列の定数倍

プログラム例5-7:行列の加減

プログラム例5-8:内積

プログラム例5-9:行列の積

プログラム例5-10:行列の転置