[ruby-list:50083] たのしみたいruby
From:
Kouichi Akiyama <akansei@...8.dion.ne.jp>
Date:
2015-02-04 08:51:50 UTC
List:
ruby-list #50083
,
秋山好一です。
皆さんからの貴重な意見から、小生初めての、オブジェクト指向(もどき)のプ
ログラムが出来ました。
素直に嬉しかったです。万歳!。。。rubyは、やっぱり楽しいプログラムだと。
rubyは、そんなに甘くないとのささやきも聞こえそうですが。
楽しく少しずつ勉強していきます。ものまねからのスタートですが。
またもう一つのご指摘である、それぞれのdef 式の中には、共通部分も多く一つ
のファイルにまとめることも出来ると思います。
ファジィ数式処理応用プログラムの開発も夢ではなくなりそうです。
ときどき、報告や質問さていただきますがよろしくお願いします。
下記に、プログラムリスト示しておきます。いくつかのデータで試しましたすべ
てOKでした。
# encoding: utf-8
require "csv"
class Analysis
def initialize(msg)
@mat = Array.new
CSV.foreach msg do |row|
@mat << row.to_a
end
return self
end
def item_disp( )
co = @mat[0].length #列数
0.upto(co-1) do |i|
print(" [",(i+65).chr,"]"," ") #65=>A 66=>B....
end
puts ""
return self
end
def data_disp( )
ro = @mat.length
co = @mat[0].length
0.upto(ro-1) do |i|
0.upto(co-1) do |j|
@mat[i][j] = @mat[i][j].to_f #float型に変換
printf("%1.2f %2s",@mat[i][j], " ")
end
puts ""
end
puts ""
return self
end
def similar_coeff( )
ro = @mat.length
co = @mat[0].length
mat01 = Array.new(ro) {|i| [] }
0.upto(ro-1) do |i| #NC=行数
(i+1).upto(co-1) do |j|
vr = 0.0
0.upto(ro-1) do |k|
vr += (@mat[k][i] - @mat[k][j]).abs
end
mat01[i][j] = 1.0 - vr.fdiv(ro)
mat01[j][i] = mat01[i][j]
end
end
0.upto(co-1) do |i|
mat01[i][i] = 1.0
end
rc = (ro - co).abs
@mat.pop(rc)
ro = @mat.length
0.upto(ro-1) do |i|
0.upto(co-1) do |j|
# printf("%1.2f %2s",mat01[i][j], " ")
@mat[i][j] = mat01[i][j]
end
end
return self
end
def max_trans( )
ro = @mat.length
co = @mat[0].length
rc = (ro - co).abs #正方行列に修正
@mat.pop(rc)
ro = @mat.length
mat01 = Array.new(ro) {|i| [] }
mat02 = Array.new(ro) {|i| [] }
(ro-1).times do
0.upto(ro-1) do |i|
0.upto(co-1) do |j|
q = []
0.upto(co-1) do |k|
q << [@mat[i][k], @mat[k][j]].min
end
mat01[i][j] = q.max
end
end
0.upto(ro-1) do |i|
0.upto(co-1) do |j|
@mat[i][j] = mat01[i][j]
end
end
end
0.upto(ro-1) do |i|
0.upto(co-1) do |j|
# printf("%1.2f %2s",@mat[i][j]," ")
end
end
return self
end
def cluster_pat( )
ro = @mat.length
co = @mat[0].length
rc = (ro - co).abs #co×coの正方行列
@mat.pop(rc)
ro = @mat.length
mat01 = Array.new(ro) {|i| [] }
mat02 = Array.new(ro) {|i| [] }
count = 1
#-----行列要素がすべて -1 でtimesループ脱出---------
ro.times do #ループ開始
yy = -1
@mat.each do |x|
x.each do |y|
yy = 0 if y != yy
end
end
break if yy == -1
#-------------------------------------------------
q = []
0.upto(ro-1) do |i|
0.upto(co-1) do |j|
q << @mat[i][j]
end
end
cut = q.max
#----------弁別レベルに等しいか大きければ対応する要素を-1とする
------------------
0.upto(co-1) do |i|
0.upto(co-1) do |j|
@mat[i][j] = -1 if @mat[i][j] >= cut
end
end
#-------------------------------------------------------------
printf("%i%s %s %1.2f %2s",count,"回目","識別レベル",cut, " ""\n")
0.upto(co-1) do |i|
print("[",(i+65).chr,"]"," ")
end
puts ""
0.upto(ro-1) do |i|
0.upto(co-1) do |j|
mat01[i][j] = 0 if @mat[i][j] != -1
mat01[i][j] = 1 if @mat[i][j] == -1
printf("%2i %2s",mat01[i][j], " ")
end
puts ""
end
#ここから先は、もっとスマートにきっとなる?
mat02 = mat01.transpose #列行入換え
#列の小さい方から大きい方へパターン探索
f1 = []
0.upto(ro-1) do |i|
f = []
f.push((i+65).chr)
(i+1).upto(co-1) do |j|
f.push((j+65).chr) if mat02[i] == mat02[j]
end
f = f.uniq
f1 << f if f.length >= 2
end
f11 = []
f111 = []
n = 0
f1.each do |x|
f11[n] = x
f111 << f11[n]
n += 1
end
#列の大きい方から小さい方へパターン探索
b1 = []
0.upto(ro-1) do |i|
b = []
b.push((ro-1-i+65).chr)
(i+1).upto(co-1) do |j|
b.push((co-1-j+65).chr) if mat02[co-1-i] ==
mat02[co-1-j]
end
b = b.uniq
b1 << b if b.length >= 2
end
b11 = []
b111 = []
n = 0
b1.each do |x|
b11[n] = x
b111 << b11[n]
n += 1
end
#-----------------------------------------------------------
f111 = f111.uniq
b111 = b111.uniq
if (f111[0] & b111[0] != f111[0]) then
p f111[0] if f111[0] != nil
p b111[0].reverse if b111[0] != nil
else
p f111[0] if f111[0] != nil
end
p f111[1] if f111[1] != nil && f111[1] & b111[0] != f111[1]
count += 1
end
end
end
#---------------------------------------------------
#---------------------main--------------------------
puts "csvファイル名を入力してください"
sd = STDIN.gets.chomp
obj1 = Analysis.new(sd)
obj2 = obj1.item_disp.data_disp
obj3 = obj2.similar_coeff.max_trans.cluster_pat