- ベストアンサー
データの抜き取り、並び替え
初心者です。よろしくお願いします。 今、私は3次元のデータを2次元にするプログラムを作りたいと思っています。データは1列226,981行で並んでいて、行は for(z=0;z<61;z++){ for(y=0;y<61;y++){ for(x=0;x<61;x++){ のように並んでいます。つまり行は61*61*61=226,981行あります。 このデータから例えばx=30のときのyz平面のデータを抜き取りたいと思っています。 データ例: -5.968777e+001 → (0,0,0) -4.980782e+001 → (1,0,0) -5.336652e+001 → (2,0,0) ・ ・ ・ -5.558537e+001 → (30,0,0) →抜き取り ・ ・ -5.595443e+001 → (61,0,0) ・ -5.867385e+001 → (30,1,0) →抜き取り ・ ・ ・ ・ -4.701691e+001 → (30,0,1) →抜き取り ・ ・ のように抜き取りたいと思っています。さらにこの抜き取ったデータを下のように zの変化 →→→→→→→→→→→→→→→→→→→→→→ ↓(30,0,0)(30,0,1)(30,0,2)(30,0,3) ↓(30,1,0)(30,1,1)(30,1,2)(30,1,3) ・・・・ y↓(30,2,0)(30,2,1)(30,2,2)(30,2,3) の↓ ・ 変↓ ・ 化↓ ・ ↓ のように平面に並び替えなければなりません。使う関数や変数など初心者で、まったくわからず困っています。どうか助言やプログラミング例をいただけるとありがたいです。 下はファイルの入出力例から作った入出力プログラムです #include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> void Make_Header(char*,int,int); //ヘッダファイル書き出し関数,このまま使用 #define T 226981 main() { /*変数宣言*/ int i; long j; static double data1[1][T]; FILE *fp_i, *fp_o; /*入力*/ printf("data in start\n"); fp_i = fopen("200113-HH-100a-IFFT-RS_ap(dB).dat", "rb"); //ファイルオープン,rbはオープン形式でバイナリファイル読み込み for(j = 0; j < T; j++){ for(i = 0; i < 1; i++){ fread(&data1[i][j],sizeof(static double),1,fp_i); } } fclose(fp_i); //開いたらちゃんと閉じる /*************************************** 処理部分 ***************************************/ /*出力*/ printf("write in start\n"); fp_o = fopen("eee.x00", "wb"); //ファイルオープン,wbはオープン形式でバイナリファイル書き出し for(j = 0; j < T; j++){ for(i = 0; i < 1; i++){ fwrite(&data1[i][j],sizeof(static double),1,fp_o); } } fclose(fp_o); //開いたらちゃんと閉じる Make_Header("eee.x00",1,T); //ErgoVistaのヘッダファイル情報を出力する関数,pixel(横数)とline(縦数)を出入 return 0; } /* ヘッダ情報書きこみのサブルーチン このまま使用*/ void Make_Header(char FN[], int pixel, int line) { char hd[40]="", text[40]; FILE *fhd; strncat(hd, FN, strlen(FN)-3); strcat(hd, "hdr"); if((fhd = fopen(hd, "w")) == NULL){ printf("error : cannot open [%s] (header file)\n", FN); exit(1); } fprintf(fhd, "FILE_TYPE = IMAGE \n"); fprintf(fhd, "IMAGE_LINES = %d \n",line); fprintf(fhd, "LINE_SAMPLES = %d \nEND\n",pixel); fclose(fhd); } このプログラムの処理部分を作りたいと思っています。どうかよろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは. 相変わらず突っ込みどころが満載ですね. static double data1[1][T]; のstaticというのは「修飾子」で「static double」型の変数を宣言するわけではありません. なので sizeof(static double)などとしてはいけません. さて,「データの並べ替え」ということですが, 変な形で読み込むから後からどう並べ替えて良いのか分からなくなるのです. 始めから三次元配列にしておけば問題は無いのでは? 例えば以下のような感じにしてはどうでしょうか. ただし別の理由で動かない気もしますが. テキストデータの読み出しにfreadを使って良いのですか? void Make_Header(char*,int,int); //ヘッダファイル書き出し関数,このまま使用 #define RESL 62 #define T ((RESL)*(RESL)*(RESL)) int main(void) { /* 変数宣言 */ int x, y, z, selected_x; static double data1[RESL][RESL][RESL]; double tmp; FILE *fp_i, *fp_o; /* 選択するx */ selected_x = 30; /* 入力 */ printf("data in start\n"); if((fp_i = fopen("200113-HH-100a-IFFT-RS_ap(dB).dat", "rb")) == NULL){ printf("error : cannot open datafile\n"); exit(1); /* ファイルが開けなかったら終了 */ } /* 格納してから並び換えるのではなく並び換えながら格納する */ for(z=0;z<(RESL);z++){ for(y=0;y<(RESL);y++){ for(x=0;x<(RESL);x++){ fread(&(data1[z][y][x]),sizeof(double),1,fp_i); } } } fclose(fp_i); /* 開いたらちゃんと閉じる */ /* 出力 */ printf("write in start\n"); if((fp_o = fopen("eee.x00", "wb")) == NULL){ printf("error : cannot open output file\n"); exit(1); /* ファイルが開けなかったら終了 */ } /* z座標が先に変化するように出力 */ for(y=0;y<(RESL);y++){ for(z=0;z<(RESL);z++){ fwrite(&(data1[z][y][selected_x]),sizeof(double),1,fp_o); } } fclose(fp_o); /* 開いたらちゃんと閉じる */ Make_Header("eee.x00",1,T); //ErgoVistaのヘッダファイル情報を出力する関数,pixel(横数)とline(縦数)を出入 return 0; }
その他の回答 (1)
- arain
- ベストアンサー率27% (292/1049)
とりあえず問題となるところ >#define T 226981 > >main() >{ >/*変数宣言*/ >static double data1[1][T]; http://oshiete1.goo.ne.jp/qa4452324.html http://oshiete1.goo.ne.jp/qa4452295.html http://oshiete1.goo.ne.jp/qa4452286.html の指摘が一切生きてませんが。 関連 http://oshiete1.goo.ne.jp/qa4470014.html