配列
多次元配列
前回は配列のデータがメモリ上にどう配置されるのかを説明しました。その際に扱っていたのは一次元配列と呼ばれるもの
でデータが1列に並んだものでした。
配列には他にも多次元配列というものがあり、配列の1要素の中にさらに配列が入っているというような感じです。
その中で今回は2次元配列に関して取り上げようと思います。
2次元配列の宣言
2次元配列を使用するときにはどのように宣言するかというと基本的には一次元配列と同じです。
例えば以下のように宣言します。
データ型 識別名[要素数][要素数]
上記の図のイメージでは表のようになっていますが、メモリ上での配置は連続して格納される形となっています。
用意した2次元配列の初期化ですが、配列の中に配列が入っているだけなのでルールは一次元配列と同じです。
例えば宣言と同時に初期化する場合、以下のように行います。
要素数2の配列の各要素に要素数3の配列が入っている場合は以下のように宣言し初期化を行います。
int num[2] [3] = { {1, 2, 3}, {4, 5, 6} };
以下のように要素数を省略した場合は、0で初期化されます。
num[1] [1]とnum[1] [2]は0が格納される形となります。
int num[2] [3] = { {1, 2, 3}, {4,} };
2次元配列の使用
では実際に使用してみましょう。
ちょっと一般的ではないかもしれませんが、行列の計算をしてみます。
ここでは2行2列の行列の積を計算してみます。
行列の積を計算する場合、左側の行列の行と右側の行列の列を組み合わせて計算していきます。
まず左側行列の1行目の値と右側行列の1列目の値を順番にかけていき、それを足し算したものが答えの
1行目1列目の値となります。
次に左側行列の1行目の値と右側行列の2列目の値を順番にかけていき、それを足し算したものが答えの
1行目2列目の値となります。
左側行列の2行目の値と右側行列の1列目の値を順番にかけていき、それを足し算したものが答えの
2行目1列目の値となります。
次に左側行列の2行目の値と右側行列の2列目の値を順番にかけていき、それを足し算したものが答えの
2行目2列目の値となります。
まとめると以下のようになります。
コードで確認
次の行列の積を出してみたいと思います。
#include <stdio.h> int main(void){ int i,j,k; //計算する配列 int det1[2] [2] = { { 1, 2}, { 3, 4} }; int det2[2] [2] = { { 1, 2}, { 3, 4} }; //答えを格納する配列 int ans[2] [2] = { 0 }; for(i = 0; i < 2; i++){ for( j = 0; j < 2; j++){ for( k = 0; k < 2; k++){ ans[i] [j] += det1[i] [k] * det2[k] [j]; } } } for( i = 0; i < 3; i++){ for( j = 0; j < 3; j++){ printf( " %d ",ans[i][j]); } printf( "n"); } return(0); }
2行2列の行列を表すために2次元配列を作成しています。
その配列に格納されているデータを先ほどの式に従って計算していきます。
添え字の「i」が答えとなる行列の列を表しています。また計算する行列の列も表しています。
「j」は答えとなる行列の行を表しています。また計算する行列の行も表しています。
「k」は積を求める配列のどの位置を計算するのかを表しています。
~~~~実行結果~~~~
7 10
15 22
~~~~~~~~
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載