ベクトルと行列の Ruby クラスを定義しようとしています。以下に示すメソッドを使用して、MyVectorとの2 つのクラスを定義するつもりです。行ベクトルを表す必要があり、オブジェクトの配列として内部的に編成された行列を表す必要があります。対象となる方法:MyMatrixMyVectorMyMatrixMyVectorMyVector
#initialize引数として整数の配列を取るメソッド。#lengthベクトルのサイズを返すメソッド。#*メソッド、引数 を取り、次のaことを行います。- がベクトルの場合
a、内積を返し、 のサイズがa受信者と一致することを検証します。 - a が行列の場合、レシーバと行列の積を返し、サイズの互換性を検証します。
- がベクトルの場合
#to_s受信者の文字列表現を返すメソッド。
の方法MyMatrix:
#initializeメソッドは、配列の配列を引数として取り、内部配列を行ベクトル (MyVectorクラス) に変換し、それらを行列に配置します。#transpose転置された受信者を返すメソッド。#*オブジェクト引数を取りMyMatrix、行列の積を返し、引数のサイズの互換性を検証します。#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