0

我正在尝试为向量和矩阵定义 Ruby 类。我打算定义两个类,MyVectorMyMatrix,方法如下所示。MyVector应该表示一个行向量,MyMatrix应该表示一个矩阵,内部组织为一个MyVector对象数组。预期的方法MyVector

  1. #initialize方法,它将整数数组作为参数。
  2. #length方法,返回向量的大小。
  3. #*方法,采用参数a,即:
    • ifa是一个向量,返回内积,验证大小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编写了基本的 Matrix / Vector 库,它是 Ruby 标准库的一部分。虽然像 Marc-André 这样的程序员和数学家在项目中投入了大量精力之后,已经不能说它很糟糕,但可以说现在的 stdlibmatrix还不符合这个标准我们对 Ruby 库的期望是天堂般的、梦幻般的品质。

我的主要批评是,就像你一样,Marc-André 也区分了Vector阶级Matrix。这种区别不应该是:向量是简单的矩阵,其第二维等于 1。分离MatrixVector让用户不知该使用哪个,这导致我Vector在编写的代码中完全禁止。

尽管如此,它将是 stdlib 的matrix,这将是您帖子的答案。如果我理解得很好,您帖子中的问号语句似乎是:

“我试图定义一些方法……但似乎这种方法不起作用,因为它总是要求你定义一些新的东西。你能帮帮我吗?”

为了帮助你,我会回答:从使用matrix标准库开始。只需键入

require 'matrix'

在下一步中,您将制作matrixRuby 安装随附的库的私有副本,您将其重命名为my_matrix,并且不再需要它require 'matrix',而是通过:

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

在第三步中,您将开始更改刚刚复制的库的行为,并查看它何时中断。接下来,您将学习单元测试,并学习使用 stdlib 的minitest. 有了它,您可以定义所需的行为,并更改代码直到它满足要求。

在第 4 步、第 5 步、第 n 步中,你会犯很多大大小小的错误。如果您在 Ruby 中对矩阵和向量的贡献能够继续存在,那么您将作为NMatrix团队的一员受到热烈欢迎,这是 Ruby 中表示矩阵的未来大版本。

于 2013-11-07T05:41:37.113 回答