• ベストアンサー

多次元配列の工夫

現在、あるプログラミングを作成しています。 そこで4次元配列を使用することが必要になってきました。 ---------------------------------------------- 4次元空間 for(a=・・・a++){ for(b=・・・b++){ for(c=・・・c++){ for(d=・・・d++){ if(ある条件が揃った場合) jouken[a][b][c][d]++; }}}} ---------------------------------------------- 以上のようなことをやりたいのですが、 a~cの値は3桁オーダーなので、メモリを食いすぎ、 処理が桁違いに遅くなり(ページング発生?)、 困っています。 これの解決方法としてはどのようなものがありますかね?たとえば、2次元配列を複数個使うなど。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

こんにちは、AEと申します。 条件が気になりますね。 私であれば、インクリメントの「条件」をループのなるべく外で設定できないかと考えてみると思います。 つまり、条件が揃った時だけa,b,c,dの添え字を求め、インクリメントを行うという考え方です。 漠然とした答えで申し訳ないのですが、条件によっては、全要素に対してループせずに局所的に処理するようなことも考えられると思うのです。 ※画像処理であれば領域拡大法であるとか。 メモリに関しては、これだけの要領を一挙に確保しようとするとやはり重くなると思います。 もし、動的にメモリが確保されにくいのでしたら、一種のページングですが、自分で必要外のデータをファイルに書き出しておき、必要になったら読み込むという処理を行ってはいかがでしょうか。 少なくとも、自分の好きなタイミングでデータのIOを行うことができますので、ユーザ側にストレスを与えないタイミングでのページング、というコントロールができると思います。 あまり自信がありませんが、要は条件の内容によると思うのです。 必ず全要素に対して上記の処理を行う必要がある(例えば、条件にa,b,c,dの変数が関わっていて、そういうループを作らざるを得ないような)のであれば、このループしかないように思うのです。 →究極的にはハードウェアのパワーアップ(苦笑)。 アルゴリズムを捻りだすのは面白いですね。 頑張ってください。 PS:もしかして、ボリュームデータのラベリング処理とか・・。

y_s-u
質問者

お礼

ありがとうございます。 やるのは画像処理です。 一般化HOUGH変換などです。 なんとか、配列の次元を減らせないかと頭を悩ませて います。しかし、この画像処理は現在のPCスペックでも、 まだ足りないんですねぇ。

その他の回答 (2)

  • nk2
  • ベストアンサー率23% (6/26)
回答No.2

あまり自信がありませんが、 処理速度が遅いのはfor文を4重にもネストしているからなのでは? //---------------------------------------------------------- const int firstA = 0; const int firstB = 0; const int firstC = 0; const int firstD = 0; const int endA = 0; const int endB = 0; const int endC = 0; const int endD = 0; int a = firstA; int b = firstB; int c = firstC; int d = firstD; while(true) {  if(条件) jouken[a][b][c][d]++;  if(d > endD){ d = firstD; b++; }  if(b > endB){ b = firstB; c++; }  if(c > endC){ c = firstC; a++; }  if(a > endA){break};  d++; } //---------------------------------------------------------- 本当にメモリ問題であったのならば jouken配列の型を小さくすればいいと思います。 intは4バイトです。 short intは2バイトです。 charは1バイトになります。 sizeof(jouken) == (型のバイト数)*a*b*c*d; になりますからa,b,c,dの数が大きいなら、 確保するメモリ容量は相当違いが出ます。

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

そのメモリはすべて必要ですか? もしも、「大部分の値が0(あるいは同じ値)」とかだったら、 ・メモリ上で圧縮処理をする。 ・ハッシュ構造でメモリを確保して、0(もしくはデフォルト値)のものは実際には確保しない。 などのことが考えられます。 すべてのメモリが必要であるならば、 どうしてもページングは発生すると思います。 あるいは、「値の最大値が16」などの条件があれば、 1バイトに2つの値を押し込むことによって、半分に圧縮できます。

関連するQ&A