• ベストアンサー

計算結果がものすごく多いんですが。。。

今、画像処理のプログラムを作成中です。 それで、このような計算式がありまして、 Hue = (b-g) * (pai/3) Hueの計算結果がたくさんあって、数にして311,040個。 (Hueの単位は度で、0°~360°までです。) それで、その結果を配列にいれたいんです。 どうやって配列を作ればいいのか分かりません。 どなたか分かる方、詳しく教えて下さい!!

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

  • ベストアンサー
  • ykkw_2001
  • ベストアンサー率26% (267/1014)
回答No.3

>大いに疑問です。 大丈夫みたいですよ。 Option Explicit Option Base 0 Private Sub Command1_Click() Dim x(311040) As Double Dim idx As Long For idx = 0 To 311040 x(idx) = idx + 1 Next idx Debug.Print x(0) + x(311040) MsgBox x(0) + x(311040) End Sub Debug.Print と MsgBox は、デバッグ環境、exeにコンパイルしたもの、両方で確認したという意味です。 #ちなみに、最適化もなかなかのもんです。 >Basicの配列のメモリーへの実装方法  詳しく知らないのですが、VBの変数はすべて格納領域へのポインタのようです。Variant型なんてのは、相当複雑なことをやっているようです。  インテル系CPUは、80386(だったか)あたりから、ディスクリプタテーブルを採用しているので、大容量のメモリ領域を擬似的に連続領域のように扱えるコンパイラを作成できます。恐らくVBもそうなのでしょう。 >隔世の感あり。  たしかに、おっしゃるとおりです。 DISK-BAISCのランダムアクセスファイルで8インチFDにPUT,GETしたり、2kBの中にBASICインタプリタを詰め込んでいたTINY-BASICのころは、まるで石器時代の幻ようです。 >メモリーがふんだんに使えるようになると  先日もショップで高校生が「ハードディスクは、30GBじゃたりない」と話していて、ハリ倒してやろうかと思いました。 若者がベテランに「Cの構造体って、C++のクラスみたいなもんですか?」と質問したっていう笑えないジョークもあるくらいで・・・ #かくいう私は、すでに老兵です。

butt-head
質問者

お礼

ykkw2001さんのを参考にさせて頂いて何とかできました!! しかし、パソコンが古いため計算がめっちゃ遅いです。 学校の研究室なので我慢するしかありません(;;) いろいろ書いてくださってありがとうございました★

butt-head
質問者

補足

すいません。私の説明が悪かったです。 計算結果は311,040個なんですが、それらの全部の値は0°~359°の計360個の配列に分けて入れたいんです。 例えば、Hue=2.6なら小数点以下は切り捨てて、まずHue=2にします。 それを2°の配列に格納し、カウントしていく。 3110,40個の値がそれぞれ入ってしまった後、2°は何個あったか分かるようにしたいんです。 この説明で大丈夫でしょうか? よろしくお願いします!!

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

回答者のルーチンが動くことは確認しました。しかしメモリー容量の 関係から1~例えば320、000個の配列に全て空きなく数をセットして行った時、エラーにならないと言えるでしょうか。大いに疑問です。 Basicの配列のメモリーへの実装方法をご存知の方教えてください。  メモリーが今のように利用できなかった少し前までは、配列では なく、レコードとして、外部記憶装置(Disk)に記録し、それを読んで処理していたと思います。DOS-Basicの固定長ランダムファイルのようなものを使うべきでないのでしょうか。Get #1,nのn=320000とすれば320000番目のレコードの内容が変数(フィールド)にセットされる仕組みがあれば、a=b(320000)と同じではないでしょうか。 ただ処理時間の点で格段の差はあるでしょうが。配列にデータを セットする時も、多量の場合はDiskファイルから読みこんでいませんか。 VBにもPUT,GETステートメントは残されているようです。 メモリーがふんだんに使えるようになると。この質問と 回答者のようなのが当たり前になるのでしょうね。 4Kのメモリーのコンピュターを見聞きしていた者にとって 隔世の感あり。

butt-head
質問者

お礼

まだVB初心者なので説明が上手くできていなかったみたいです。。。 すいませんでした。

  • ykkw_2001
  • ベストアンサー率26% (267/1014)
