我正在尝试为向量和矩阵定义Ruby类。我打算定义两个类MyVector
和MyMatrix
,方法如下所示。 MyVector
应表示行向量,MyMatrix
应表示矩阵,内部组织为MyVector
个对象的数组。 MyVector
的预期方法:
#initialize
方法,它将一个整数数组作为参数。#length
方法,返回向量的大小。#*
方法,参数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
答案 0 :(得分:3)
一个很好的问题,一个新手的好运动。您可能已经知道,Marc-André Lafortune编写了basic Matrix / Vector library,这是Ruby标准库的一部分。虽然程序员和数学家Marc-André在项目中投入了大量精力,但现在已经不再可能说它很糟糕了,现在说stdlib matrix
也是公平的。还不符合我们对Ruby库所期望的那种天堂般的,梦幻般的品质。
我的主要批评是,就像你一样,Marc-André也对Vector
和Matrix
类进行了区分。这种区别不应该是:向量是simly矩阵,其第二维等于1.分离Matrix
和Vector
使用户不知道使用哪一个,这导致我禁止Vector
完全在我写的代码中。
无论如何,这将是stdlib的matrix
,这将是你的帖子的答案。如果我理解得很好,你帖子中的问号陈述似乎是:
“我试图定义一些方法......但似乎这种方式不起作用,因为它总是要求你定义新的东西。你能帮我吗?”
为了帮助您,我会回答:首先使用matrix
标准库。只需输入
require 'matrix'
在下一步中,您将制作matrix
库的私有副本,随Ruby安装一起提供,您将其重命名为my_matrix
,并且不再需要require 'matrix'
},但是:
require './path/to/my/project/directory/my_matrix'
在第三步中,您将开始更改刚刚复制的库的行为,并查看它何时中断。接下来,您将了解unit testing,并学习使用stdlib的minitest
。有了它,您可以定义所需的行为,并更改代码,直到满足要求。
在第4步,第5步,第4步,你将犯很多大大小小的错误。如果您对Ruby中的矩阵和向量的奉献能够生存下去,那么作为NMatrix
team的成员,您将受到热烈的欢迎,这是未来在Ruby中表示矩阵的宏大版本。