• ベストアンサー

RUBYのプログラムわかりません。

Yokokenの回答

  • Yokoken
  • ベストアンサー率32% (27/84)
回答No.1

通常Rubyでの配列のNewによる宣言は、 a = Array.new といったように、Arrayクラスのnewメソッドを使うという感じで使います。 これで、a は空の配列が出来ます。 transformed_dn という空の配列を作るのであれば、 transformed_dn = Array.new という形になると思いますが。 そして、その配列にary をコピーするといった形を取ればいいのではないでしょうか? 配列はクラスとはまた違うと思いますので、 質問者さんのなさっているような宣言は出来ないかと思います。 以上下手な回答ですが、 良かったら参考にしてください。

kobaba2009
質問者

補足

Yokokenさん、ありがとうございます。 配列について、よくわかりました。 下記のコードでまだ、16行目のSIZE メソッドで エラーが出てしまいます。 なんとか動かしたいのですがどこがおかしいのでしょう? def Box_Cox1(array, add) # 定数、変数の初期設定 length = 1.0 # ポイント間の初期距離 ramda_dn = -10.0 # λ値(下位置) ramda_md = ramda_dn + length # λ値(中位置) ramda_up = ramda_md + length # λ値(上位置) # 配列の準備と全サンプル数の数え上げ、自由度の計算 sample_number = 0 # 全サンプル数 transformed_dn = Array.new() # ramda_upで変換されたデータ値 transformed_md = Array.new() # ramda_mdで変換されたデータ値 transformed_up = Array.new() # ramda_dnで変換されたデータ値 for block in 0..array.size-1 transformed_dn << Array.new(array[block].size,0.0) transformed_md << Array.new(array[block].size,0.0) transformed_up << Array.new(array[block].size,0.0) sample_number += array[block].size end df = sample_number-array.size # 自由度 # データに0が含まれていたら、小さな数を足す for block in 0..array.size-1 for n in 0..array[block].size-1 if array[block][n] == 0 then array[block][n] += add end end end # ■↓■↓■↓■3点法ループの開始■↓■↓■↓■ until length < 0.0001 || ramda_md >= 10 # 変換値とその合計を算出 sum_dn, sum_md, sum_up, sum_ln = 0.0, 0.0, 0.0, 0.0 for block in 0..array.size-1 for n in 0..array[block].size-1 if ramda_dn != 0 then transformed_dn[block][n] = (array[block][n] **ramda_dn - 1) / ramda_dn else transformed_dn[block][n] = log(array[block][n]) end if ramda_md != 0 then transformed_md[block][n] = (array[block][n] **ramda_md - 1) / ramda_md else transformed_md[block][n] = log(array[block][n]) end if ramda_up != 0 then transformed_up[block][n] = (array[block][n] **ramda_up - 1) / ramda_up else transformed_up[block][n] = log(array[block][n]) end sum_dn += transformed_dn[block][n] sum_md += transformed_md[block][n] sum_up += transformed_up[block][n] sum_ln += log(array[block][n]) end end # 変換値の分散を算出 mean_dn = sum_dn / sample_number mean_md = sum_md / sample_number mean_up = sum_up / sample_number varianth_dn, varianth_md, varianth_up = 0.0, 0.0, 0.0 for block in 0..array.size-1 for n in 0..array[block].size-1 varianth_dn += (transformed_dn[block][n] - mean_dn)**2 varianth_md += (transformed_md[block][n] - mean_md)**2 varianth_up += (transformed_up[block][n] - mean_up)**2 end end varianth_up = varianth_up / (sample_number-1) varianth_md = varianth_md / (sample_number-1) varianth_dn = varianth_dn / (sample_number-1) # L値を算出 l_dn = -0.5*df*log(varianth_dn) + (ramda_dn-1)*df*sum_ln / sample_number l_md = -0.5*df*log(varianth_md) + (ramda_md-1)*df*sum_ln / sample_number l_up = -0.5*df*log(varianth_up) + (ramda_up-1)*df*sum_ln / sample_number # L値の評価と次のλ値の設定 if l_dn < l_md and l_md < l_up then ramda_dn += length ramda_md += length ramda_up += length elsif l_dn > l_md then length = length / 4 ramda_md = ramda_dn + length ramda_up = ramda_md + length else length = length / 2 ramda_md = ramda_dn + length ramda_up = ramda_md + length end end # ■↑■↑■↑■ループの終わり■↑■↑■↑■ return ramda_md end ar=[5.5,4.0,6.0,5.0,5.0,4.0,4.3] add = "0.01" begin p Box_Cox1(ar, add) end

