Mnożenie Macierzy

Witam! Wziąłem się od wczoraj za ogarnianie języka Ruby i natknąłem się na trudności przy mnożeniu dwóch macierzy o wymiarach X na Y (użytkownik sam podaje rozmiar macierzy oraz ich elementy). Otóż chodzi o to, że jak tworzę macierz:
Matrix1 = Array.new( lwierszy, Array.new( lkolumn, 0 ) ) - to wtedy, gdy chcę podstawić jakąś wartość np. do macierzy 3x3:
Matrix1[1][0] = 5 - to on podstawia mi wtedy tą wartość do każdego wiersza, tzn [ [5,0,0],[5,0,0],[5,0,0]], a chciałbym, żeby podstawił tylko do:
[ [0,0,0],[5,0,0],[0,0,0]]. Proszę o pomoc! Ja już nie mam pomysłu jak sobie z tym poradzić. Zamieszczam na wszelki wypadek jeszcze kod programu:

puts “Mnozenie macierzy”
lwierszy = 0;
lkolumn = 0;
lwierszy2 = 0;
lkolumn2 = 0;
puts “Podaj liczbe wierszy pierwszej macierzy”
lwierszy = gets.to_i
puts “Podaj liczbe kolumn pierwszej macierzy”
lkolumn = gets.to_i
Matrix1 = Array.new( lwierszy, Array.new( lkolumn, 0 ) )
puts “Podaj liczbe wierszy drugiej macierzy”
lwierszy2 = gets.to_i
puts “Podaj liczbe kolumn drugiej macierzy”
lkolumn2 = gets.to_i
Matrix2 = Array.new( lwierszy2, Array.new( lkolumn2, 0 ) )
if lkolumn != lwierszy2
puts “Macierzy o takich rozmiarach nie mozna pomnozyc”
system( “Pause” )
exit( 0 )
end
for loop in 0 … lwierszy
for loop2 in 0 … lkolumn
printf( "Podaj element macierzy pierwszej [%d] [%d] = ", loop, loop2 )
Matrix1[ loop ][ loop2 ] = gets.to_i
end
end
for loop in 0 … lwierszy2
for loop2 in 0 … lkolumn2
printf( "Podaj element macierzy drugiej [%d] [%d] = ", loop, loop2 )
Matrix2[ loop ][ loop2 ] = gets.to_i
end
end
puts “Macierz pierwsza:”
for loop in 0 … lwierszy
for loop2 in 0 … lkolumn
printf( "%d ", Matrix1[ loop ][ loop2 ] )
end
printf( “\n” )
end
puts “Macierz druga:”
for loop in 0 … lwierszy2
for loop2 in 0 … lkolumn2
printf( "%d ", Matrix2[ loop ][ loop2 ] )
end
printf( “\n” )
end
Matrix3 = Array.new( lwierszy, Array.new( lkolumn2, 0 ) )
puts “Wynik mnozenia obu macierzy”
for loop in 0 … lwierszy
for loop2 in 0 … lkolumn2
for loop3 in 0 …lwierszy
Matrix3[ loop ][ loop2] += Matrix1[ loop ][ loop3 ] * Matrix2[ loop3 ][ loop2 ]
end
printf( "%d ", Matrix3[ loop ][ loop2 ] )
end
printf( “\n” )
end

Problem leży w tym, że w ruby “zmienne” to tak naprawdę referencje do obiektów. Dlatego Twój kod tworzy jeden obiekt i w tablicy są tak naprawdę 3 referencje do tej samej tablicy.

Poczytaj w dokumentacji Array.new: http://ruby-doc.org/core/classes/Array.html#M002150

W Twoim przypadku trzeba użyć bloku, żeby tablica stworzyła się dla każdego wiersza:

[code]> arr = Array.new(3) { Array.new(3, 0) }

arr[1][1] = 5
arr
=> [[0, 0, 0], [0, 5, 0], [0, 0, 0]][/code]

Do mnożenia macierzy “dość dobrze” sprawdza się klasa Matrix z biblioteki standardowej języka: http://www.ruby-doc.org/core/classes/Matrix.html

Dziękuję za pomoc i pozdrawiam!