是否可以在我自己的类中使用Ruby库中的方法?

时间:2013-11-07 05:09:45

标签: ruby class vector matrix

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

  1. #initialize方法,它将一个整数数组作为参数。
  2. #length方法,返回向量的大小。
  3. #*方法,参数a,表示:
    • 如果a是向量,则返回内积,验证a的大小是否与接收者匹配。
    • 如果a是矩阵,则它返回接收器和矩阵的乘积,验证大小兼容性。
  4. #to_s方法,返回接收者的字符串表示。
  5. MyMatrix的方法:

    1. #initialize方法,将数组数组作为参数,将内部数组转换为行向量(MyVector类),并将它们排列成矩阵。
    2. #transpose方法,返回接收器转置。
    3. #*方法,它接受MyMatrix对象参数并返回矩阵乘积,验证参数的大小兼容性。
    4. #to_s方法,返回接收者的字符串表示。
    5. 我到目前为止编写的这段代码如下,但它根本不起作用。我试图定义一些方法,然后是库类方法(在矩阵和向量类中,它们已经定义了这些方法),但似乎这种方式不起作用,因为它总是要求你定义新的东西。请你帮助我好吗?谢谢!

      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
      

1 个答案:

答案 0 :(得分:3)

一个很好的问题,一个新手的好运动。您可能已经知道,Marc-André Lafortune编写了basic Matrix / Vector library,这是Ruby标准库的一部分。虽然程序员和数学家Marc-André在项目中投入了大量精力,但现在已经不再可能说它很糟糕了,现在说stdlib matrix也是公平的。还不符合我们对Ruby库所期望的那种天堂般的,梦幻般的品质。

我的主要批评是,就像你一样,Marc-André也对VectorMatrix类进行了区分。这种区别不应该是:向量是simly矩阵,其第二维等于1.分离MatrixVector使用户不知道使用哪一个,这导致我禁止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中表示矩阵的宏大版本。