アプリ版:「スタンプのみでお礼する」機能のリリースについて

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];
}
}
}

これでいいのでしょうか?

A 回答 (7件)

2次元のデータ=500x500個に対して、


3次元のデータは500x500x4000個あります。
3次元データは、2次元データの4000倍の個数のデータを持っています。

>これでいいのでしょうか?

一体何をしたいのでしょうか?
箱の数が足りないのに、データの入れようがないと思うのですが。

この回答への補足

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

補足日時:2008/08/06 14:50
    • good
    • 0

いや、だから3次元配列のデータ個数が2次元配列よりも多いんだって。



data3[2][2][2] = 8個
data2[2][2] = 4個

8個のデータ(3次元配列)を4個の箱(2次元配列)に入れます。
ただし1つの箱には1つしかデータしか入れられません。
全部のデータを写せません。部分的に移したいのですか?

この回答への補足

全部移したいのです

補足日時:2008/08/06 15:03
    • good
    • 0

機械じゃないんだから、一問一答ではなくて、あなたの考えを聞かせてよ。


入れる箱の数が足りないんです。あなたなら、どうしますか?
3次元配列はルービックキューブのような形をしています。
2次元配列はエクセルの表のようなデータの形をしています。

全部移したいなら、2次元配列の配列サイズ数を、行方向か列方向に増やすしかありません。
data2[500][500x4000]とするかdata2[500x4000][500]とする。
3次元データと2次元データを図として簡単に手書きしてみて、
移すにはどうやったらいいか、イメージして下さい。

そうすれば、こんなコードにはならないはずです。

この回答への補足

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

補足日時:2008/08/06 15:22
    • good
    • 0

1つの箱には1つのリンゴしか入りません。


ここに、リンゴが1つづつ入った、8つの箱があります。
この8つのリンゴを、リンゴが入っていない4つの箱にすべて移してください。

razio915さんは、この問題を数学的に解けますか?

razio915さんが、求めているのは、これとまったく同じです。
何かの条件を変えない限り、すべてのデータを移すことは不可能です。
    • good
    • 0

★アドバイス


・この質問は『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次元配列にコピーして下さい。

この回答への補足

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

補足日時:2008/08/06 18:52
    • good
    • 0

★もっと詳しく補足して下さい。


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

この回答への補足

すみません.
正確には4096です.
配列の型はunsigned short型としています.
3次元配列はmallocで動的にメモリを確保しています.

Oh-Orangeさんの言うとおり,
long data[縦幅][横幅]=[輝度値]
このように2次元配列にしようと思っています.

補足日時:2008/08/06 23:37
    • good
    • 0

補足要求です。



>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次元配列で十分。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!