• 締切済み

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

  • 2次元配列を部分的に削除する方法

    VBAで配列のデータを部分的に削除してその削除した後のデータを前に詰めたいのです 配列のデータ 001 X 002 Y ←この行を削除した配列にしたい 003 Z 削除後の配列データ 001 X 003 Z こんなイメージなのですが、配列の削除して前につめるという処理はどのように すればいいでしょうか? 1行で実現できるような配列処理用のメソッドがあるのでしょうか? 2次元配列を行削除して前につめる処理なのですがアドバイス下さい

  • 3次元配列から2次元配列への代入

    C言語初心者です。 詳しい方、宜しくお願い致します。 下記のような三次元配列(Sanjigen[2][5][5])があります。 ダンプしたもので見難くてすみません。 00FFBCBC [0][0][0] 01 02 03 04 05 00FFBCC1 [0][1][0] 06 07 08 09 10 00FFBCC6 [0][2][0] 11 12 13 14 15 00FFBCCB [0][3][0] 16 17 18 19 20 00FFBCD0 [0][4][0] 21 22 23 24 25 00FFBCE4 [1][0][0] 26 27 28 29 30 00FFBCE9 [1][1][0] 31 32 33 34 35 00FFBCEE [1][2][0] 36 37 38 39 40 00FFBCF3 [1][3][0] 41 42 43 44 45 00FFBCF8 [1][4][0] 46 47 48 49 50 このデータ(Sanjigen[2][5][5])を、二次元配列にしまう方法をご教授ください。 Nijigen1[5][5]には三次元配列のデータ(1~25)と(26~50)をアンドしたデータを格納します。 Nijigen2[5][5]には三次元配列のデータ(1~25)と(26~50)をオアしたデータを格納します。 下記は自分の作ったプログラムですが、うまくいきません。 char Sanjigen[2][5][5]; char Nijigen1[5][5]; char Nijigen2[5][5]; void get_data( void ) { char i; for( i=0; i<8; ++i ){ Nijigen1[i] = Sanjigen[0][i] & Sanjigen[1][i]; Nijigen2[i] = Sanjigen[0][i] ^ Sanjigen[1][i]; } } 説明わかりにくくて申し訳ありません。 宜しくお願い致します。

  • 多次元配列の一次元目の最大値の求め方

    多次元配列の一次元目の最大値の求め方 下記のような多次元配列(ちなみに、これって二次元配列ですか?)があるとき、 常に、「一次元目の最大値+1」を返すようにしたいのですが、 どうすればよいのでしょうか? $data[0][0]とか$data[1][0]とか$data[2][0]とかの最大値の意味です。 下記の例でいくと、一次元目の最大値が3なので、数値の4を返したいのですが…、 ■$data 1,0,A1,B1,C1 2,5,A2,B2,C2 3,0,A3,B3,C3 3,2,A4,B4,C4

    • ベストアンサー
    • PHP
  • 2次元配列をポインタで参照したいのですが・・

    下記Aのような2次元配列を作るとします。 A:1行あたり1024文字(ASCII)格納できるN行の2次元配列 Aの定義をまず下記Bのように行い、その後サイズ分メモリを確保しました。 B:char *str; この変数strを使って、x番目の行のy番目の文字を参照したい場合、どのようにすれば良いのでしょうか? 下記Cではやはりうまくいかないのでしょうか? C:str[x][y] 申し訳ございませんが、ご教授よろしくお願い致します。

  • Perl言語のプログラムで多次元配列について教えて

    Perl言語のプログラムで多次元配列について 教えて欲しい。 1.Deta1(evt.dat)ファイル 2.Deta2(men.dat)ファイル 多次元配列のDeta3(kad.dat)ファイル 縦方向にDeta1  $n(配列順番) 横方向にDeta2  $t(配列順番)       Deta2 → Deta1  X0   X1   Xx ↓ Y0  Z0,0  Z1,0 Zx,0    Y1  Z0,1  Z0,1 Zx,1    Yx  Z0,x  Z0,x Zx,x Deta3には($joi,$com)のデータがある ・プグラム1としいはZ1,0からZ0,xまで新規登録 及び変更登録をするプグラム ・あと一つのプグラム2はZ0,1の変更登録をするプグラム 表示プグラムは不要です。 open(FILE, "$kad_file"); @joi=<FILE>; close(FILE); foreach ($joi,$com) この間のプグラムを教えて欲しい。  ・プグラム1  ・プグラム2   open(FILE, ">$kad_file"); print FILE @joi; close(FILE);

  • 多次元配列でソートしたい

    たとえば、Yahooオークションとかで、「商品名」「価格」「残り日数」が表示されていて、 それぞれをクリックすると、その列をソートして全体を昇順・降順に並べ替えてくれますよね。 あれを自前のCGIで実現したいのです。 たとえば、3次元配列$hoge[X][Y][Z]を定義し、ここがクリックされたらXをキーにソート、ここがクリックされたらYでソートということをやりたいと思っているのですが、当然こういう機能は無いわけで、自分で作らなくてはいけません。 連想配列とかポインタとか色々考えたのですが、うまく行かず・・・。 どのような実装方法があるでしょうか、アイデアをお聞かせ願えたら嬉しいです。

    • ベストアンサー
    • Perl
  • 2次元配列でのiとjについて。

    2次元配列でのiとjについて。 2次元配列をつかってコードをかくとき、 x軸をj y軸をi  または x軸をi y軸をj どちらでコードを書いていますか? またこっちで書くとこういうときわかりやすいみたいなのがあれば教えてください。 しょうもない質問ですがどうかよろしくお願いします。

    • ベストアンサー
    • Java
  • callocで二次元配列を作成するには?

    今、動的オブジェクトの勉強をしております。 動的の一次元配列の作り方として #include <stdio.h> #include <stdlib.h> int main(void) {    int *a;    int x;    printf("配列の大きさX入力>");    scanf("%d",&x);    a=calloc(x,sizeof(int));    return (0); } これでいいと思うんですが動的な2次元配列を 作りたいときはどのようにすればよろしいのでしょうか? (↓作りたい二次元配列の例(1)↓) int main(void) {    int *a;    int x , y;    printf("配列の大きさX入力>");    scanf("%d",&x);         //5と入力    printf("配列の大きさY入力>");    scanf("%d",&y);         //10と入力    上のように入力するとa[5][10]という配列が完成する } よろしくお願いします

  • 2次元配列の配列

    VisualBasic.NETでプログラムを作っているのですが、2次元配列の配列で行き詰って困っています。 配列1~3を別に定義して、その2次元配列を配列Xという配列にひとまとめにしたいのですが、エラーが出てしまいます。 エラー内容は「配列初期化子の次元が少なすぎます」で、場所は配列Xの第1要素です。 配列1~3以降もどんどん配列を追加していく予定なので、なるべく以下の方法で書いていきたいのですが、解決法はないでしょうか? また、他にいい方法があればご教授ください。 ソースです。 ---------------------------------------- Public 配列1(,) As Integer = _ { _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1} _ } Public 配列2(,) As Integer = _ { _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2} _ } Public 配列3(,) As Integer = _ { _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3} _ } Public 配列X(,)() As Integer = { _ 配列1, _     ←ここにエラーが出る 配列2, _ 配列3 _ } ---------------------------------------- 回答よろしくお願いします。

  • java 多次元配列

    二次元平面を二次元配列int g[20][40]と対応させて考える。 g[x][y] == 1なら座標(x,y)に点があり、g[x][y] == 0なら点はないとする時、y = 2*x+5 (0=<x=<20)のグラフを表示するプログラムを作成せよ。 (xを縦方向,yを横方向と考えよ) というプログラムと同様にして y = x*x-8*x+16 (0=<x=<20)のグラフを表示するプログラムを作れ。という問題がプログラミング初心者の私には難しすぎます。 方法を教えて頂けないでしょうか?