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