,
秋山好一です。
皆さんからの貴重な意見から、小生初めての、オブジェクト指向(もどき)のプ 
ログラムが出来ました。
素直に嬉しかったです。万歳!。。。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