関連するQ&A

  • Rubyのクラス

    class Test def initialize @ary = Array.new(size){false} end def print _print end def _print print"#{@ary}" end end test = Test.new(5) test.print 上記のプログラムはエラーが出て実行できません。期待している動作は[false,false,false,false,false]です。どうしてエラーが出るか教えていただきたいです。また、解決策もよろしくお願いします。

    • ベストアンサー
    • Ruby
  • Array.newが必要ないのはなぜですか?

    以下のようなクラス拡張をしてみました。 Class String def count_word Array.new(ary) ary = self.split(/\s/) return ary.size end end ここで、Array.new()のところでエラーになってしまいます。 感覚的に配列で受け取るようにするべきだと思っていたの ですが、この1行を外すと正常に動きます。 なぜ配列を生成するのがまずいのでしょうか?

    • ベストアンサー
    • Ruby
  • Rubyのイテレータ

    Rubyのイテレータで分からないところがあります。以下のコードです。 if文のところで「yield x」が真なら「return x」を実行すると 推測できるのですが、 その実行結果はこれです。 > irb> a = [1, 2, 3, 4, 5] > => [1, 2, 3, 4, 5] > irb> find(a) {|x| x % 2 == 0} > => 2 > irb> position(a) {|x| x % 2 == 0} > => 1 > irb> count(a) {|x| x % 2 == 0} > => 2 例えば、find関数なら引数は「x」ですが「x % 2 == 0」 と条件式をブロックに書いているのが分かりません。 全体の流れとしてはfind関数なら2で割り切れたのが「2」と「4」で2つあるので 関数の結果は「2」というのは理解できます。 しかし、具体的に「return x」「 if yield x」が何をしているのかが分かりませんでした。 if「もし」yield x「なら」return xを実行する、様なコードなのですが・・・。 またfind(a)なら、引数xが2で割り切れるのなら条件式は「真」なので 真の数字をカウントする、様なコードなのですが・・・。それ以上詳細に教えてくれると助かります。 何方かご存知でしたら教えてください。 > リスト 1 : データの探索 (イテレータ版) > > # ブロックが真となる要素を探す > def find(ary) > for x in ary > return x if yield x > end > false > end > > # ブロックが真となる要素の位置を返す > def position(ary) > for x in 0...ary.size > return x if yield ary[x] > end > false > end > > # ブロックが真となる要素の個数を求める > def count(ary) > c = 0 > for x in ary > c += 1 if yield x > end > c > end なおこのコードが載っているサイトはここです。 http://www.geocities.jp/m_hiroi/light/abcruby08.html

    • ベストアンサー
    • Ruby
  • Rubyの問題について質問です。

    Rubyの資格試験の勉強をしています。 分からない部分がありまして質問させていただきます。 class Employee attr_reader :id attr_accessor :name def initialize id , name @id = id @name = name end def to_s return "#{@id}:#{@name}" end def <=> other return self.id <=> other.id end employees = [ ] employees <<Employee.new("3","Tanaka") employees<<Employee.new("1","Suzuki") employees<<Employee.new("2","Sato") employee.sort! (質問) 「return self.id <=> other.id」この部分のselfとotherが何をさしているのか分かりません。3つめでインスタント化している「employees<<Employee.new("2","Sato")」のは、selfに入りそれまでに入れた値はotherに入っているのでしょうか? ご回答よろしくお願いします。

    • ベストアンサー
    • Ruby
  • Ruby について質問です

    Rubyについて質問です class Document include Enumerable attr_accessor :title, :author, :content def initialize(title, author, content) @title = title @author = author @content = content end def words @content.split end def each words.each { |word| yield(word) } end end doc = Document.new('Advice', 'Harry', 'Go ahead make my day') doc.each { |word| puts word } このようなコードがすでに出来上がったおり、 これをアルファベットの早い順に並び変えて(sort)出力させるには どのようにコードを追加すればよいですか? どうやら、sort メソッドと <=> 演算子を使って記述するようですが、 よくわかりません 回答お願いいたします。

  • Ruby の 文法に困ってます。

    以下のようなソースの場合、to_sメソッドは何時呼ばれているのでしょうか。またどういう意味を成しているのでしょうか。 Ruby初心者のためご教授頂けないでしょうか。 よろしくお願いします。 class Vector   attr_accessor :x, :y   def initialize(x=0, y=0)     @x = x     @y = y   end   def length     Math::sqrt(@x ** 2 + @y ** 2)   end   def to_s      "(#{@x},#{@y})"   end   def <=> other     length <=> other.length   end end arr =[] arr << Vector.new(2,2) arr << Vector.new(3,2) arr << Vector.new arr.sort.each do |item|   puts item end 結果は以下になります。 (0,0) (2,2) (3,2)

    • ベストアンサー
    • Ruby
  • rubyの繰り返し処理の仕方を教えてください

    rubyの繰り返し処理の仕方がわかりません rubyを使ってのプログラムを勉強してます。最終的には表の書き換えをする プログラムがつくりたいのですが最初でコケましたruby イテレーター ネストで検索してもわからなかったので質問します。どなたか お時間あれ ば教えてください。 お店の番号SA003とSA005を次の "SA001",0,10,20,10 "SA003",0,10,20,20 "SA004",0,10,20,100 "SA005",0,10,20,50 の表なかから探すプログラムを作成しようとしましたが。 繰り返し処理の仕方がわかりません変数のスコープが外れていると思いますし dataの行数は4とはかぎらないので 4.times は使えないのはわかるのですが とりあえずイメージ的に描いたプログラムです。よろしくお願いいたします。 ====testimage.rb======== class Shop_number def initialize @mise=["SA003","SA005"] end def tenposuu() return @mise.size end def tenpo_no(n) return @mise[n] end end data =[["SA001",0,10,20,10],["SA003",0,10,20,20],["SA004",0,10,20,100],["SA005",0,10,20,50]] obj = Shop_number.new obj.tenposuu.times do |i| 4.times do |j| if data[j][0]=~/{obj.tenpo_no(i)}/ then puts data end end ======================= =>["SA003",0,10,20,20] =>["SA005",0,10,20,50] と出したいのですが・・・

    • ベストアンサー
    • Ruby
  • Ruby

    #!/usr/local/bin/ruby class Foo def []=(x,y) print "Hello,",x,y,"!\n" end end bar = Foo.new bar["wor"] = "ld" 上記実行結果は Hello world! になるのですが、これが理解できません。 上手く説明してくれませんか?

  • Ruby初歩的な質問です。::はなんですか?

    ruby初心者です。 def ball_sakusei @ball = Array.new(BallMaru::BALL_KAZU){BallMaru.new(self)} end という行があったのですが、 BallMaru::BALLの部分の::はどういう意味ですか? 調べたけどよくわかりませんでした。 教えてくださいよろしくお願いします。

    • ベストアンサー
    • Ruby
  • 【ruby】 『クラスの生成に失敗』を表現したい

    『クラスの生成に失敗』を表現したいのです。 newの戻り値にnilやfalseを返せばよいと考え、 以下の様に書いてみました。(行頭は全角スペースです。) class Hoge  def initialize(arg)   return arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h) errはputsされませんでした。(グーグルで調べるとinitializeのreturnは、返ってこないそうでした。) そこで以下の様に書きました。(行頭は全角スペースです。) class Hoge  attr_reader :stat  def initialize(arg)   @stat = arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h.stat) なんか、ものすごく我流になってる気がします。。。 アドバイスをお願いいたします。

    • ベストアンサー
    • Ruby