行列の積

class Array
  def mul(x)
    m = self.size - 1
    n = x.size - 1
    c = Array.new(m + 1)
    c.each_index {|i| c[i] = Array.new(m + 1, 0)}
    for i in 0..m
      for j in 0..m
	for k in 0..n
	  c[i][j] += self[i][k] * x[k][j]
	end
      end
    end
    c
  end
end

a = [[-1, -1, 2], [-1, 2, -1], [2, -1, -1]]
b = [[2, -1, 0], [-1, 2, -1], [0, -1, 2]]
p a.mul(b)    #=>[[-1, -3, 5], [-4, 6, -4], [5, -3, -1]]
a = [[1, 2, 2], [2, 1, 1]]
b = [[1, 1], [1, 2], [2, 1]]
p a.mul(b)    #=>[[7, 7], [5, 5]]
p b.mul(a)    #=>[[3, 3, 3], [5, 4, 4], [4, 5, 5]]

標準添付ライブラリには Matrix クラスがあります。