- 締切済み
C言語 行列 配列
現在、C言語を勉強中です。 C言語で (10000*10000)の大きさの行列を扱いたいです。 double a[10000][10000]の配列ではメモリ不足となってしまいます。 このような場合はどのようにプログラムを組んでいったら良いのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- taka37777
- ベストアンサー率30% (166/544)
他のやり方もあると思いますが。 #include <stdio.h> main() { double **a; int i,j; a = (double **)malloc(sizeof(double *) * 10000); for(i = 0; i < 10000; i++) { a[i] = (double *)malloc(sizeof(double) * 10000); for(j= 0 ; j < 10000; j++) { a[i][j] = i*100000+j; } } for(i = 0; i < 10000; i++) { for(j= 0 ; j < 10000; j++) { printf("=%d,%d=%f\n", i,j,a[i][j]); } } }
- asuncion
- ベストアンサー率33% (2127/6290)
malloc()を使って動的に確保するのがよいと思います。 ところで、10000*10000とは、これはまたとてつもない大きさの 領域を必要としていますが、間違いなくそれだけの大きさを 必要とする場面があるのですか? 必要なときに必要な分だけの領域を確保して、 いらなくなったら開放する、というやり方がまっとうではないかと 思うのですけれど…。
- zwi
- ベストアンサー率56% (730/1282)
この配列が1個でメモリを8バイトx10000x10000で760MBほど必要ですがメモリは1.5GB以上搭載されてますか?それとこのような配列が行列演算で何個必要なのでしょうか?2~3つで3GBぐらいのメモリが必要になります。 少なくともローカル変数では確保できませんので、mallocやnewで配列を割り当てる事になると思います。後は精度次第ですがfloatにすると半分のメモリで足りますね。 まぁ、普通はこんな巨大な行列演算は計算時間を考えても行いませんが、どうしても必要なら行列の一部だけを計算して計算途中をファイルに読み書きすることで全体を求めると思います。時間は膨大に必要ですが。