- 締切済み
関数の定義
5x5x10の三次元データのファイルがあるのですが、 int matrix[5*5*10]; for(int i=0;i<5*5*10; i++){ fin >> matrix[i]; と読み込む事は出来きました。次に、 たとえば、f(x,y,z)と定義してf(3,3,6)番目の数字は~である。 のように書きたいのですが、どのようにしたらよいのでしょうか? プログラムの初心者なので、書き方が思いつきません。 どなたか教えて頂けないでしょうか?
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- goosyu
- ベストアンサー率58% (36/62)
前回の回答(#2)に誤字があり,回答も中途半端だったのでを訂正します。 // f[z][y][x]と同じ動作をする関数 int f(int x, int y, int z) { // matrix[z][y][x];と同等 return matrix[z*5*10+y*5+x]; } 【説明】 f(3,3,6);がコールされた場合, matrix[6*5*10+3*5+3]となりmatrix[318]が戻り値として返されます。また,f(4,3,6)の場合,matrix[319]とf(3,3,6)の隣の値を返すことがわかります。 *5*10とか*5は重み付けという作業で一次元配列のインデックスが重ならないようにしています。 例えば0から99までの配列を10x10の2次元配列に配置した場合,(x,y)のインデックスを求める式はx+10*yとなります。この10は重みはxの要素数10からきています。
- asuncion
- ベストアンサー率33% (2127/6289)
>例えば、matrix[x][y][z]のような感じでしょうか? そうです。 そうしておけば、 >f(3,3,6)番目の数字は~である。 これは、matrix[3][3][6]でアクセスできます。 関数の引数の並びと配列の添字が完全に一致して、わかりやすいと思います。
- goosyu
- ベストアンサー率58% (36/62)
こんな感じで関数を作るかreturn部分を参考に組み込むしかないです。 int f(int x, int y, int x) { return matrix[x*5*10+y*10+z]; }
お礼
ありがとうございます。さっそく試してみたいと思います。
- asuncion
- ベストアンサー率33% (2127/6289)
三次元のデータを >f(x,y,z)と定義してf(3,3,6)番目の数字は~である。 このように扱いたいのでしたら、配列そのものを三次元にすれば よいのではないかと思います。
補足
>配列そのものを三次元にすればよいのではないかと思います。 とはどのような事でしょうか? 例えば、matrix[x][y][z]のような感じでしょうか? すみません。勉強不足なので、ちゃんと理解していません。
お礼
ありがとうございました!これで解決する事ができました。