0

ベクトルと行列の Ruby クラスを定義しようとしています。以下に示すメソッドを使用して、MyVectorとの2 つのクラスを定義するつもりです。行ベクトルを表す必要があり、オブジェクトの配列として内部的に編成された行列を表す必要があります。対象となる方法:MyMatrixMyVectorMyMatrixMyVectorMyVector

  1. #initialize引数として整数の配列を取るメソッド。
  2. #lengthベクトルのサイズを返すメソッド。
  3. #*メソッド、引数 を取り、次のaことを行います。
    • がベクトルの場合a、内積を返し、 のサイズがa受信者と一致することを検証します。
    • a が行列の場合、レシーバと行列の積を返し、サイズの互換性を検証します。
  4. #to_s受信者の文字列表現を返すメソッド。

の方法MyMatrix:

  1. #initializeメソッドは、配列の配列を引数として取り、内部配列を行ベクトル (MyVectorクラス) に変換し、それらを行列に配置します。
  2. #transpose転置された受信者を返すメソッド。
  3. #*オブジェクト引数を取りMyMatrix、行列の積を返し、引数のサイズの互換性を検証します。
  4. #to_s受信者の文字列表現を返すメソッド。

私がこれまでに書いたこのコードは以下のとおりですが、まったく機能しません。ライブラリクラスのメソッドに続いていくつかのメソッドを定義しようとしました(行列とベクトルクラスでは、すでにそれらのメソッドが定義されています)が、常に何か新しいものを定義するように求められるため、この方法は機能しないようです. 手伝っていただけませんか?ありがとう!

class  MyVector 
  def initialize (a)
    if !(a.instance_of? Array)
      raise "must be an array"
    else
      @array = a
    end
  end

  def array
    @array
  end

  def to_s
    @array.to_s
  end

  def length
    @array.length
  end   

  def each2(a) # 
    raise Error, "Integer is not like Vector" if a.kind_of?(Integer)
    Vector.Raise Error if length != a.length
    return to_enum(:each2, a) unless block_given?
    length.times do |i|
      yield @array[i], a[i]
    end
    self
  end

  def * (a)
    Vector.Raise Error if length != a.length
    p = 0
    each2(a) {|a1, a2|p += a1 * a2}
    p
  end
end

class MyMatrix
  def initialize a
    @array=Array.new(a.length)
    i=0
    while(i<a.length)
      @array[i]=MyVector.new(a[i])
    end
  end

  def to_s
    @array.to_s
  end

  def transpose
    size=vectors[0].length
    arr= Array.new(size)
    i=0
    while i<size
      a=Array.new(vector.length)
      j=0
      while j<a.length
        a[j]=vectors[j].arr[i]
        j+=1
      end
      arr[i]=a
      i+=1
    end        
    arr[i]=a
    i+=1
  end   

  def *m
    if !(m instance_of? MyMatrix)
      raise Error
      a=Array.new(@array.length)
      i=0
      while (i<@array.length)
        a[i]=@array[i]*m  
        i=i+1      
      end
    end
  end
end
4

1 に答える 1

3

すばらしい質問であり、初心者にとってはすばらしい練習になります。ご存知かもしれませんが、Marc-André Lafortuneは、Ruby 標準ライブラリの一部である基本的な Matrix / Vector ライブラリを作成しました。matrixMarc-André というプログラマー兼数学者がこのプロジェクトに多大な労力を費やした後では、もはやそれが悪いとは言えませんが、今日の stdlib はまだそれに準拠していないと言っても過言ではありません。私たちがRubyライブラリに期待する夢のような品質です。

Vector私の主な批判は、あなたと同じように、マルク・アンドレもクラスとクラスを区別しているということMatrixです。この区別はあってはなりません: ベクトルは 2 番目の次元が 1 に等しい単純な行列です。分離するMatrixVector、ユーザーはどちらを使用するか迷ってしまいますVector。そのため、私が書いたコードで完全に禁止することになりました。

matrixそれにもかかわらず、それはあなたの投稿への答えになる stdlib'sになります。私がそれをよく理解していれば、あなたの投稿の疑問符のステートメントは次のようになります。

「何かメソッドを定義しようとしました...しかし、この方法ではうまくいかないようです。なぜなら、常に何か新しいものを定義するように求められるからです。助けてもらえますか?」

あなたを助けるために、私は答えます:matrix標準ライブラリを使うことから始めてください。入力するだけ

require 'matrix'

次のステップではmatrix、Ruby のインストールに付属するライブラリのプライベート コピーを作成し、名前を に変更しmy_matrixますrequire 'matrix'

require './path/to/my/project/directory/my_matrix'

3 番目のステップでは、コピーしたばかりのライブラリーの動作の変更を開始し、いつ壊れるかを確認します。次に、単体テストについて学び、stdlib の使用法を学びますminitest。これにより、目的の動作を定義し、要件を満たすまでコードを変更できます。

4、5、... n 番目のステップでは、大小さまざまな間違いを犯すことになります。また、Ruby での行列とベクトルへの献身が生き残れば、Ruby で行列を表現する将来の壮大なバージョンであるNMatrixteamのメンバーとして温かく歓迎されます。

于 2013-11-07T05:41:37.113 に答える