2013-11-07 4 views
0

Я пытаюсь определить классы Ruby для векторов и матриц. Я намерен определить два класса: MyVector и MyMatrix, со способами, указанными ниже. MyVector должен представлять вектор строки, MyMatrix должен представлять собой матрицу, внутренне организованную как массив объектов MyVector. Предполагаемые методы MyVector:Можно ли использовать методы из библиотеки Ruby в моем классе?

  1. #initialize метод, который принимает массив целых чисел в качестве аргумента.
  2. #length метод, который возвращает размер вектора.
  3. #* метод, принимая аргумент a, что:
    • , если a представляет собой вектор, возвращает скалярное произведение, проверки того, что размер a соответствует приемнику.
    • если a является матрицей, то оно возвращает произведение приемника и матрицы, подтверждающее совместимость размеров.
  4. #to_s метод, который возвращает строковое представление приемника.

Метода MyMatrix:

  1. #initialize метод, который принимает массив массивов в качестве аргумента, преобразует внутренние массивы в строках vecotrs (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][email protected][i]*m 
     i=i+1  
     end 
    end 
    end 
end 
+0

'Определите два класса MyVector и MyMatrix [...]' Нет. Я не подчиняюсь вашим приказам. – sawa

+1

@sawa: Вы можете видеть, что это всего лишь вопрос английского англичанина. –

+0

@BorisStitnicky Я подозреваю, что это не собственное слово OP и что оно изначально использовалось в другом контексте, что было бы причиной для того, чтобы закрыть этот вопрос. – sawa

ответ

3

Отличный вопрос и отличное упражнение для новичка. Как вы уже знаете, Marc-André Lafortune написал basic Matrix/Vector library, который является частью стандартной библиотеки Ruby. Хотя после того, как усилия, которые программист и математик, Марк-Андре, внесли в проект, уже невозможно сказать, что это отстой, справедливо также сказать, что stdlib matrix в настоящее время не соответствует это небесное, снотворное качество, которое мы ожидаем от библиотек Ruby.

Моя главная критика заключается в том, что Маркс-Андре также, как и вы, проводит различие между классами Vector и Matrix. Это различие не должно быть: векторы - это простые матрицы, второе измерение которых равно 1. Разделение Matrix и Vector оставляет пользователя в убыток, в отношении которого он используется, и это привело меня к тому, что я полностью запретил Vector в коде, который я пишу ,

Тем не менее, это будет matrix, это будет ответ на ваш пост. Если я понял это хорошо, заявление вопроса вопроса в вашем сообщении выглядит следующим образом:

«Я попытался определить какой-то метод ... но похоже, что этот способ не работает, потому что он всегда просит вас определить что-то новое. ты поможешь мне?

Для того, чтобы помочь вам, я бы ответил: Сначала используйте стандартную библиотеку matrix. Просто введите

require 'matrix' 

В следующем шаге вы будете делать собственную копию matrix библиотеки, которая поставляется вместе с установкой Ruby, вы не переименовать его в my_matrix, и требуете его больше не по require 'matrix', но:

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

На третьем этапе вы начнете изменять поведение библиотеки, которую вы только что скопировали, и увидите, когда она сломается. Затем вы узнаете о unit testing и научитесь использовать stdlib's minitest. При этом вы можете определить желаемое поведение и изменить код до тех пор, пока он не будет соответствовать требованию.

В 4-м, 5-м, ... -том шаге вы будете совершать много больших и малых ошибок. И если ваша приверженность матрицам и векторам в Ruby сохранится, вы будете тепло приветствовать в качестве члена NMatrix team, будущей грандиозной версии представления матриц в Ruby.

Смежные вопросы