2019年3月30日土曜日

大きい配列をファイルから読み込む

1000×1000の配列の逆行列を求めたい.逆行列の演算自体はOpenCVを使って .inv(cv::DECOMP_SVD) の1語で済む.しかし,配列の要素をファイルから読んでくるのが面倒だった.ファイルは1行に1000個の数字がカンマ区切りで1000行書いてあるcsvファイルだ.

split(",")みたいな関数を書くのが面倒だったので,エディタでカンマを" "(空白1個)に変換した.そして,次のプログラムに食わせる.mは要素が100万個の一次元配列になる.行列は2次元だが,OpenCVでMatに行列を入力するのは一次元の方が便利だからこうなった.

int main()
{
    int i;
    double *m;
    FILE *fp;

    m = (double *)malloc(1000*1000*sizeof(double));
    fp = fopen("M.txt", "r");

    for(i=0; i<1000*1000; i++) {
        if(fscanf(fp, "%lf", &(m[i])) != 1) break;
    }

    fclose(fp);
    free(m);
}

gccのバージョンは4.1.2と古い.配列mをmallocではなく普通に宣言するとたぶんスタック領域が足りなくなる.もとのファイルにきっちり1000×1000のデータが書いてないと実行時にセグメンテーションエラーになる.それを回避するためにはいろいろ書き加えないといけないので面倒.面倒を避けるため,ファイルにきっちりデータを書き込む方を選んだ.

逆行列を計算した後は結果をファイルに書き出したいが,Matをテキストファイルとして書き出す方法はこのサイトに書かれていた内容をそのまま使った.

0 件のコメント:

コメントを投稿