はじめに
stdio.hが使えずfopenが使えない環境下で、実行速度測定のために10000x10000の行列演算をプログラム埋め込みで行ったので、そのときのメモ
結論
matrix.csv
1,2,3,
4,5,6,
7,8,9,
上のような3x3の行列の値を示すcsvファイルがあり、Cプログラムでこの行列を2次元配列として扱いたい場合には、以下のように#include
を配列初期化部分に記述することで実現できる。
#define SIZE 3
int matrix[SIZE][SIZE] = {
#include "matrix.csv"
};
// matrixの値は{{1,2,3},{4,5,6},{7,8,9}}となる
解説
ここからは解説なので読み飛ばしてもらって構いません。
上の書き方は配列初期化時の構文と#include
の仕様により実現できている。
C言語における配列の初期化
C言語では配列の宣言時に、以下のように各要素の初期値を設定できる。
int array[3] = {1,2,3};
行列データをプログラム内で2次元配列として扱う場合、
int matrix1[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9},
};
のように行の対応をとって初期化を行うことも可能だが、以下のように単純に値を並べるような初期化を行うこともできる。
int matrix2[3][3] = {1,2,3,4,5,6,7,8,9};
#include
の仕様
#include
が記述された部分はプリプロセッサにより、指定したファイルの中身に置換されるという仕様となっている。
matrix.csv
1,2,3,
4,5,6,
7,8,9,
int matrix[3][3] = {
#include "matrix.csv"
};
そのため上のように記述した場合、プリプロセッサにより置換された結果として次のようなソースコードになる。
int matrix[3][3] = {
1,2,3,
4,5,6,
7,8,9,
};
このように記述することで、csvファイルの値を2次元配列にセットすることができる。