• 締切済み

3次元配列から2次元配列に

3次元配列のデータを2次元配列に移すにはどのように したらよいのでしょうか.とりあえず下記のように考えてみましたが. data3[500][500][4000]; //3次元配列 data2[500][500]; //2次元配列 for(y=0; y<500; y++) for(x=0; x<500; x++){ for(z=0; z<4000; z++){ data2[y][x] = data3[y][x][z]; } } } これでいいのでしょうか?

みんなの回答

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.7

補足要求です。 >3次元配列には data[画像の縦の幅][画像の横の幅][輝度値]になっています.  たとえば、最初の点(BMPですと画像左下)で、   data3[ 0 ][ 0 ][ 0 ] = A;   data3[ 0 ][ 0 ][ 1 ] = B;   ・   ・   data3[ 0 ][ 0 ][ 4044 ] = C;   data3[ 0 ][ 0 ][ 4045 ] = D; としたとき、 ☆ A, B, C, D は、具体的に「何」になるのでしょうか?「輝度」に関係するものですか? >long data[縦幅][横幅]=[輝度値] >このように2次元配列にしようと思っています. ☆unsigned short型で扱えていたものを、long型に格納するのですか? -------------------------------------------------- 普通?に考えれば、 画像の1点につき、輝度値範囲全ての「配列を用意」する必要はなく、輝度値そのものを「配列に格納」する。 でよろしいかと・・。 >3次元配列は malloc で動的にメモリを確保しています.  data3[ 500 ][ 500 ][ 4 ] でメモリ確保すればよいのでは・・。  #define RED 0  #define GRN 1  #define BLU 2  #define KID 3  ・  ・  data3[ y ][ x ][ RED ] = R値  data3[ y ][ x ][ GRN ] = G値  data3[ y ][ x ][ BLU ] = B値  data3[ y ][ x ][ KID ] = 輝度値  ・  (輝度値に関し、「2」次元である処理?)  ・  for( y = 0; y < 500; y++ ){   for( x = 0; x < 500; x++ ){    data2[ y ][ x ] = data3[ y ][ x ][ KID ];   }  }  もちろん、RGBを別の配列で扱うなら、2次元配列で十分。

すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.6

★もっと詳しく補足して下さい。 ・補足内容を読んでみましたがまだ不十分なため何を行いたいかが  こちらではわかりません。 >3次元配列にはdata[画像の縦の幅][画像の横の幅][輝度値]  ↑  構造は分かりました。  しかし『輝度値』の添え字数が 4000 ってどいうことですか?  そもそも配列の『型』は何ですか?  あと2次元配列に代入するときにどの情報を代入したいのですか? ・普通画像の輝度は long data[縦幅][横幅]=[輝度値] という感じになると思います。  なぜ『輝度値』の添え字数が 4000 なのでしょうか?  ここが一番不思議です。  前後の処理とソースなどを補足して欲しいです。

razio915
質問者

補足

すみません. 正確には4096です. 配列の型はunsigned short型としています. 3次元配列はmallocで動的にメモリを確保しています. Oh-Orangeさんの言うとおり, long data[縦幅][横幅]=[輝度値] このように2次元配列にしようと思っています.

すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.5

★アドバイス ・この質問は『3次元配列データを2次元配列データとして扱いたい』であっていますか?  もしもそうであればポインタを使って簡単にアクセスできます。  ただし『data3[500][500][4000]』の構造がちょっと問題ありそうです。 ・例えば横640×縦480の画像を10枚管理する構造ならば  image[10][480][640]という3次元配列で一般的に表現します。  でも中にはimage[640][480][10]という3次元配列で表現する方もいます。  両方とも3次元配列ですしちゃんと『横640×縦480の画像を10枚』を管理できます。  しかしimage[640][480][10]という構造の場合はポインタを使って2次元配列の  データとして簡単にアクセスできないです。 ・もしも『data3[4000][500][500]』という構造で3次元配列データを表現できるなら  ポインタを使って簡単に2次元配列データとしてアクセスできます。  例:  type data3[4000][500][500];  type (*data2)[500][500];    // セット  data2 = ((*)[500][500])data3;    // アクセス  for ( y = 0 ; y < 500 ; y++ ){   for ( x = 0 ; x < 500 ; x++ ){    printf( "%d\n", data2[y][x] );   }  }  上記の方法で3次元配列データを2次元配列データと同じようにアクセスできます。 最後に:  質問のタイトルである『3次元配列から2次元配列に』の意味をもう少し詳しく  書いた方がより適切な回答が得られると思います。私は上記の方法を行いたいと  勝手に解釈して回答を書き込みました。もし違っている場合は何を行いたいか  より詳しい補足を書いて下さい。 ・ちなみに『3次元配列から2次元配列にコピー』なら上記の方法でdata2ポインタを  利用して2次元配列にコピーして下さい。

razio915
質問者

補足

丁寧なご回答ありがとうございます. 3次元配列にはdata[画像の縦の幅][画像の横の幅][輝度値] になっています. 3次元である処理を行った後に,2次元配列に代入したいのです. (メモリの関係上)

すると、全ての回答が全文表示されます。
  • LegaC2
  • ベストアンサー率52% (224/428)
回答No.4

1つの箱には1つのリンゴしか入りません。 ここに、リンゴが1つづつ入った、8つの箱があります。 この8つのリンゴを、リンゴが入っていない4つの箱にすべて移してください。 razio915さんは、この問題を数学的に解けますか? razio915さんが、求めているのは、これとまったく同じです。 何かの条件を変えない限り、すべてのデータを移すことは不可能です。

すると、全ての回答が全文表示されます。
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

機械じゃないんだから、一問一答ではなくて、あなたの考えを聞かせてよ。 入れる箱の数が足りないんです。あなたなら、どうしますか? 3次元配列はルービックキューブのような形をしています。 2次元配列はエクセルの表のようなデータの形をしています。 全部移したいなら、2次元配列の配列サイズ数を、行方向か列方向に増やすしかありません。 data2[500][500x4000]とするかdata2[500x4000][500]とする。 3次元データと2次元データを図として簡単に手書きしてみて、 移すにはどうやったらいいか、イメージして下さい。 そうすれば、こんなコードにはならないはずです。

razio915
質問者

補足

すみません. 今後気をつけます.

すると、全ての回答が全文表示されます。
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.2

いや、だから3次元配列のデータ個数が2次元配列よりも多いんだって。 data3[2][2][2] = 8個 data2[2][2] = 4個 8個のデータ(3次元配列)を4個の箱(2次元配列)に入れます。 ただし1つの箱には1つしかデータしか入れられません。 全部のデータを写せません。部分的に移したいのですか?

razio915
質問者

補足

全部移したいのです

すると、全ての回答が全文表示されます。
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

2次元のデータ=500x500個に対して、 3次元のデータは500x500x4000個あります。 3次元データは、2次元データの4000倍の個数のデータを持っています。 >これでいいのでしょうか? 一体何をしたいのでしょうか? 箱の数が足りないのに、データの入れようがないと思うのですが。

razio915
質問者

補足

3次元配列のデータを2次元配列に移したいのです

すると、全ての回答が全文表示されます。

関連するQ&A