我正在尝试为向量和矩阵定义 Ruby 类。我打算定义两个类,MyVector
和MyMatrix
,方法如下所示。MyVector
应该表示一个行向量,MyMatrix
应该表示一个矩阵,内部组织为一个MyVector
对象数组。预期的方法MyVector
:
#initialize
方法,它将整数数组作为参数。#length
方法,返回向量的大小。#*
方法,采用参数a
,即:- if
a
是一个向量,返回内积,验证大小a
与接收者匹配。 - 如果 a 是矩阵,则返回接收器和矩阵的乘积,验证大小兼容性。
- if
#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