回答No.1

dim hue(311040) as double hue(311040)=99.99 msgbox hue(311040) 「こんなんじゃダメだ」ってことなの?

butt-head
質問者

お礼

すいません。ちょっと言い方間違ってました。。。(><)っっ

関連するQ&A

  • 計算結果が合わない

    下記の計算をしています(計算式=ABC/F+G(D+E) 電卓及びexcelで計算すると、結果の3,683まではあっているのですが、 下記表の4行目の結果が、電卓では、9,684、Excelで計算すると、 どうしても8,507となってしまいます。 計算式が間違っているのでしょうか?? Excel計算式 =B21*C21*D21/G21+H21*(E21+F21) 何度、電卓で計算しても、9,684となってしまいます。 よろしくお願いいたします。 A B C D E F G 結果 2.64  1312.5  511 11.49  1.5  5407  0 327 27.6  1312.5  511 11.49  1.5  5407  20 3,683 23.76 1312.5  511 11.49  1.5  5407  428 9,684

  • FFTの計算結果について

    FFTについて勉強しています。 「教えてgoo」でFFTで、検索したら、 http://momonga.t.u-tokyo.ac.jp/~ooura/fft-j.html の、計算パッケージが良いと分かったのですが、計算結果の、読み方?が、分かりません。fftsg.c か、fft8g.c を利用して、計算結果を利用してグラフを描こうと考えています。それで、質問なのですが、 1.サンプリング周波数 44.1KHz  16ビットで 8192個のデータを計算させた場合、計算値として得られる、配列は、周波数の小さい順に並んでいるらしいことは、分かるのですが、それぞれのデーターの周波数は、どうなっているんでしょうか?  単純に0Hzから22050Hzを8192で、割った小さい順で良いのでしょうか? 2. また、パワースベクトルは、どの様に計算したらいいのでしょうか? 20log絶対値 で、良いのでしょうか?  よろしくお願いします。

  • FFTの計算結果について

    FFTについて勉強しています。 計算結果の、読み方?が、分かりません。 1.サンプリング周波数 44.1KHz、16ビットで 1064960個のデータを計算させた場合、計算値として得られる、配列は、周波数の小さい順に並んでいるらしいことは、分かるのですが、それぞれのデーターの周波数は、どうなっているんでしょうか? そもそも1064960個のデータ数は必要ないのでしょうか? よろしくお願いします。

  • 動的に作成した構造体配列の中に、さらに動的に構造体配列を作るには?

    はじめまして。 この度、ちょっとした計算プログラムを作ることになったのですが、 タイトルにもありますように、 『動的に作成した構造体配列の中に、さらに動的に構造体配列を作る』 方法がわからずに困っています。 実際には下記のようにプログラムしたいのですが... ------------------------------------------------- 'a'の構造体の中に作られる'b'の配列数は、下記のように 'a'の配列の番号により違い、また'a'の配列数も最初の段階では未定です。 構造体'a'←配列数未定 構造体'b'←配列数未定 a[0]-----b[0]  |    b[1]  |    b[2]  | a[1]-----b[0]  |    b[1]  | a[2]-----b[0]  |    b[1]  .    b[2]  .    b[3]  . ------------------------------------------------- new演算子で'a'の配列は作れたのですが、その中の'b'の数の分だけ 配列を動的に作成する方法がわかりませんでした。 最初は'b'の配列を多めに取って計算すればよいと思っていましたが、 計算過程で'b'の配列数が10000を越えてしまう場合があり、 また'b'の構造体のサイズも大きめなので、断念せざるをえませんでした。 どなたか、このように配列を作成する方法を知っている方がいましたら、 是非教えていただきたいです。 下手な説明ですいません。

  • 計算結果が毎回違う。

    WINDOWS XPのACCESS97で稼動しているPGをWINDOWS7のACCESS2003にMDBを変換しました。 変換は成功しましたがある集計表の数字がXPのものと違うのです。そのPGを2回、3回と実行すると 毎回、計算結果が違います。変数や配列のクリアの問題かな?と思い処理の頭でクリア処理をしていますが、結果は同じです。PGの概要としては、マスターファイルを指定された情報を持つレコードをクエリーで抽出してそのデータをコードで集計して画面に表示するものです。ちなみに、実行するたびにクエリーの抽出件数は同じです。このデータを集計するのですが、実行するたびに結果が増えたり減ったりします。単に増えていくだけではないのです。 他にも似たような処理のPGは何本もありますが、すべて問題なく動いています。何をどこから考えてよいか、途方にくれています。何かアドバイスをお願いします。

  • Fortran において変数の定義

    現在Fortranを使いプログラムをしていますが、円の面積を計算するため変数を定義しているところでおかしな問題が出てきました。円周率を定義するところで自分でつけた変数名 PAI の値が入力データと違うことに気づきました。以下のように簡単なプログラムを作って試したのですが結果は同じくおかしな値が出てきました。 IMPLICIT REAL*8(A-Z) PAI=3.14159265 WRITE(*,1)PAI 1 FORMAT(E30.22) PAUSE END 結果は 0.3141592741012573000000E+01 とディスプレイに表示され、このあとにPAIを使った計算があるならこの値で計算されます。私としては、PAI=3.14159265と出力し、計算もしたいのですが... これは FORTRAN 自体の特有の性質なのでしょうか、それともソフト、ハード的な問題なのでしょうか? 尚、変数 PAI をファイルから読み込んだり、PAI=4.0*ATAN(1.0) (PAI=3.1415926535897930 となりますが)、PAI=3.14159265D+00などにすると正確に表示、計算出来ます。

  • プログラミングのことで教えていただきたいのですが・・・

    以下のプログラムを使用して、8桁の2進数の2の補数を計算するプログラムを作成しなさい。 という問題です。 配列aを変更するとどう変わるか添えて提出しなければならないのですがどうしても分かりません。 void main(){ int a[8]={0,1,0,1,0,1,0,1}; int b[8]; twos_complement(a, b);//補数の計算 print_bin(“a=”,a);/*配列の表示*/ print_bin(“b=”,b); } 実行結果: a=01010101 b=10101011 どなたかご教授お願いします。

  • C言語の作成依頼です。

    C言語でカラー画像をグレースケール化するプログラムを作成していただけませんか? 入力画像と出力画像のフォーマットはppmで計算方法は重み付けした輝度の計算で処理したいと思っています。 (0.299 * R + 0.587 * G + 0.114 * B) Opencvを使わないで作成お願いします。 画像のサイズは360×270 です。 できるだけ計算時間のかかるも

  • Fortranの変数の配列の設定値を計算中に設定するには?

    FortranでプログラムをつくるときAという変数にBの値の範囲で配列を設定する。A(B) このとき、プログラム作成時にはAには具体的な数値を設定しておかなくても良いですが、Bには具体的に配列の数を設定しておく必要があるように思います。  質問は、  プログラムが動く初めにはBに具体的な値を入れず、プログラム作動状況に応じてプログラム作動中にBの配列の範囲を設定できないものでしょうか?

  • ほぼ同じプログラムで結果が違う問題

    プログラムAとBが以下のようになっています。 プログラムA ------------- do n=1,100000 write(*,*) n コード 300行ぐらい enddo プログラムB -------------- do n=1,100000 if(mod(n,100).eq.1) write(*,*) n 同じソースコード enddo 両者の違いはループカウンタの画面表示頻度です。Aは毎回、Bは100回に1回印刷します。それだけですね。 ところが、プログラムAは淡々と走っていきますが、BはNaNなどを生じてしまい結果が違います。このような問題の原因は何でしょうか。出力頻度なので内容とは関係ないはずだと思うのですが。 実はコンパイラを変えたらBの問題が消えました。NaNの出力がなくなり大体想定した値が出てきています。2つのコンパイラはともにgfortranですが、何か仕様が違うということがあるでしょうか。 プログラムとしてはせいぜい10万点ぐらいの2次元配列を何度も繰り返し計算するということで、今のPCの演算速度では大したことはありません。 大昔、パソコンFortranは計算の規模(配列の規模と反復計算の回数など)に応じてコンパイラオプションを付けたり、コンパイラ自体が別物であったりしていました。そういう問題があるのかなと思うのですが。もし、何か心当たりがありましたらよろしくお願いします。

専門家に質問してみよう