データの抜き取り、並び替え
初心者です。よろしくお願いします。
今、私は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);
}
このプログラムの処理部分を作りたいと思っています。どうかよろしくお願いします。
お礼
数多くの指摘助かります。 static double data[2][T]にしてみたら少し先にすすめました。 あとのご指摘はよくわからないので、もう少し勉強してきます。