#
# = Matrices
# Contents:
# 1. {Class methods}[link:rdoc/matrix_rdoc.html#1]
# 1. {Instance methods}[link:rdoc/matrix_rdoc.html#2]
# 1. {Accessing matrix elements}[link:rdoc/matrix_rdoc.html#2.1]
# 1. {Initializing matrix elements}[link:rdoc/matrix_rdoc.html#2.2]
# 1. {IO}[link:rdoc/matrix_rdoc.html#2.3]
# 1. {Matrix views}[link:rdoc/matrix_rdoc.html#2.4]
# 1. {Creating row and column views}[link:rdoc/matrix_rdoc.html#2.5]
# 1. {Iterators}[link:rdoc/matrix_rdoc.html#2.6]
# 1. {Copying matrices}[link:rdoc/matrix_rdoc.html#2.7]
# 1. {Copying rows and columns}[link:rdoc/matrix_rdoc.html#2.8]
# 1. {Exchanging rows and columns}[link:rdoc/matrix_rdoc.html#2.9]
# 1. {Matrix operations}[link:rdoc/matrix_rdoc.html#2.10]
# 1. {Finding maximum and minimum elements of matrices}[link:rdoc/matrix_rdoc.html#2.11]
# 1. {Matrix properties}[link:rdoc/matrix_rdoc.html#2.12]
# 1. {NArray}[link:rdoc/matrix_rdoc.html#3]
# 1. {Special matrices}[link:rdoc/matrix_rdoc.html#4]
#
# == {}[link:index.html"name="1] Class methods
#
# ---
# * GSL::Matrix.alloc(n)
# * GSL::Matrix.alloc(size1, size2)
# * GSL::Matrix.alloc(array)
# * GSL::Matrix.alloc(arrays)
# * GSL::Matrix.alloc( ... )
# * GSL::Matrix[ ... ]
#
# These methods create a GSL::Matrix object.
#
# 1. From arrays
# >> m = GSL::Matrix[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# => GSL::Matrix
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 6.000e+00
# 7.000e+00 8.000e+00 9.000e+00 ]
#
# 1. With an array and rows&cols,
# m = GSL::Matrix.alloc([1, 2, 3, 4, 5, 6, 7, 8, 9], 3, 3)
#
# 1. With Range objects,
# >> m = GSL::Matrix.alloc(1..3, 4..6, 7..9)
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 6.000e+00
# 7.000e+00 8.000e+00 9.000e+00 ]
# >> m2 = GSL::Matrix[1..6, 2, 3]
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 6.000e+00 ]
#
# ---
# * GSL::Matrix.eye(n)
# * GSL::Matrix.eye(n1, n2)
#
# Examples:
# >> m = GSL::Matrix::Int.eye(3)
# => GSL::Matrix::Int
# [ 1 0 0
# 0 1 0
# 0 0 1 ]
# >> m = GSL::Matrix::Int.eye(2, 4)
# => GSL::Matrix::Int
# [ 1 0 0 0
# 0 1 0 0 ]
#
# ---
# * GSL::Matrix.identity(n)
# * GSL::Matrix.scalar(n)
# * GSL::Matrix.unit(n)
# * GSL::Matrix.I(n)
#
# Create diagonal matrices of dimensions n*n, of values 1.0.
#
# ---
# * GSL::Matrix.diagonal(a, b, c, ...)
# * GSL::Matrix.diagonal(Ary)
# * GSL::Matrix.diagonal(Range)
# * GSL::Matrix.diagonal(Vector)
#
# Creates a diagonal matrix of given elements.
#
# Example:
# >> GSL::Matrix::Int.diagonal(1..4)
# => GSL::Matrix::Int
# [ 1 0 0 0
# 0 2 0 0
# 0 0 3 0
# 0 0 0 4 ]
# >> GSL::Matrix::Int.diagonal(2, 5, 3)
# => GSL::Matrix::Int
# [ 2 0 0
# 0 5 0
# 0 0 3 ]
#
# ---
# * GSL::Matrix.ones(n)
# * GSL::Matrix.ones(n1, n2)
#
# Create a matrix of all the elements 1.
#
# ---
# * GSL::Matrix.zeros(n)
# * GSL::Matrix.zeros(n1, n2)
#
# Create a matrix of all the elements 1.
#
# ---
# * GSL::Matrix.indgen(n1, n2, start=0, step=1)
#
# Example:
#
# >> m = GSL::Matrix::Int.indgen(3, 5)
# => GSL::Matrix::Int
# [ 0 1 2 3 4
# 5 6 7 8 9
# 10 11 12 13 14 ]
# >> m = GSL::Matrix::Int.indgen(3, 5, 2)
# => GSL::Matrix::Int
# [ 2 3 4 5 6
# 7 8 9 10 11
# 12 13 14 15 16 ]
# >> m = GSL::Matrix.indgen(2, 3, 4.5, 6.7)
# => GSL::Matrix
# [ 4.500e+00 1.120e+01 1.790e+01
# 2.460e+01 3.130e+01 3.800e+01 ]
#
# === {}[link:index.html"name="1.1] NOTE:
# Matrix dimensions are limited within the range of Fixnum.
# For 32-bit CPU, the maximum of matrix dimension is 2^30 ~ 1e9.
#
# == {}[link:index.html"name="2] Instance Methods
# === {}[link:index.html"name="2.1] Accessing matrix elements
#
# ---
# * GSL::Matrix#size1
#
# Returns the number of rows of matrix self.
# ---
# * GSL::Matrix#size2
#
# Returns the number of columns of matrix self.
# ---
# * GSL::Matrix#shape
#
# Returns the number of rows and columns as an array.
#
# Ex:
#
# >> m.size1
# => 3
# >> m.size2
# => 5
# >> m.shape
# => [3, 5]
#
# ---
# * GSL::Matrix#set(args, val)
# * GSL::Matrix#[args]=val
#
# If args is empty and val is an Array (i.e. called with just a
# single Array argument), the Array's elements are taken as row contents.
# Each given row must have exactly the same number of elements as the Matrix
# has columns, but the number of rows given need not match the Matrix's row
# count. Extra given rows are ignored, while Matrix rows beyond those given
# are not affected. Otherwise, if args is empty, behaves as
# #set_all(val).
#
# If args is an Array and val is not, the first two elements of
# args must be Fixnums which specify the row and column of the element
# that will be set to the value of val. This special case exists to
# allow values returned by Matrix#max_index and Matrix#min_index to be used
# as indexes.
#
# If args are two Fixnums, i and j, this method
# sets the (i,j)-th element of the matrix self to val.
#
# If args is a single Fixnum, i, this method sets the
# element at row i/size2, column i%size2 to
# val.
#
# For #set, if args is empty and val is an Array of
# Arrays, the contents of self are set row by row from the
# elements (i.e. Arrays) of val.
#
# All other args specify a submatrix (as with #submatrix) whose
# elements are assigned from val. In this case, val can be an
# Array whose elements will be assigned to the rows of the submatrix,
# Range whose elements will be assigned to the elements of the
# submatrix, GSL::Matrix whose elements will be assigned to the
# elements of the submatrix, or Numeric that will be assigned to all
# elements of the submatrix.
#
# NOTE: GSL does not provide a matrix copy function that properly copies data
# across overlapping memory regions, so watch out if assigning to part of a
# Matrix from another part of itself (see #set example of
# {GSL::Vector}[link:rdoc/vector_rdoc.html]).
#
# ---
# * GSL::Matrix#get(args)
# * GSL::Matrix#[args]
#
# If args are two Fixnums, i and j, this method
# returns the (i,j)-th element of the matrix self.
#
# If args is a single Fixnum, i, this method returns the
# element at row i/size2, column i%size2.
#
# All other forms of args are treated as with Matrix#submatrix
# and a View object is returned.
#
# NOTE: The behavior of the single Fixnum argument case is different
# from earlier versions (< 1.11.2) of Ruby/GSL. These earlier versions
# returned a Vector::View in this case, thereby allowing element
# (i,j) to be accessed as m[i][j]. THIS FORM
# IS NO LONGER SUPPORTED as of Ruby/GSL 1.11.2. Existing occurences of this
# construct will need to be replaced with the backwards compatible and more
# efficient m[i,j] or, equivalent to the old and less
# efficient form, m[i,nil][j]. For GSL::Matrix, the old
# form will now raise a NoMethodError because Float has no
# #[] method. For GSL::Matrix::Int, however, the old form will return
# a single bit from an element of the matrix because Fixnum and
# Bignum have a #[] method that allows access to the number's
# individual bits.
#
# Examples:
# >> m = GSL::Matrix[1..9, 3, 3]
# => GSL::Matrix
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 6.000e+00
# 7.000e+00 8.000e+00 9.000e+00 ]
# >> m[1, 2]
# => 6.0
# >> m[1, 2] = 123 # m.set(1, 2, 123)
# => 123
# >> m
# => GSL::Matrix
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 1.230e+02
# 7.000e+00 8.000e+00 9.000e+00 ]
# >> m[1]
# => 2.0
# >> m.set([3, 5, 2], [4, 5, 3], [7, 1, 5])
# => GSL::Matrix
# [ 3.000e+00 5.000e+00 2.000e+00
# 4.000e+00 5.000e+00 3.000e+00
# 7.000e+00 1.000e+00 5.000e+00 ]
# >> m[1][1] # old/unsupported form
# NoMethodError: undefined method `[]' for 2.0:Float
# from (irb):8
# >> m = GSL::Matrix::Int[1..9, 3, 3]
# => GSL::Matrix::Int
# [ 1 2 3
# 4 5 6
# 7 8 9 ]
# >> m[1] # m[0,1]
# => 2
# >> m[1][0] # Bit 0 of m[0,1]
# => 0
# >> m[1][1] # Bit 1 of m[0,1]
# => 1
# >> m[1][2] # Bit 2 of m[0,1]
# => 0
# >> m[1][3] # Bit 3 of m[0,1]
# => 0
#
#
# ---
# * GSL::Matrix#to_a
#
# Converts the Matrix self to a Ruby Array of Arrays.
#
# Example:
# >> GSL::Matrix.eye(3).to_a
# => [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
#
# === {}[link:index.html"name="2.2] Initializing matrix elements
# ---
# * GSL::Matrix#set_all(x)
#
# This method sets all the elements of the matrix self to the value x.
#
# ---
# * GSL::Matrix#set_zero
#
# This method sets all the elements of the matrix to zero.
#
# ---
# * GSL::Matrix#set_identity
#
# This method sets the elements of the matrix to the corresponding
# elements of the identity matrix, i.e. a unit diagonal with all off-diagonal
# elements zero. This applies to both square and rectangular matrices.
#
# === {}[link:index.html"name="2.3] IO
# ---
# * GSL::Matrix#fwrite(io)
# * GSL::Matrix#fwrite(filename)
# * GSL::Matrix#fread(io)
# * GSL::Matrix#fread(filename)
# * GSL::Matrix#fprintf(io, format = "%e")
# * GSL::Matrix#fprintf(filename, format = "%e")
# * GSL::Matrix#fscanf(io)
# * GSL::Matrix#fscanf(filename)
#
#
# === {}[link:index.html"name="2.4] Matrix views
# The GSL::Matrix::View class is defined to be used as "references" to
# matrices. The Matrix::View class is a subclass of Matrix, and an
# instance of the View class created by slicing a Matrix object can
# be used same as the original matrix. The View object shares the data with
# the original matrix, i.e. any changes in the elements of the View object
# affect to the original.
#
# The primary means of generating Matrix::View objects is with
# GSL::Matrix#submatrix (or its alias GSL::Matrix#view). Many forms
# are supported and they are documented here individually. All forms return a
# Matrix::View unless otherwise documented. In the list below, the
# parameter name indicates the type of the parameter: i, row,
# col, len, len1, and len2 are Fixnums; rows and
# cols are Ranges.
#
# ---
# * GSL::Matrix#submatrix()
#
# View covers all rows and all columns.
# ---
# * GSL::Matrix#submatrix(i)
#
# View covers single element at row i/size2, column
# i%size2.
# ---
# * GSL::Matrix#submatrix(nil,nil)
#
# View covers all rows and all columns.
# ---
# * GSL::Matrix#submatrix(nil,cols)
#
# View covers all rows with columns specified by cols.
# ---
# * GSL::Matrix#submatrix(nil,col)
#
# Returns a Vector::Col::View for the column col.
# ---
# * GSL::Matrix#submatrix(rows, nil)
#
# View covers rows specified by rows and all columns.
# ---
# * GSL::Matrix#submatrix(rows, cols)
#
# View covers rows specified by rows, columns specified by cols.
# ---
# * GSL::Matrix#submatrix(rows, col)
#
# Returns a Vector::Col::View for column col, rows rows.
# ---
# * GSL::Matrix#submatrix(row, nil)
#
# Returns a Vector::View for row row.
# ---
# * GSL::Matrix#submatrix(row, cols)
#
# Returns a Vector::View for row row, columns cols.
# ---
# * GSL::Matrix#submatrix(row, col)
#
# View covers a single element at row row, column col.
# ---
# * GSL::Matrix#submatrix(nil, col, len)
#
# View covers all rows and len columns starting at column col.
# ---
# * GSL::Matrix#submatrix(rows, col, len)
#
# View covers rows rows and len columns starting at column col.
# ---
# * GSL::Matrix#submatrix(row, len, nil)
#
# View covers len rows starting at row row and all columns.
# ---
# * GSL::Matrix#submatrix(row, len, cols)
#
# View covers len rows starting at row row and cols columns.
# ---
# * GSL::Matrix#submatrix(row, col, len1, len2)
#
# View covers len1 rows starting at row row and len2
# columns starting at column col.
#
# ---
# * GSL::Vector#matrix_view(n1, n2)
#
# This creates a Matrix::View object from the vector self.
#
# Ex:
# >> v = Vector[1..9]
# => GSL::Vector
# [ 1.000e+00 2.000e+00 3.000e+00 4.000e+00 5.000e+00 6.000e+00 7.000e+00 8.000e+00 9.000e+00 ]
# >> m = v.matrix_view(3, 3)
# => GSL::Matrix::View
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 6.000e+00
# 7.000e+00 8.000e+00 9.000e+00 ]
# >> m[1][1] = 99.99
# => 99.99
# >> v
# => GSL::Vector
# [ 1.000e+00 2.000e+00 3.000e+00 4.000e+00 9.999e+01 6.000e+00 7.000e+00 8.000e+00 9.000e+00 ]
# >>
#
#
# === {}[link:index.html"name="2.5] Creating row and column views
#
# ---
# * GSL::Matrix#row(i)
#
# These methods return i-th row of the matrix as a Vector::View
# object. Any modifications to the Vectror::View object returned by this method
# propagate to the original matrix.
#
# ---
# * GSL::Matrix#column(i)
# * GSL::Matrix#col(i)
#
# These methods return a vector view of the j-th column of the matrix.
#
# ---
# * GSL::Matrix#subrow(i, offset, n)
#
# Returns a vector view of the i-th row of the matrix self
# beginning at offset elements past the first column
# and containing n elements. (>= GSL-1.10)
#
# ---
# * GSL::Matrix#subcolumn(j, offset, n)
#
# Returns a vector view of the j-th column of the matrix self
# beginning at offset elements past the first row
# and containing n elements. (>= GSL-1.10)
#
# ---
# * GSL::Matrix#diag
# * GSL::Matrix#diagonal
#
# This method returns a Vector::View of the diagonal of the matrix.
# The matrix is not required to be square. For a rectangular matrix the
# length of the diagonal is the same as the smaller dimension of the matrix.
#
#
# Ex:
# >> m = GSL::Matrix[1..9, 3, 3]
# => GSL::Matrix
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 6.000e+00
# 7.000e+00 8.000e+00 9.000e+00 ]
# >> m.row(1)
# => GSL::Vector::View
# [ 4.000e+00 5.000e+00 6.000e+00 ]
# >> m.col(2)
# => GSL::Vector::Col::View
# [ 3.000e+00
# 6.000e+00
# 9.000e+00 ]
# >> m.col(2)[2] = 123
# => 123
# >> m
# => GSL::Matrix
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 6.000e+00
# 7.000e+00 8.000e+00 1.230e+02 ]
# >> m.diagonal
# => GSL::Vector::View:
# [ 1.000e+00 5.000e+00 1.230e+02 ]
#
# ---
# * GSL::Matrix#subdiagonal(k)
#
# Returns a vector view view of the k-th subdiagonal
# of the matrix self.
# The matrix is not required to be square. The diagonal of the matrix
# corresponds to k = 0.
#
# ---
# * GSL::Matrix#superdiagonal(k)
#
# Returns a vector view of the k-th superdiagonal of the matrix self.
# The matrix is not required to be square. The diagonal of the matrix
# corresponds to k = 0.
#
# ---
# * GSL::Matrix#to_v
#
# Creates a GSL::Vector object "flattening" the rows of the matrix self.
#
# >> m = GSL::Matrix[1..6, 2, 3]
# => GSL::Matrix
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 6.000e+00 ]
# >> m.to_v
# => GSL::Vector
# [ 1.000e+00 2.000e+00 3.000e+00 4.000e+00 5.000e+00 6.000e+00 ]
#
# === {}[link:index.html"name="2.6] Iterators
# ---
# * GSL::Matrix#each_row
#
# Iterator for each of rows in the matrix self.
# ---
# * GSL::Matrix#each_col
#
# Iterator for each of columns in the matrix self.
#
# ---
# * GSL::Matrix#collect { |item| .. }
# * GSL::Matrix#map { |item| .. }
# * GSL::Matrix#collect! { |item| .. }
# * GSL::Matrix#map! { |item| .. }
#
#
# === {}[link:index.html"name="2.7] Copying matrices
# ---
# * GSL::Matrix#clone
# * GSL::Matrix#duplicate
#
# Create a new matrix of the same elements.
#
# ---
# * GSL::Matrix.memcpy(dest, src)
# * GSL::Matrix.swap(dest, src)
#
#
# === {}[link:index.html"name="2.8] Copying rows and columns
#
# ---
# * GSL::Matrix#get_row(i)
#
# This method returns a new vector (not a view) which contains the elements
# of the i-th row of the matrix self.
#
# ---
# * GSL::Matrix#get_col(j)
#
# This method returns a new vector (not a view) which contains the elements of the j-th
# column of the matrix self.
#
# ---
# * GSL::Matrix#set_row(i, v)
#
# This method copies the elements of the vector v into the i-th
# row of the matrix.
# The length of the vector must be the same as the length of the row.
#
# ---
# * GSL::Matrix#set_col(j, v)
#
# This method copies the elements of the vector v into the j-th
# column of the matrix. The length of the vector must be the same as the length
# of the column.
#
# === {}[link:index.html"name="2.9] Exchanging rows and columns
# ---
# * GSL::Matrix#swap_rows!(i, j)
#
# This method exchanges the i-th and j-th rows of the matrix in-place.
# ---
# * GSL::Matrix#swap_rows(i, j)
#
# This method creates a new matrix exchanging the i-th and j-th rows of the matrix self.
#
# ---
# * GSL::Matrix#swap_columns!(i, j)
#
# This method exchanges the i-th and j-th columns of the matrix in-place.
# ---
# * GSL::Matrix#swap_columns(i, j)
#
# This method creates a new matrix exchanging the i-th and j-th columns of the matrix self.
#
# ---
# * GSL::Matrix#swap_rowcol(i, j)
#
# This method exchanges the i-th row and j-th column of the matrix.
# The matrix must be square for this operation to be possible.
#
# ---
# * GSL::Matrix#transpose_memcpy
# * GSL::Matrix#transpose
#
# This method returns a matrix of a transpose of the matrix. The matrix
# self is not modified.
#
# ---
# * GSL::Matrix#transpose!
#
# This method replaces the matrix by its transpose by copying the
# elements of the matrix in-place. The matrix must be square for this
# operation to be possible.
#
# ---
# * GSL::Matrix#reverse_rows
# * GSL::Matrix#flipud
#
# Example:
# >> m = GSL::Matrix::Int[1..9, 3, 3]
# => GSL::Matrix::Int
# [ 1 2 3
# 4 5 6
# 7 8 9 ]
# >> m.reverse_rows
# => GSL::Matrix::Int
# [ 7 8 9
# 4 5 6
# 1 2 3 ]
#
# ---
# * GSL::Matrix#reverse_columns
# * GSL::Matrix#fliplr
#
# Example:
# >> m = GSL::Matrix::Int[1..9, 3, 3]
# => GSL::Matrix::Int
# [ 1 2 3
# 4 5 6
# 7 8 9 ]
# >> m.reverse_rows.reverse_columns
# => GSL::Matrix::Int
# [ 9 8 7
# 6 5 4
# 3 2 1 ]
#
# ---
# * GSL::Matrix#rot90(n = 1)
#
# Return a copy of self with the elements rotated
# counterclockwise in 90-degree increments. The argument n is
# optional, and specifies how many 90-degree rotations are to be applied
# (the default value is 1).
# Negative values of n rotate the matrix in a clockwise direction.
#
# Examples:
# >> m = GSL::Matrix::Int[1..6, 2, 3]
# => GSL::Matrix::Int
# [ 1 2 3
# 4 5 6 ]
# >> m.rot90
# => GSL::Matrix::Int
# [ 3 6
# 2 5
# 1 4 ]
# >> m.rot90(2)
# => GSL::Matrix::Int
# [ 6 5 4
# 3 2 1 ]
# >> m.rot90(3)
# => GSL::Matrix::Int
# [ 4 1
# 5 2
# 6 3 ]
# >> m.rot90(-1)
# => GSL::Matrix::Int
# [ 4 1
# 5 2
# 6 3 ]
#
# ---
# * GSL::Matrix#upper
#
# This creates a matrix copying the upper half part of the matrix
# self, including the diagonal elements.
# ---
# * GSL::Matrix#lower
#
# This creates a matrix copying the lower half part of the matrix
# self, including the diagonal elements.
#
# >> m = GSL::Matrix[1..9, 3, 3]
# => GSL::Matrix
# [ 1.000e+00 2.000e+00 3.000e+00
# 4.000e+00 5.000e+00 6.000e+00
# 7.000e+00 8.000e+00 9.000e+00 ]
# >> m.upper
# => GSL::Matrix
# [ 1.000e+00 2.000e+00 3.000e+00
# 0.000e+00 5.000e+00 6.000e+00
# 0.000e+00 0.000e+00 9.000e+00 ]
# >> m.lower
# => GSL::Matrix
# [ 1.000e+00 0.000e+00 0.000e+00
# 4.000e+00 5.000e+00 0.000e+00
# 7.000e+00 8.000e+00 9.000e+00 ]
#
# ---
# * GSL::Matrix#horzcat(other)
#
# Returns the horizontal concatenation of self and other.
#
# Ex:
# >> require("gsl")
# => true
# >> a = GSL::Matrix::Int[1..4, 2, 2]
# => GSL::Matrix::Int
# [ 1 2
# 3 4 ]
# >> b = GSL::Matrix::Int[5..10, 2, 3]
# => GSL::Matrix::Int
# [ 5 6 7
# 8 9 10 ]
# >> a.horzcat(b)
# => GSL::Matrix::Int
# [ 1 2 5 6 7
# 3 4 8 9 10 ]
#
# ---
# * GSL::Matrix#vertcat(other)
#
# Returns the vertical concatenation of self and other.
#
# Ex:
# >> a = GSL::Matrix::Int[1..4, 2, 2]
# => GSL::Matrix::Int
# [ 1 2
# 3 4 ]
# >> b = GSL::Matrix::Int[5..10, 3, 2]
# => GSL::Matrix::Int
# [ 5 6
# 7 8
# 9 10 ]
# >> a.vertcat(b)
# => GSL::Matrix::Int
# [ 1 2
# 3 4
# 5 6
# 7 8
# 9 10 ]
#
# === {}[link:index.html"name="2.10] Matrix operations
#
# ---
# * GSL::Matrix#add(b)
# * GSL::Matrix#+(b)
#
# This method adds the elements of matrix b
# to the elements of the matrix.
# The two matrices must have the same dimensions.
#
# If b is a scalar, these methods add it to all the elements
# of the matrix self (equivalent to the method add_constant).
#
# ---
# * GSL::Matrix#sub(b)
# * GSL::Matrix#-(b)
#
# This method subtracts the elements of matrix b
# from the elements of the
# matrix. The two matrices must have the same dimensions.
#
# ---
# * GSL::Matrix#mul_elements(b)
#
# This method multiplies the elements of the matrix by the elements of
# matrix b. The two matrices must have the same dimensions.
# If b is a scalar, the method scale (see below)
# is called.
#
# ---
# * GSL::Matrix#div_elements(b)
#
#
# This method divides the elements of the matrix by the elements of
# matrix b. The two matrices must have the same dimensions.
#
# ---
# * GSL::Matrix#scale(x)
#
# This method multiplies the elements of the matrix by the constant
# factor x.
#
# ---
# * GSL::Matrix#add_constant(x)
#
# This method adds the constant value x to the elements of the matrix.
#
# ---
# * GSL::Matrix#*(b)
#
# Matrix multiplication.
#
# Ex:
#
# >> a = GSL::Matrix[1..4, 2, 2]
# => GSL::Matrix
# [ 1.000e+00 2.000e+00
# 3.000e+00 4.000e+00 ]
# >> b = GSL::Matrix[5..8, 2, 2]
# => GSL::Matrix
# [ 5.000e+00 6.000e+00
# 7.000e+00 8.000e+00 ]
# >> a*b
# => GSL::Matrix
# [ 1.900e+01 2.200e+01
# 4.300e+01 5.000e+01 ]
# >> a*2
# => GSL::Matrix
# [ 2.000e+00 4.000e+00
# 6.000e+00 8.000e+00 ]
# >> c = Vector[1, 2]
# => GSL::Vector
# [ 1.000e+00 2.000e+00 ]
# >> a*c.col
# => GSL::Vector::Col
# [ 5.000e+00
# 1.100e+01 ]
#
# ---
# * GSL::Matrix#/(b)
#
# If b is a scalar or a Matrix, this method calculates the
# element-by-element divisions.
# If a Vector::Col is given, this method solves the linear system
# by using LU decomposition.
#
# Ex:
# >> m = GSL::Matrix[1..4, 2, 2]
# => GSL::Matrix
# [ 1.000e+00 2.000e+00
# 3.000e+00 4.000e+00 ]
# >> m/3
# => GSL::Matrix
# [ 3.333e-01 6.667e-01 <--- 1/3, 2/3
# 1.000e+00 1.333e+00 ] <--- 3/3, 4/3
# >> b = Vector[5, 6].col
# => GSL::Vector::Col
# [ 5.000e+00
# 6.000e+00 ]
# >> x = m/b <--- Solve m (x,y) = b
# => GSL::Vector::Col
# [ -4.000e+00 <--- x = -4
# 4.500e+00 ] <--- y = 4.5
# >> m*x
# => GSL::Vector::Col
# [ 5.000e+00
# 6.000e+00 ]
#
# ---
# * GSL::Matrix#^(b)
#
# Computes matrix power of b.
#
# === {}[link:index.html"name="2.11] Finding maximum and minimum elements of matrices
#
# ---
# * GSL::Matrix#max
# * GSL::Matrix#min
#
# These methods return the max/min value in the matrix.
#
# ---
# * GSL::Matrix#minmax
#
# This method returns a two elements array [min, max],
# which contains the minimum
# and the maximum values in the matrix.
#
# ---
# * GSL::Matrix#max_index
# * GSL::Matrix#min_index
#
# These methods return the index of the max/min value in the matrix.
#
# ---
# * GSL::Matrix#minmax_index
#
# This method returns a two elements array [imin, imax],
# which contains the indices
# of the minimum and the maximum value in the matrix.
#
# === {}[link:index.html"name="2.12] Matrix properties
# ---
# * GSL::Matrix#isnull
#
# This returns 1 if all the elements of the matrix self are zero,
# and 0 otherwise.
#
# ---
# * GSL::Matrix#isnull?
#
# This returns true if all the elements of the matrix self
# are zero, and false otherwise.
#
# ---
# * GSL::Matrix#ispos
# * GSL::Matrix#ispos?
#
# (GSL-1.9 or later) Return 1 (true) if all the elements of the matrix self are strictly positive, and 0 (false) otherwise.
#
# ---
# * GSL::Matrix#isneg
# * GSL::Matrix#isneg?
#
# (GSL-1.9 or later) Return 1 (true) if all the elements of the matrix self are strictly negative, and 0 (false) otherwise.
#
# ---
# * GSL::Matrix#isnonneg
# * GSL::Matrix#isnonneg?
#
# (GSL-1.10 or later) Return 1 (true) if all the elements of the matrix self are non-negative , and 0 (false) otherwise.
#
# ---
# * GSL::Matrix#any
#
# Returns a Vector of ones and zeros with each element indicating
# whether any of the elements of the corresponding column of the
# matrix are nonzero.
#
# ---
# * GSL::Matrix#all
#
# Behaves like the method any, except that it returns 1 only if
# all the elements of the matrix.
#
# ---
# * GSL:Matrix#trace
#
# This returns trace of the matrix self, the sum of the diagonal
# elements.
#
# ---
# * GSL:Matrix#norm
#
# Returns matrix norm, sqrt(sum_{ij} m_{ij}^2).
#
# ---
# * GSL::Matrix#sgn
# * GSL::Matrix#signum
#
# Creates a new matrix, with elements +1 if x_i,j > 0, -1 if
# x_i,j < 0, otherwise 0. Note that this definition gives the signum
# of NaN as 0 rather than NaN.
#
# ---
# * GSL:Matrix#abs
# * GSL:Matrix#fabs
#
# Example:
# >> m = GSL::Matrix::Int[-5..4, 3, 3]
# => GSL::Matrix::Int
# [ -5 -4 -3
# -2 -1 0
# 1 2 3 ]
# >> m.abs
# => GSL::Matrix::Int
# [ 5 4 3
# 2 1 0
# 1 2 3 ]
#
# ---
# * GSL::Matrix#equal?(other, eps = 1e-10)
# * GSL::Matrix#==(other, eps = 1e-10)
#
# Returns true if the matrices have same size and elements
# equal to absolute accurary eps for all the indices,
# and false otherwise.
#
# == {}[link:index.html"name="3] NArray
#
# ---
# * GSL::Matrix#to_na
#
# The Matrix object self is converted into an NMatrix object.
# The matrix data are copied to newly allocated memory.
#
# ---
# * NArray#to_gm
# * NArray#to_gslm
#
# Convert NArray object into GSL::Matrix.
#
# ---
# * NArray#to_gm_view
# * NArray#to_gslm_view
#
# A GSL::Matrix::View object is created from the NArray object na.
# The data of na are
# not copied, thus any modifications to the View object affect on the original
# NArray object na.
# The View object can be used as a reference to the NMatrix object.
#
# == {}[link:index.html"name="4] Special matrices
# ---
# * GSL::Matrix.hirbert(n)
#
# Returns the Hilbert matrix of order n. The ij element is
# defined as 1/(i+j+1).
#
# ---
# * GSL::Matrix.invhirbert(n)
#
# Returns the inverse of a Hilbert matrix of order n.
#
# Ex:
# >> m = GSL::Matrix.hilbert(4)
# => GSL::Matrix
# [ 1.000e+00 5.000e-01 3.333e-01 2.500e-01
# 5.000e-01 3.333e-01 2.500e-01 2.000e-01
# 3.333e-01 2.500e-01 2.000e-01 1.667e-01
# 2.500e-01 2.000e-01 1.667e-01 1.429e-01 ]
# >> invm = GSL::Matrix.invhilbert(4)
# => GSL::Matrix
# [ 1.600e+01 -1.200e+02 2.400e+02 -1.400e+02
# -1.200e+02 1.200e+03 -2.700e+03 1.680e+03
# 2.400e+02 -2.700e+03 6.480e+03 -4.200e+03
# -1.400e+02 1.680e+03 -4.200e+03 2.800e+03 ]
# >> invm2 = m.inv
# => GSL::Matrix
# [ 1.600e+01 -1.200e+02 2.400e+02 -1.400e+02
# -1.200e+02 1.200e+03 -2.700e+03 1.680e+03
# 2.400e+02 -2.700e+03 6.480e+03 -4.200e+03
# -1.400e+02 1.680e+03 -4.200e+03 2.800e+03 ]
# >> m*invm
# => GSL::Matrix
# [ 1.000e+00 5.684e-14 -2.274e-13 1.137e-13
# 1.998e-15 1.000e+00 -4.663e-14 3.109e-14
# 3.664e-15 -7.239e-14 1.000e+00 -1.017e-13
# -2.442e-15 1.510e-14 -8.038e-14 1.000e+00 ]
# >> m*invm2
# => GSL::Matrix
# [ 1.000e+00 0.000e+00 0.000e+00 0.000e+00
# -1.554e-15 1.000e+00 -2.389e-14 8.349e-15
# 1.295e-15 3.405e-15 1.000e+00 -6.957e-15
# 1.110e-15 1.916e-14 1.707e-14 1.000e+00 ]
#
# ---
# * GSL::Matrix.pascal(n)
#
# Returns the Pascal matrix of order n, created from Pascal's triangle.
#
# >> GSL::Matrix::Int.pascal(10)
# => GSL::Matrix::Int
# [ 1 1 1 1 1 1 1 1 1 1
# 1 2 3 4 5 6 7 8 9 10
# 1 3 6 10 15 21 28 36 45 55
# 1 4 10 20 35 56 84 120 165 220
# 1 5 15 35 70 126 210 330 495 715
# 1 6 21 56 126 252 462 792 1287 2002
# 1 7 28 84 210 462 924 1716 3003 5005
# 1 8 36 120 330 792 1716 3432 6435 11440
# 1 9 45 165 495 1287 3003 6435 12870 24310
# 1 10 55 220 715 2002 5005 11440 24310 48620 ]
#
# ---
# * GSL::Matrix.vandermonde(v)
#
# Creates a Vendermonde matrix from a vector or an array v.
#
# >> GSL::Matrix.vander([1, 2, 3, 4])
# => GSL::Matrix
# [ 1.000e+00 1.000e+00 1.000e+00 1.000e+00
# 8.000e+00 4.000e+00 2.000e+00 1.000e+00
# 2.700e+01 9.000e+00 3.000e+00 1.000e+00
# 6.400e+01 1.600e+01 4.000e+00 1.000e+00 ]
#
# ---
# * GSL::Matrix.toeplitz(v)
#
# Creates a Toeplitz matrix from a vector or an array v.
#
# >> GSL::Matrix::Int.toeplitz([1, 2, 3, 4, 5])
# => GSL::Matrix::Int
# [ 1 2 3 4 5
# 2 1 2 3 4
# 3 2 1 2 3
# 4 3 2 1 2
# 5 4 3 2 1 ]
#
# ---
# * GSL::Matrix.circulant(v)
#
# Creates a circulant matrix from a vector or an array v.
#
# >> GSL::Matrix::Int.circulant([1, 2, 3, 4])
# => GSL::Matrix::Int
# [ 4 1 2 3
# 3 4 1 2
# 2 3 4 1
# 1 2 3 4 ]
#
# {prev}[link:rdoc/vector_rdoc.html]
# {next}[link:rdoc/perm_rdoc.html]
#
# {Reference index}[link:rdoc/ref_rdoc.html]
# {top}[link:index.html]
#
#