require 'matrix'

class Vector
	def set i, x
		send(:[]=, i, x)
	end
end

class Matrix
	def []=(i, j, x)
		@rows[i][j] = x
	end

	def create_reduced row_indices, col_indices
		row_indices = [*row_indices].sort {|a,b| b <=> a}
		col_indices = [*col_indices].sort {|a,b| b <=> a}
		new_rows = @rows.map { |row| row.clone }
		row_indices.each { |i| new_rows.delete_at i }
		new_rows.each { |row|
			col_indices.each { |i| row.delete_at i }
		}
		return Matrix[*new_rows]
	end
	
	def diag
		raise "Not square matrix" unless square?
		values = []
		row_size.times { |i|
			values << @rows[i][i]
		}
		return values
	end
end

class Matrix::EigenvalueDecomposition
	def sort
		ordered_pairs = @d.each_with_index.sort {|a,b| a.first <=> b.first}
		ordered_keys = ordered_pairs.map {|a| a.last}

		@d = ordered_pairs.map {|a| a.first}
		@v = @v.map { |row|
			ordered_keys.map { |k| row[k] }
		}
	end
end
