Как выполнить матричное умножение на ruby? - PullRequest
0 голосов
/ 30 октября 2018

Привет всем в моем классе Programming Paradigms, мы только начали учиться программировать на ruby. В одном упражнении предлагается реализовать функцию, которая умножает две матрицы.

Используя обычный java, я попытался создать три двумерных массива, и вот как я пытаюсь реализовать его для двух матриц 2x2:

def matrixmultiplicator(first_matrix, second_matrix)
    result_matrix = [][]
    first_matrix.each_index do |i|
        second_matrix[i].each_index do |j|
            sum = 0
            //This loop range is just a test for two 2x2 matrices
            (0..1).each do |k|
                sum = sum +(first_matrix[i][j+k] * second_matrix[j+k][i])
            end
        result_matrix[i][j] = sum
        end
    end
end

matrixmultiplicator([[1, 2], [3, 4]], [[2, 3], [3, 3]])

к сожалению, я получаю эту ошибку: неверное количество аргументов (задано 0, ожидается 1..2) (ArgumentError)

Может ли кто-нибудь мне помочь? Заранее спасибо

1 Ответ

0 голосов
/ 30 октября 2018

Это не делает то, что вы думаете:

result_matrix = [][]

Он пытается вызвать «метод индексации массива» ([]) для пустого массива, но не передает никаких аргументов методу []. Операторы - это просто методы с некоторым синтаксическим сахаром в Ruby, поэтому [][] примерно эквивалентно:

empty_array = []
empty_array.[]()

где .[] - это вызов метода [] (точно так же, как obj.m - это вызов метода m), а () - пустой список аргументов.

Ruby (как и большинство языков) не имеет многомерных массивов, он имеет массивы массивов, поэтому вы можете создавать внутренние массивы в первый раз, когда они вам понадобятся:

result_matrix = [ ]
#...
result_matrix[i]  ||= [ ]
result_matrix[i][j] = sum

вместо

result_matrix[i][j] = sum

Или вы можете предварительно заполнить result_matrix:

result_matrix = Array.new(2) { [ ] }

См. Документацию Array для конструктора , чтобы узнать, что происходит с этим Array.new вызовом.

...