• 締切済み

Ruby ヒストグラムの作成

画像の輝度値が保存されたtxtファイルを開いて、輝度値のヒストグラムを表示したいのですがrubyの配列の操作に戸惑っています。histgram[value] += 1のvalueが不確定なのでnilになってしまいます。何か良い解決方法はありますか? image.txtは 輝度値 その他の情報となっているためsplit[0]で輝度値部分のみを抽出しています。 f = open('image.txt') color = Array.new histogram = Array.new correlation = Array.new n = 0 while c = f.gets color[n] = c.split[0].to_i value = c.split[0].to_i histogram[value] += 1 if(n>1) correlation[value + 50 * color[n-1] ] += 1 end n+=1 end f.close

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

要素の上限が分かっていることがほとんどなので、No.1の回答で良いのですが、ちょっと違った方法を紹介します。 histogram[value]=histogram[value] ? histogram[value] +1 : 1 histogram[value]を条件判断し、nilの時には1にするものです。まあ当たり前と言えば当たり前の方法です。 もうひとつ、 histogram[value] ||= 0 histogram[value] += 1 最初の行を追加します。これはnilの場合(falseも)に0を代入するというもので初期化ができます。 これらの場合いずれにしても代入していない要素はnilになりますので、後で0にしてやらないと不都合があるかも知れません。 グラフを書くところまで考えるなら、rsrubyでRの機能を使うのが便利なように思います。 gnuplotよりも高度なグラフが書きやすいのと、統計計算が簡単にできるので私はもっぱらrsrubyを使っています。 (Rをダウンロードして、gemでrsrubyをインストールします)

  • siffon9
  • ベストアンサー率64% (136/211)
回答No.1

こんにちは > histgram[value] += 1のvalueが不確定なのでnilになってしまいます。 多分 histgram[]の各要素の初期値がnilなので+1ができないという意味だと思うのですが、初期値を決めてあげれば良いです。(詳しくは参照URLをご確認くださいね) size = 10 histogram = Array.new(size, 0) p histogram[0] # => 0 p histogram[9] # => 0 p histogram[10] # => nil それとも、もしかして value = c.split[0].to_iが上手く数値に変換されないという意味でしょうか? その場合は、image.txtの問題のある行を提示していただいた方が良いと思います。

参考URL:
http://doc.ruby-lang.org/ja/1.9.3/class/Array.html

関連するQ&A