Module: NMatrix::LAPACK

Defined in:
lib/nmatrix/lapack_core.rb

Class Method Summary collapse

Class Method Details

.alloc_svd_result(matrix) ⇒ Object


77
78
79
80
81
82
83
# File 'lib/nmatrix/lapack_core.rb', line 77

def alloc_svd_result(matrix)
  [
    NMatrix.new(matrix.shape[0], dtype: matrix.dtype),
    NMatrix.new([[matrix.shape[0],matrix.shape[1]].min,1], dtype: matrix.abs_dtype),
    NMatrix.new(matrix.shape[1], dtype: matrix.dtype)
  ]
end

.clapack_getri(order, n, a, lda, ipiv) ⇒ Object

Raises:

  • (NotImplementedError)

176
177
178
# File 'lib/nmatrix/lapack_core.rb', line 176

def clapack_getri(order, n, a, lda, ipiv)
  raise(NotImplementedError,"clapack_getri requires the nmatrix-atlas gem")
end

.clapack_potrf(order, uplo, n, a, lda) ⇒ Object

Raises:

  • (NotImplementedError)

164
165
166
# File 'lib/nmatrix/lapack_core.rb', line 164

def clapack_potrf(order, uplo, n, a, lda)
  raise(NotImplementedError,"clapack_potrf requires the nmatrix-atlas gem")
end

.clapack_potri(order, uplo, n, a, lda) ⇒ Object

Raises:

  • (NotImplementedError)

168
169
170
# File 'lib/nmatrix/lapack_core.rb', line 168

def clapack_potri(order, uplo, n, a, lda)
  raise(NotImplementedError,"clapack_potri requires the nmatrix-atlas gem")
end

.clapack_potrs(order, uplo, n, nrhs, a, lda, b, ldb) ⇒ Object

Raises:

  • (NotImplementedError)

172
173
174
# File 'lib/nmatrix/lapack_core.rb', line 172

def clapack_potrs(order, uplo, n, nrhs, a, lda, b, ldb)
  raise(NotImplementedError,"clapack_potrs requires the nmatrix-atlas gem")
end

.geev(matrix, which = :both) ⇒ Object

call-seq:

geev(matrix) -> [eigenvalues, left_eigenvectors, right_eigenvectors]
geev(matrix, :left) -> [eigenvalues, left_eigenvectors]
geev(matrix, :right) -> [eigenvalues, right_eigenvectors]

Perform eigenvalue decomposition on a matrix using LAPACK's xGEEV function.

eigenvalues is a n-by-1 NMatrix containing the eigenvalues.

right_eigenvalues is a n-by-n matrix such that its j'th column contains the (right) eigenvalue of matrix corresponding to the j'th eigenvalue. This means that matrix = RDR^(-1), where R is right_eigenvalues and D is the diagonal matrix formed from eigenvalues.

left_eigenvalues is n-by-n and its columns are the left eigenvalues of matrix, using the definition of left eigenvalue from LAPACK.

For real dtypes, eigenvalues and the eigenvector matrices will be complex if and only if matrix has complex eigenvalues.

Only available if nmatrix-lapack or nmatrix-atlas is installed.

Raises:

  • (NotImplementedError)

145
146
147
# File 'lib/nmatrix/lapack_core.rb', line 145

def geev(matrix, which=:both)
  raise(NotImplementedError, "geev requires either the nmatrix-atlas or nmatrix-lapack gem")
end

.gesdd(matrix, workspace_size = nil) ⇒ Object

call-seq:

gesdd(matrix) -> [u, sigma, v_transpose]
gesdd(matrix) -> [u, sigma, v_conjugate_transpose] # complex

Compute the singular value decomposition of a matrix using LAPACK's GESDD function. This uses a divide-and-conquer strategy. See also #gesvd.

Optionally accepts a workspace_size parameter, which will be honored only if it is larger than what LAPACK requires.

Requires either the nmatrix-lapacke or nmatrix-atlas gem.

Raises:

  • (NotImplementedError)

115
116
117
# File 'lib/nmatrix/lapack_core.rb', line 115

