Module: NMatrix::LAPACK
- Defined in:
- lib/nmatrix/lapack_core.rb
Class Method Summary collapse
- .alloc_svd_result(matrix) ⇒ Object
- .clapack_getri(order, n, a, lda, ipiv) ⇒ Object
- .clapack_potrf(order, uplo, n, a, lda) ⇒ Object
- .clapack_potri(order, uplo, n, a, lda) ⇒ Object
- .clapack_potrs(order, uplo, n, nrhs, a, lda, b, ldb) ⇒ Object
-
.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].
-
.gesdd(matrix, workspace_size = nil) ⇒ Object
call-seq: gesdd(matrix) -> [u, sigma, v_transpose] gesdd(matrix) -> [u, sigma, v_conjugate_transpose] # complex.
-
.gesvd(matrix, workspace_size = 1) ⇒ Object
call-seq: gesvd(matrix) -> [u, sigma, v_transpose] gesvd(matrix) -> [u, sigma, v_conjugate_transpose] # complex.
- .lapack_geev(jobvl, jobvr, n, a, lda, w, wi, vl, ldvl, vr, ldvr, lwork) ⇒ Object
- .lapack_gesdd(jobz, m, n, a, lda, s, u, ldu, vt, ldvt, lwork) ⇒ Object
-
.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.
-
.laswp(matrix, ipiv) ⇒ Object
laswp(matrix, ipiv) -> NMatrix.
-
.posv(uplo, a, b) ⇒ Object
Solve the matrix equation AX = B, where A is a symmetric (or Hermitian) positive-definite matrix.
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
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
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
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
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.
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.
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.
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
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
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.
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
.
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 ofa
to read. -
a
-> The matrix A. -
b
-> The right-hand side B.
-
-
Returns :
-
The solution X
-
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 |