class Diagonal_Matrix

Public Class Methods

diagonal(*nums) click to toggle source

Creates a matrix where the diagonal elements are composed of nums.

# File lib/matrix_gem/diagonal_matrix.rb, line 30
def diagonal(*nums)
  size = nums.length
  Diagonal_Matrix.new size, size, *(nums)
end
identity(n) click to toggle source
# File lib/matrix_gem/diagonal_matrix.rb, line 40
def identity(n)
  Diagonal_Matrix.new n
end
new(rows, cols = nil, *nums) click to toggle source

Creates a matrix by given rows, columns, and nums where the diagonal elements are composed of nums. With given only rows create identity matrix.

# File lib/matrix_gem/diagonal_matrix.rb, line 7
def initialize(rows, cols = nil, *nums)
  if cols == nil
    @matrix = identity rows
  elsif nums.length != [rows, cols].min
    raise MatrixArgumentError,
    "Wrong number of arguments (#{2 + nums.length} for #{2 + [rows, cols].min})"
  else
    @matrix = []
    rows.times do |row|
      @matrix[row] = []
      cols.times do |col|
        if row == col
          @matrix[row][col] = nums[row]
        else
          @matrix[row][col] = 0
        end
      end
    end
  end
end
zero(n) click to toggle source

Creates a zero matrix with dimension equal to n.

# File lib/matrix_gem/diagonal_matrix.rb, line 36
def zero(n)
  Diagonal_Matrix.diagonal(*(Array.new(n, 0)))
end

Public Instance Methods

*(matrix) click to toggle source

Matrix multiplication. Returns new instance of Diagonal_Matrix. Raises error if product can't be instance of Diagonal_Matrix.

Calls superclass method Matrix#*
# File lib/matrix_gem/diagonal_matrix.rb, line 75
def *(matrix)
  product = super(matrix)
  raise MatrixInvalidValue, "Product of multiplication is not diagonal matrix." if product.diagonal?

  Diagonal_Matrix.new(product.m, product.n, *(product.diagonal_values))
end
+(matrix) click to toggle source

Sum values on main diagonal of two matrices. Raises error if 'matrix' is not a Matrix or if matrices dimensions mismatch.

# File lib/matrix_gem/diagonal_matrix.rb, line 58
def +(matrix)
  sum_validation(self, matrix)
  values = self.diagonal_values.zip(matrix.diagonal_values).map{ |i| i.inject(:+) }
  Diagonal_Matrix.new self.m, self.n, *(values)
end
-(matrix) click to toggle source

Returns the difference of values on main diagonal of two matrices in new matrix. Raises error if 'matrix' is not a Matrix or if matrices dimensions mismatch.

# File lib/matrix_gem/diagonal_matrix.rb, line 66
def -(matrix)
  sum_validation(self, matrix)
  values = self.diagonal_values.zip(matrix.diagonal_values).map{ |i| i.inject(:-) }

  Diagonal_Matrix.new self.m, self.n, *(values)
end
/(matrix) click to toggle source

Matrix division (multiplication by the inverse). Raises error if difference can't be instance of Diagonal_Matrix. Raises error if matrix is not invertible.

Calls superclass method Matrix#/
# File lib/matrix_gem/diagonal_matrix.rb, line 85
def /(matrix)
  diff = super(matrix)
  raise MatrixInvalidValue, "Difference of matrices in not a diagonal matrix." if diff.diagonal?

  Diagonal_Matrix.new(diff.m, diff.n, *(diff.diagonal_values))
end
[]=(i, j = nil, value) click to toggle source

Set element on main diagonal

# File lib/matrix_gem/diagonal_matrix.rb, line 46
def []=(i, j = nil, value)
  if j != nil && i != j
    raise MatrixIndexOutOfRange,
    "You can set only elements on main diagonal in a diagonal matrix."
  elsif @matrix.size <= i
    raise MatrixIndexOutOfRange
  end
    @matrix[i][i] = value
end
det() click to toggle source

Returns the determinant of the matrix.

# File lib/matrix_gem/diagonal_matrix.rb, line 93
def det
  is_square_validation self
  self.diagonal_values.reduce(:*)
end

Private Instance Methods

non_main_diagonal_elements?(matrix) click to toggle source
# File lib/matrix_gem/diagonal_matrix.rb, line 100
def non_main_diagonal_elements?(matrix)
  matrix.m.times do |i|
    matrix.n.times do |j|
      return true if ((i != j) && (matrix[i,j] != 0))
    end
  end
  false
end