def gesdd(matrix, workspace_size=nil)
  raise(NotImplementedError,"gesvd requires either the nmatrix-atlas or nmatrix-lapacke gem")
end

.gesvd(matrix, workspace_size = 1) ⇒ Object

call-seq:

gesvd(matrix) -> [u, sigma, v_transpose]
gesvd(matrix) -> [u, sigma, v_conjugate_transpose] # complex

Compute the singular value decomposition of a matrix using LAPACK's GESVD function.

Optionally accepts a workspace_size parameter, which will be honored only if it is larger than what LAPACK requires.

Requires either the nmatrix-lapacke or nmatrix-atlas gem.

Raises:

  • (NotImplementedError)

98
99
100
# File 'lib/nmatrix/lapack_core.rb', line 98

def gesvd(matrix, workspace_size=1)
  raise(NotImplementedError,"gesvd requires either the nmatrix-atlas or nmatrix-lapacke gem")
end

.lapack_geev(jobvl, jobvr, n, a, lda, w, wi, vl, ldvl, vr, ldvr, lwork) ⇒ Object

Raises:

  • (NotImplementedError)

160
161
162
# File 'lib/nmatrix/lapack_core.rb', line 160

def lapack_geev(jobvl, jobvr, n, a, lda, w, wi, vl, ldvl, vr, ldvr, lwork)
  raise(NotImplementedError,"lapack_geev requires the nmatrix-atlas gem")
end

.lapack_gesdd(jobz, m, n, a, lda, s, u, ldu, vt, ldvt, lwork) ⇒ Object

Raises:

  • (NotImplementedError)

156
157
158
# File 'lib/nmatrix/lapack_core.rb', line 156

def lapack_gesdd(jobz, m, n, a, lda, s, u, ldu, vt, ldvt, lwork)
  raise(NotImplementedError,"lapack_gesdd requires the nmatrix-atlas gem")
end

.lapack_gesvd(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, lwork) ⇒ Object

The following are functions that used to be implemented in C, but now require nmatrix-atlas to run properly, so we can just implemented their stubs in Ruby.

Raises:

  • (NotImplementedError)

152
153
154
# File 'lib/nmatrix/lapack_core.rb', line 152

def lapack_gesvd(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, lwork)
  raise(NotImplementedError,"lapack_gesvd requires the nmatrix-atlas gem")
end

.laswp(matrix, ipiv) ⇒ Object

laswp(matrix, ipiv) -> NMatrix

Permute the columns of a matrix (in-place) according to the Array ipiv.

Raises:

  • (ArgumentError)

69
70
71
72
73
74
75
# File 'lib/nmatrix/lapack_core.rb', line 69

def laswp(matrix, ipiv)
  raise(ArgumentError, "expected NMatrix for argument 0") unless matrix.is_a?(NMatrix)
  raise(StorageTypeError, "LAPACK functions only work on :dense NMatrix instances") unless matrix.stype == :dense
  raise(ArgumentError, "expected Array ipiv to have no more entries than NMatrix a has columns") if ipiv.size > matrix.shape[1]

  clapack_laswp(matrix.shape[0], matrix, matrix.shape[1], 0, ipiv.size-1, ipiv, 1)
end

.posv(uplo, a, b) ⇒ Object

Solve the matrix equation AX = B, where A is a symmetric (or Hermitian) positive-definite matrix. If A is a nxn matrix, B must be mxn. Depending on the value of uplo, only the upper or lower half of a is read. This uses the Cholesky decomposition so it should be faster than the generic NMatrix#solve method. Doesn't modify inputs. Requires either the nmatrix-atlas or nmatrix-lapacke gem.

  • Arguments :

    • uplo -> Either :upper or :lower. Specifies which half of a to read.

    • a -> The matrix A.

    • b -> The right-hand side B.

  • Returns :

    • The solution X

Raises:

  • (NotImplementedError)

61
62
63
# File 'lib/nmatrix/lapack_core.rb', line 61

def posv(uplo, a, b)
  raise(NotImplementedError, "Either the nmatrix-atlas or nmatrix-lapacke gem must be installed to use posv")
end