dポイントプレゼントキャンペーン実施中!

画像の輝度値が保存された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

A 回答 (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をインストールします)
    • good
    • 0

こんにちは



> 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
    • good
    • 0

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