Linear Algebra
Además de (y como parte de) su soporte para arreglos multidimensionales, Julia proporciona implementaciones nativas de muchas operaciones de álgebra lineal comunes y útiles que se pueden cargar con using LinearAlgebra
. Las operaciones básicas, como tr
, det
y inv
son todas compatibles:
julia> A = [1 2 3; 4 1 6; 7 8 1]
3×3 Matrix{Int64}:
1 2 3
4 1 6
7 8 1
julia> tr(A)
3
julia> det(A)
104.0
julia> inv(A)
3×3 Matrix{Float64}:
-0.451923 0.211538 0.0865385
0.365385 -0.192308 0.0576923
0.240385 0.0576923 -0.0673077
Así como otras operaciones útiles, como encontrar valores propios o vectores propios:
julia> A = [-4. -17.; 2. 2.]
2×2 Matrix{Float64}:
-4.0 -17.0
2.0 2.0
julia> eigvals(A)
2-element Vector{ComplexF64}:
-1.0 - 5.0im
-1.0 + 5.0im
julia> eigvecs(A)
2×2 Matrix{ComplexF64}:
0.945905-0.0im 0.945905+0.0im
-0.166924+0.278207im -0.166924-0.278207im
Además, Julia proporciona muchas factorizations que se pueden utilizar para acelerar problemas como la resolución lineal o la exponenciación de matrices al pre-factorizar una matriz en una forma más adecuada (por razones de rendimiento o memoria) para el problema. Consulte la documentación sobre factorize
para obtener más información. Como ejemplo:
julia> A = [1.5 2 -4; 3 -1 -6; -10 2.3 4]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
3.0 -1.0 -6.0
-10.0 2.3 4.0
julia> factorize(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
3×3 Matrix{Float64}:
1.0 0.0 0.0
-0.15 1.0 0.0
-0.3 -0.132196 1.0
U factor:
3×3 Matrix{Float64}:
-10.0 2.3 4.0
0.0 2.345 -3.4
0.0 0.0 -5.24947
Dado que A
no es hermítica, simétrica, triangular, tridiagonal o bidiagonal, una factorización LU puede ser lo mejor que podamos hacer. Comparar con:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> factorize(B)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
3×3 Tridiagonal{Float64, Vector{Float64}}:
-1.64286 0.0 ⋅
0.0 -2.8 0.0
⋅ 0.0 5.0
U factor:
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.142857 -0.8
⋅ 1.0 -0.6
⋅ ⋅ 1.0
permutation:
3-element Vector{Int64}:
1
2
3
Aquí, Julia pudo detectar que B
es en realidad simétrico y utilizó una factorización más apropiada. A menudo es posible escribir código más eficiente para una matriz que se sabe que tiene ciertas propiedades, por ejemplo, que es simétrica o tridiagonal. Julia proporciona algunos tipos especiales para que puedas "etiquetar" matrices como que tienen estas propiedades. Por ejemplo:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
sB
ha sido etiquetada como una matriz que es (real) simétrica, por lo que para las operaciones posteriores que podríamos realizar en ella, como la eigenfactorización o el cálculo de productos matriz-vector, se pueden encontrar eficiencias al referirse solo a la mitad de ella. Por ejemplo:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> x = [1; 2; 3]
3-element Vector{Int64}:
1
2
3
julia> sB\x
3-element Vector{Float64}:
-1.7391304347826084
-1.1086956521739126
-1.4565217391304346
La operación \
aquí realiza la solución lineal. El operador de división a la izquierda es bastante poderoso y es fácil escribir código compacto y legible que sea lo suficientemente flexible como para resolver todo tipo de sistemas de ecuaciones lineales.
Special matrices
Matrices with special symmetries and structures surgen a menudo en álgebra lineal y se asocian frecuentemente con varias factorizaciones de matrices. Julia cuenta con una rica colección de tipos de matrices especiales, que permiten un cálculo rápido con rutinas especializadas que se desarrollan específicamente para tipos de matrices particulares.
Las siguientes tablas resumen los tipos de matrices especiales que se han implementado en Julia, así como si hay ganchos para varios métodos optimizados para ellas en LAPACK.
Type | Description |
---|---|
Symmetric | Symmetric matrix |
Hermitian | Hermitian matrix |
UpperTriangular | Upper triangular matrix |
UnitUpperTriangular | Upper triangular matrix with unit diagonal |
LowerTriangular | Lower triangular matrix |
UnitLowerTriangular | Lower triangular matrix with unit diagonal |
UpperHessenberg | Upper Hessenberg matrix |
Tridiagonal | Tridiagonal matrix |
SymTridiagonal | Symmetric tridiagonal matrix |
Bidiagonal | Upper/lower bidiagonal matrix |
Diagonal | Diagonal matrix |
UniformScaling | Uniform scaling operator |
Elementary operations
Matrix type | + | - | * | \ | Other functions with optimized methods |
---|---|---|---|---|---|
Symmetric | MV | inv , sqrt , cbrt , exp | |||
Hermitian | MV | inv , sqrt , cbrt , exp | |||
UpperTriangular | MV | MV | inv , det , logdet | ||
UnitUpperTriangular | MV | MV | inv , det , logdet | ||
LowerTriangular | MV | MV | inv , det , logdet | ||
UnitLowerTriangular | MV | MV | inv , det , logdet | ||
UpperHessenberg | MM | inv , det | |||
SymTridiagonal | M | M | MS | MV | eigmax , eigmin |
Tridiagonal | M | M | MS | MV | |
Bidiagonal | M | M | MS | MV | |
Diagonal | M | M | MV | MV | inv , det , logdet , / |
UniformScaling | M | M | MVS | MVS | / |
Leyenda:
Key | Description |
---|---|
M (matrix) | An optimized method for matrix-matrix operations is available |
V (vector) | An optimized method for matrix-vector operations is available |
S (scalar) | An optimized method for matrix-scalar operations is available |
Matrix factorizations
Matrix type | LAPACK | eigen | eigvals | eigvecs | svd | svdvals |
---|---|---|---|---|---|---|
Symmetric | SY | ARI | ||||
Hermitian | HE | ARI | ||||
UpperTriangular | TR | A | A | A | ||
UnitUpperTriangular | TR | A | A | A | ||
LowerTriangular | TR | A | A | A | ||
UnitLowerTriangular | TR | A | A | A | ||
SymTridiagonal | ST | A | ARI | AV | ||
Tridiagonal | GT | |||||
Bidiagonal | BD | A | A | |||
Diagonal | DI | A |
Leyenda:
Key | Description | Example |
---|---|---|
A (all) | An optimized method to find all the characteristic values and/or vectors is available | e.g. eigvals(M) |
R (range) | An optimized method to find the il th through the ih th characteristic values are available | eigvals(M, il, ih) |
I (interval) | An optimized method to find the characteristic values in the interval [vl , vh ] is available | eigvals(M, vl, vh) |
V (vectors) | An optimized method to find the characteristic vectors corresponding to the characteristic values x=[x1, x2,...] is available | eigvecs(M, x) |
The uniform scaling operator
Un operador UniformScaling
representa un escalar multiplicado por el operador identidad, λ*I
. El operador identidad I
se define como una constante y es una instancia de UniformScaling
. El tamaño de estos operadores es genérico y coincide con la otra matriz en las operaciones binarias +
, -
, *
y \
. Para A+I
y A-I
, esto significa que A
debe ser cuadrada. La multiplicación con el operador identidad I
es una operación sin efecto (excepto para verificar que el factor de escalado sea uno) y, por lo tanto, casi sin sobrecarga.
Para ver el operador UniformScaling
en acción:
julia> U = UniformScaling(2);
julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> a + U
2×2 Matrix{Int64}:
3 2
3 6
julia> a * U
2×2 Matrix{Int64}:
2 4
6 8
julia> [a U]
2×4 Matrix{Int64}:
1 2 2 0
3 4 0 2
julia> b = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
1 2 3
4 5 6
julia> b - U
ERROR: DimensionMismatch: matrix is not square: dimensions are (2, 3)
Stacktrace:
[...]
Si necesitas resolver muchos sistemas de la forma (A+μI)x = b
para el mismo A
y diferentes μ
, podría ser beneficioso calcular primero la factorización de Hessenberg F
de A
a través de la función hessenberg
. Dado F
, Julia emplea un algoritmo eficiente para (F+μ*I) \ b
(equivalente a (A+μ*I)x \ b
) y operaciones relacionadas como determinantes.
Matrix factorizations
Matrix factorizations (a.k.a. matrix decompositions) calcula la factorización de una matriz en un producto de matrices, y es uno de los conceptos centrales en el álgebra lineal (numérica).
La siguiente tabla resume los tipos de factorizaciones de matrices que se han implementado en Julia. Los detalles de sus métodos asociados se pueden encontrar en la sección Standard functions de la documentación de Álgebra Lineal.
Type | Description |
---|---|
BunchKaufman | Bunch-Kaufman factorization |
Cholesky | Cholesky factorization |
CholeskyPivoted | Pivoted Cholesky factorization |
LDLt | LDL(T) factorization |
LU | LU factorization |
QR | QR factorization |
QRCompactWY | Compact WY form of the QR factorization |
QRPivoted | Pivoted QR factorization |
LQ | QR factorization of transpose(A) |
Hessenberg | Hessenberg decomposition |
Eigen | Spectral decomposition |
GeneralizedEigen | Generalized spectral decomposition |
SVD | Singular value decomposition |
GeneralizedSVD | Generalized SVD |
Schur | Schur decomposition |
GeneralizedSchur | Generalized Schur decomposition |
Los adjuntos y transpuestos de los objetos Factorization
se envuelven de manera perezosa en objetos AdjointFactorization
y TransposeFactorization
, respectivamente. Genéricamente, el transpuesto de las Factorization
s reales se envuelven como AdjointFactorization
.
Orthogonal matrices (AbstractQ
)
Algunas factorizaciones de matrices generan factores "matriciales" ortogonales/unitarios. Estas factorizaciones incluyen factorizaciones relacionadas con QR obtenidas de llamadas a qr
, es decir, QR
, QRCompactWY
y QRPivoted
, la factorización de Hessenberg obtenida de llamadas a hessenberg
, y la factorización LQ obtenida de lq
. Si bien estos factores ortogonales/unitarios admiten una representación matricial, su representación interna es, por razones de rendimiento y memoria, diferente. Por lo tanto, deben ser vistos más bien como operadores lineales basados en matrices y basados en funciones. En particular, leer, por ejemplo, una columna de su representación matricial requiere ejecutar código de multiplicación "matriz"-vector, en lugar de simplemente leer datos de la memoria (posiblemente llenando partes del vector con ceros estructurales). Otra clara distinción de otros tipos de matrices no triangulares es que el código de multiplicación subyacente permite la modificación en el lugar durante la multiplicación. Además, los objetos de subtipos específicos de AbstractQ
, como los creados a través de 4d61726b646f776e2e436f64652822222c202271722229_40726566
, 4d61726b646f776e2e436f64652822222c202268657373656e626572672229_40726566
y 4d61726b646f776e2e436f64652822222c20226c712229_40726566
, pueden comportarse como una matriz cuadrada o rectangular dependiendo del contexto:
julia> using LinearAlgebra
julia> Q = qr(rand(3,2)).Q
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
julia> Matrix(Q)
3×2 Matrix{Float64}:
-0.320597 0.865734
-0.765834 -0.475694
-0.557419 0.155628
julia> Q*I
3×3 Matrix{Float64}:
-0.320597 0.865734 -0.384346
-0.765834 -0.475694 -0.432683
-0.557419 0.155628 0.815514
julia> Q*ones(2)
3-element Vector{Float64}:
0.5451367118802273
-1.241527373086654
-0.40179067589600226
julia> Q*ones(3)
3-element Vector{Float64}:
0.16079054743832022
-1.674209978965636
0.41372375588835797
julia> ones(1,2) * Q'
1×3 Matrix{Float64}:
0.545137 -1.24153 -0.401791
julia> ones(1,3) * Q'
1×3 Matrix{Float64}:
0.160791 -1.67421 0.413724
Debido a esta distinción de matrices densas o estructuradas, el tipo abstracto AbstractQ
no es un subtipo de AbstractMatrix
, sino que tiene su propia jerarquía de tipos. Los tipos personalizados que son subtipos de AbstractQ
pueden confiar en retrocesos genéricos si se satisface la siguiente interfaz. Por ejemplo, para
struct MyQ{T} <: LinearAlgebra.AbstractQ{T}
# required fields
end
proporcionar sobrecargas para
Base.size(Q::MyQ) # size of corresponding square matrix representation
Base.convert(::Type{AbstractQ{T}}, Q::MyQ) # eltype promotion [optional]
LinearAlgebra.lmul!(Q::MyQ, x::AbstractVecOrMat) # left-multiplication
LinearAlgebra.rmul!(A::AbstractMatrix, Q::MyQ) # right-multiplication
Si la promoción de eltype
no es de interés, el método convert
es innecesario, ya que por defecto convert(::Type{AbstractQ{T}}, Q::AbstractQ{T})
devuelve Q
mismo. Los adjuntos de objetos de tipo AbstractQ
se envuelven perezosamente en un tipo de envoltura AdjointQ
, que requiere sus propios métodos LinearAlgebra.lmul!
y LinearAlgebra.rmul!
. Dado este conjunto de métodos, cualquier Q::MyQ
puede ser utilizado como una matriz, preferiblemente en un contexto multiplicativo: la multiplicación a través de *
con escalares, vectores y matrices desde la izquierda y la derecha, obtener una representación matricial de Q
a través de Matrix(Q)
(o Q*I
) y la indexación en la representación matricial funcionan. En contraste, la adición y sustracción, así como de manera más general la difusión sobre los elementos en la representación matricial, fallan porque eso sería altamente ineficiente. Para tales casos de uso, considera calcular la representación matricial de antemano y almacenarla en caché para su reutilización futura.
Pivoting Strategies
Varios de los matrix factorizations soportan pivoting, que se puede utilizar para mejorar su estabilidad numérica. De hecho, algunas factorizaciones de matrices, como la factorización LU, pueden fallar sin pivoteo.
In pivoting, first, a pivot element with good numerical properties is chosen based on a pivoting strategy. Next, the rows and columns of the original matrix are permuted to bring the chosen element in place for subsequent computation. Furthermore, the process is repeated for each stage of the factorization.
En consecuencia, además de los factores de matriz convencionales, las salidas de los esquemas de factorización pivotada también incluyen matrices de permutación.
A continuación, se describen brevemente las estrategias de pivoteo implementadas en Julia. Tenga en cuenta que no todas las factorizaciones de matrices pueden soportarlas. Consulte la documentación de la respectiva matrix factorization para obtener detalles sobre las estrategias de pivoteo admitidas.
Vea también LinearAlgebra.ZeroPivotException
.
LinearAlgebra.NoPivot
— TypeNoPivot
No se realiza pivoteo. Las factorizaciones de matrices, como la factorización LU, pueden fallar sin pivoteo y también pueden ser numéricamente inestables para matrices de punto flotante ante errores de redondeo. Esta estrategia de pivoteo es principalmente útil con fines pedagógicos.
LinearAlgebra.RowNonZero
— TypeRowNonZero
El primer elemento no cero en las filas restantes se elige como el elemento pivote.
Ten en cuenta que para matrices de punto flotante, el algoritmo LU resultante es numéricamente inestable; esta estrategia es principalmente útil para la comparación con cálculos manuales (que típicamente utilizan esta estrategia) o para otros tipos algebraicos (por ejemplo, números racionales) que no son susceptibles a errores de redondeo. De lo contrario, la estrategia de pivoteo por defecto RowMaximum
debería ser generalmente preferida en la eliminación de Gauss.
Ten en cuenta que el tipo de elemento de la matriz debe admitir un método iszero
.
LinearAlgebra.RowMaximum
— TypeRowMaximum
El elemento de máxima magnitud en las filas restantes se elige como el elemento pivote. Esta es la estrategia predeterminada para la factorización LU de matrices de punto flotante, y a veces se refiere como el algoritmo de "pivoteo parcial".
Tenga en cuenta que el tipo de elemento de la matriz debe admitir un método abs
, cuyo tipo de resultado debe admitir un método <
.
LinearAlgebra.ColumnNorm
— TypeColumnNorm
La columna con la norma máxima se utiliza para el cálculo subsiguiente. Esto se utiliza para la factorización QR con pivoteo.
Tenga en cuenta que el tipo de elemento de la matriz debe admitir los métodos norm
y abs
, cuyos tipos de resultado respectivos deben admitir un método <
.
Standard functions
Las funciones de álgebra lineal en Julia se implementan en gran medida llamando a funciones de LAPACK. Las factorizaciones de matrices dispersas llaman a funciones de SuiteSparse. Otros solucionadores dispersos están disponibles como paquetes de Julia.
Base.:*
— Method*(A::AbstractMatrix, B::AbstractMatrix)
Multiplicación de matrices.
Ejemplos
julia> [1 1; 0 1] * [1 0; 1 1]
2×2 Matrix{Int64}:
2 1
1 1
Base.:*
— Method*(A, B::AbstractMatrix, C)
A * B * C * D
La multiplicación encadenada de 3 o 4 matrices se realiza en la secuencia más eficiente, basada en los tamaños de los arreglos. Es decir, se compara el número de multiplicaciones escalares necesarias para (A * B) * C
(con 3 matrices densas) con el de A * (B * C)
para elegir cuál de estas ejecutar.
Si el último factor es un vector, o el primero un vector transpuesto, entonces es eficiente tratar con estos primero. En particular, x' * B * y
significa (x' * B) * y
para una B::Matrix
ordinaria en orden de columna. A diferencia de dot(x, B, y)
, esto asigna un arreglo intermedio.
Si el primer o último factor es un número, esto se fusionará con la multiplicación de matrices, utilizando mul!
de 5 argumentos.
Estas optimizaciones requieren al menos Julia 1.7.
Base.:\
— Method\(A, B)
División de matrices utilizando un polialgoritmo. Para las matrices de entrada A
y B
, el resultado X
es tal que A*X == B
cuando A
es cuadrada. El solucionador que se utiliza depende de la estructura de A
. Si A
es triangular superior o inferior (o diagonal), no se requiere factorización de A
y el sistema se resuelve con sustitución hacia adelante o hacia atrás. Para matrices cuadradas no triangulares, se utiliza una factorización LU.
Para A
rectangular, el resultado es la solución de mínimos cuadrados de norma mínima calculada mediante una factorización QR con pivoteo de A
y una estimación de rango de A
basada en el factor R.
Cuando A
es dispersa, se utiliza un polialgoritmo similar. Para matrices indefinidas, la factorización LDLt
no utiliza pivoteo durante la factorización numérica y, por lo tanto, el procedimiento puede fallar incluso para matrices invertibles.
Ejemplos
julia> A = [1 0; 1 -2]; B = [32; -4];
julia> X = A \ B
2-element Vector{Float64}:
32.0
18.0
julia> A * X == B
true
Base.:/
— MethodA / B
División a la derecha de matrices: A / B
es equivalente a (B' \ A')'
donde \
es el operador de división a la izquierda. Para matrices cuadradas, el resultado X
es tal que A == X*B
.
Véase también: rdiv!
.
Ejemplos
julia> A = Float64[1 4 5; 3 9 2]; B = Float64[1 4 2; 3 4 2; 8 7 1];
julia> X = A / B
2×3 Matrix{Float64}:
-0.65 3.75 -1.2
3.25 -2.75 1.0
julia> isapprox(A, X*B)
true
julia> isapprox(X, A*pinv(B))
true
LinearAlgebra.SingularException
— TypeSingularException
Excepción lanzada cuando la matriz de entrada tiene uno o más valores propios de valor cero y no es invertible. No se puede calcular una solución lineal que involucre tal matriz. El campo info
indica la ubicación de (uno de) los valores singulares.
LinearAlgebra.PosDefException
— TypePosDefException
Excepción lanzada cuando la matriz de entrada no era definida positiva. Algunas funciones de álgebra lineal y factorizaciones solo son aplicables a matrices definidas positivas. El campo info
indica la ubicación de (uno de) los valores propios que es (son) menor(es) o igual a 0.
LinearAlgebra.ZeroPivotException
— TypeZeroPivotException <: Exception
Excepción lanzada cuando una factorización/resolución de matriz encuentra un cero en una posición de pivote (diagonal) y no puede continuar. Esto no significa necesariamente que la matriz sea singular: puede ser útil cambiar a una factorización diferente, como LU con pivoteo, que puede reordenar variables para eliminar pivotes cero espurios. El campo info
indica la ubicación de (uno de) los pivotes cero.
LinearAlgebra.RankDeficientException
— TypeRankDeficientException
Excepción lanzada cuando la matriz de entrada es deficiente en rango. Algunas funciones de álgebra lineal, como la descomposición de Cholesky, solo son aplicables a matrices que no son deficientes en rango. El campo info
indica el rango calculado de la matriz.
LinearAlgebra.LAPACKException
— TypeLAPACKException
Excepción genérica de LAPACK lanzada ya sea durante llamadas directas a las funciones LAPACK o durante llamadas a otras funciones que utilizan las funciones LAPACK internamente pero carecen de un manejo de errores especializado. El campo info
contiene información adicional sobre el error subyacente y depende de la función LAPACK que fue invocada.
LinearAlgebra.dot
— Functiondot(x, y)
x ⋅ y
Calcula el producto punto entre dos vectores. Para vectores complejos, el primer vector se conjuga.
dot
también funciona en objetos iterables arbitrarios, incluyendo arreglos de cualquier dimensión, siempre que dot
esté definido en los elementos.
dot
es semánticamente equivalente a sum(dot(vx,vy) for (vx,vy) in zip(x, y))
, con la restricción adicional de que los argumentos deben tener longitudes iguales.
x ⋅ y
(donde ⋅
se puede escribir completando con tabulador \cdot
en el REPL) es un sinónimo de dot(x, y)
.
Ejemplos
julia> dot([1; 1], [2; 3])
5
julia> dot([im; im], [1; 1])
0 - 2im
julia> dot(1:5, 2:6)
70
julia> x = fill(2., (5,5));
julia> y = fill(3., (5,5));
julia> dot(x, y)
150.0
LinearAlgebra.dot
— Methoddot(x, A, y)
Calcula el producto punto generalizado dot(x, A*y)
entre dos vectores x
y y
, sin almacenar el resultado intermedio de A*y
. Al igual que para el dot(_,_)
de dos argumentos, esto actúa de manera recursiva. Además, para vectores complejos, el primer vector se conjuga.
dot
de tres argumentos requiere al menos Julia 1.4.
Ejemplos
julia> dot([1; 1], [1 2; 3 4], [2; 3])
26
julia> dot(1:5, reshape(1:25, 5, 5), 2:6)
4850
julia> ⋅(1:5, reshape(1:25, 5, 5), 2:6) == dot(1:5, reshape(1:25, 5, 5), 2:6)
true
LinearAlgebra.cross
— Functioncross(x, y)
×(x,y)
Calcula el producto cruzado de dos vectores de 3 dimensiones.
Ejemplos
julia> a = [0;1;0]
3-element Vector{Int64}:
0
1
0
julia> b = [0;0;1]
3-element Vector{Int64}:
0
0
1
julia> cross(a,b)
3-element Vector{Int64}:
1
0
0
LinearAlgebra.axpy!
— Functionaxpy!(α, x::AbstractArray, y::AbstractArray)
Sobrescribe y
con x * α + y
y devuelve y
. Si x
y y
tienen los mismos ejes, es equivalente a y .+= x .* a
.
Ejemplos
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpy!(2, x, y)
3-element Vector{Int64}:
6
9
12
LinearAlgebra.axpby!
— Functionaxpby!(α, x::AbstractArray, β, y::AbstractArray)
Sobrescribe y
con x * α + y * β
y devuelve y
. Si x
y y
tienen los mismos ejes, es equivalente a y .= x .* a .+ y .* β
.
Ejemplos
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpby!(2, x, 2, y)
3-element Vector{Int64}:
10
14
18
LinearAlgebra.rotate!
— Functionrotate!(x, y, c, s)
Sobrescribe x
con c*x + s*y
y y
con -conj(s)*x + c*y
. Devuelve x
y y
.
rotate!
requiere al menos Julia 1.5.
LinearAlgebra.reflect!
— Functionreflect!(x, y, c, s)
Sobrescribe x
con c*x + s*y
y y
con conj(s)*x - c*y
. Devuelve x
y y
.
reflect!
requiere al menos Julia 1.5.
LinearAlgebra.factorize
— Functionfactorizar(A)
Calcula una factorización conveniente de A
, basada en el tipo de la matriz de entrada. factorizar
verifica A
para ver si es simétrica/triangular/etc. si A
se pasa como una matriz genérica. factorizar
revisa cada elemento de A
para verificar/desestimar cada propiedad. Se detendrá tan pronto como pueda descartar la simetría/estructura triangular. El valor de retorno se puede reutilizar para resolver de manera eficiente múltiples sistemas. Por ejemplo: A=factorizar(A); x=A\b; y=A\C
.
Propiedades de A | tipo de factorización |
---|---|
Positivo-definido | Cholesky (ver cholesky ) |
Densa Simétrica/Hermítica | Bunch-Kaufman (ver bunchkaufman ) |
Escasa Simétrica/Hermítica | LDLt (ver ldlt ) |
Triangular | Triangular |
Diagonal | Diagonal |
Bidiagonal | Bidiagonal |
Tridiagonal | LU (ver lu ) |
Tridiagonal real simétrica | LDLt (ver ldlt ) |
Cuadrada general | LU (ver lu ) |
No cuadrada general | QR (ver qr ) |
Si factorizar
se llama en una matriz hermítica positiva-definida, por ejemplo, entonces factorizar
devolverá una factorización de Cholesky.
Ejemplos
julia> A = Array(Bidiagonal(fill(1.0, (5, 5)), :U))
5×5 Matrix{Float64}:
1.0 1.0 0.0 0.0 0.0
0.0 1.0 1.0 0.0 0.0
0.0 0.0 1.0 1.0 0.0
0.0 0.0 0.0 1.0 1.0
0.0 0.0 0.0 0.0 1.0
julia> factorizar(A) # factorizar verificará si A ya está factorizada
5×5 Bidiagonal{Float64, Vector{Float64}}:
1.0 1.0 ⋅ ⋅ ⋅
⋅ 1.0 1.0 ⋅ ⋅
⋅ ⋅ 1.0 1.0 ⋅
⋅ ⋅ ⋅ 1.0 1.0
⋅ ⋅ ⋅ ⋅ 1.0
Esto devuelve un 5×5 Bidiagonal{Float64}
, que ahora se puede pasar a otras funciones de álgebra lineal (por ejemplo, solucionadores de eigenvalores) que utilizarán métodos especializados para tipos Bidiagonal
.
LinearAlgebra.Diagonal
— TypeDiagonal(V::AbstractVector)
Construye una matriz perezosa con V
como su diagonal.
Véase también UniformScaling
para la matriz identidad perezosa I
, diagm
para hacer una matriz densa, y diag
para extraer elementos diagonales.
Ejemplos
julia> d = Diagonal([1, 10, 100])
3×3 Diagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅
⋅ 10 ⋅
⋅ ⋅ 100
julia> diagm([7, 13])
2×2 Matrix{Int64}:
7 0
0 13
julia> ans + I
2×2 Matrix{Int64}:
8 0
0 14
julia> I(2)
2×2 Diagonal{Bool, Vector{Bool}}:
1 ⋅
⋅ 1
Una matriz de una columna no se trata como un vector, sino que llama al método Diagonal(A::AbstractMatrix)
que extrae diag(A)
de 1 elemento:
julia> A = transpose([7.0 13.0])
2×1 transpose(::Matrix{Float64}) con el tipo de elemento Float64:
7.0
13.0
julia> Diagonal(A)
1×1 Diagonal{Float64, Vector{Float64}}:
7.0
Diagonal(A::AbstractMatrix)
Construye una matriz a partir de la diagonal principal de A
. La matriz de entrada A
puede ser rectangular, pero la salida será cuadrada.
Ejemplos
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> D = Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
1 ⋅
⋅ 4
julia> A = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
1 2 3
4 5 6
julia> Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
1 ⋅
⋅ 5
Diagonal{T}(undef, n)
Construye un Diagonal{T}
no inicializado de longitud n
. Ver undef
.
LinearAlgebra.Bidiagonal
— TypeBidiagonal(dv::V, ev::V, uplo::Symbol) donde V <: AbstractVector
Construye una matriz bidiagonal superior (uplo=:U
) o inferior (uplo=:L
) utilizando los vectores diagonales dados (dv
) y off-diagonales (ev
). El resultado es de tipo Bidiagonal
y proporciona solucionadores lineales especializados eficientes, pero puede ser convertido en una matriz regular con convert(Array, _)
(o Array(_)
para abreviar). La longitud de ev
debe ser una menos que la longitud de dv
.
Ejemplos
julia> dv = [1, 2, 3, 4]
4-element Vector{Int64}:
1
2
3
4
julia> ev = [7, 8, 9]
3-element Vector{Int64}:
7
8
9
julia> Bu = Bidiagonal(dv, ev, :U) # ev está en la primera superdiagonal
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 7 ⋅ ⋅
⋅ 2 8 ⋅
⋅ ⋅ 3 9
⋅ ⋅ ⋅ 4
julia> Bl = Bidiagonal(dv, ev, :L) # ev está en la primera subdiagonal
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
7 2 ⋅ ⋅
⋅ 8 3 ⋅
⋅ ⋅ 9 4
Bidiagonal(A, uplo::Symbol)
Construye una matriz Bidiagonal
a partir de la diagonal principal de A
y su primera superdiagonal (si uplo=:U
) o subdiagonal (si uplo=:L
).
Ejemplos
julia> A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]
4×4 Matrix{Int64}:
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
julia> Bidiagonal(A, :U) # contiene la diagonal principal y la primera superdiagonal de A
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 1 ⋅ ⋅
⋅ 2 2 ⋅
⋅ ⋅ 3 3
⋅ ⋅ ⋅ 4
julia> Bidiagonal(A, :L) # contiene la diagonal principal y la primera subdiagonal de A
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
2 2 ⋅ ⋅
⋅ 3 3 ⋅
⋅ ⋅ 4 4
LinearAlgebra.SymTridiagonal
— TypeSymTridiagonal(dv::V, ev::V) donde V <: AbstractVector
Construye una matriz tridiagonal simétrica a partir de la diagonal (dv
) y la primera sub/super-diagonal (ev
), respectivamente. El resultado es de tipo SymTridiagonal
y proporciona solucionadores de eigenvalores especializados y eficientes, pero puede ser convertido en una matriz regular con convert(Array, _)
(o Array(_)
para abreviar).
Para las matrices de bloques SymTridiagonal
, los elementos de dv
son simetrizados. El argumento ev
se interpreta como la superdiagonal. Los bloques de la subdiagonal son la transposición (materializada) de los bloques correspondientes de la superdiagonal.
Ejemplos
julia> dv = [1, 2, 3, 4]
4-element Vector{Int64}:
1
2
3
4
julia> ev = [7, 8, 9]
3-element Vector{Int64}:
7
8
9
julia> SymTridiagonal(dv, ev)
4×4 SymTridiagonal{Int64, Vector{Int64}}:
1 7 ⋅ ⋅
7 2 8 ⋅
⋅ 8 3 9
⋅ ⋅ 9 4
julia> A = SymTridiagonal(fill([1 2; 3 4], 3), fill([1 2; 3 4], 2));
julia> A[1,1]
2×2 Symmetric{Int64, Matrix{Int64}}:
1 2
2 4
julia> A[1,2]
2×2 Matrix{Int64}:
1 2
3 4
julia> A[2,1]
2×2 Matrix{Int64}:
1 3
2 4
SymTridiagonal(A::AbstractMatrix)
Construye una matriz tridiagonal simétrica a partir de la diagonal y la primera superdiagonal de la matriz simétrica A
.
Ejemplos
julia> A = [1 2 3; 2 4 5; 3 5 6]
3×3 Matrix{Int64}:
1 2 3
2 4 5
3 5 6
julia> SymTridiagonal(A)
3×3 SymTridiagonal{Int64, Vector{Int64}}:
1 2 ⋅
2 4 5
⋅ 5 6
julia> B = reshape([[1 2; 2 3], [1 2; 3 4], [1 3; 2 4], [1 2; 2 3]], 2, 2);
julia> SymTridiagonal(B)
2×2 SymTridiagonal{Matrix{Int64}, Vector{Matrix{Int64}}}:
[1 2; 2 3] [1 3; 2 4]
[1 2; 3 4] [1 2; 2 3]
LinearAlgebra.Tridiagonal
— TypeTridiagonal(dl::V, d::V, du::V) donde V <: AbstractVector
Construye una matriz tridiagonal a partir de la primera subdiagonal, diagonal y primera superdiagonal, respectivamente. El resultado es de tipo Tridiagonal
y proporciona solucionadores lineales especializados eficientes, pero puede convertirse en una matriz regular con convert(Array, _)
(o Array(_)
para abreviar). Las longitudes de dl
y du
deben ser una menos que la longitud de d
.
La subdiagonal dl
y la superdiagonal du
no deben estar aliasadas entre sí. Si se detecta aliasing, el constructor utilizará una copia de du
como su argumento.
Ejemplos
julia> dl = [1, 2, 3];
julia> du = [4, 5, 6];
julia> d = [7, 8, 9, 0];
julia> Tridiagonal(dl, d, du)
4×4 Tridiagonal{Int64, Vector{Int64}}:
7 4 ⋅ ⋅
1 8 5 ⋅
⋅ 2 9 6
⋅ ⋅ 3 0
Tridiagonal(A)
Construye una matriz tridiagonal a partir de la primera sub-diagonal, la diagonal y la primera super-diagonal de la matriz A
.
Ejemplos
julia> A = [1 2 3 4; 1 2 3 4; 1 2 3 4; 1 2 3 4]
4×4 Matrix{Int64}:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
julia> Tridiagonal(A)
4×4 Tridiagonal{Int64, Vector{Int64}}:
1 2 ⋅ ⋅
1 2 3 ⋅
⋅ 2 3 4
⋅ ⋅ 3 4
LinearAlgebra.Symmetric
— TypeSimétrico(A::AbstractMatrix, uplo::Symbol=:U)
Construye una vista Simétrico
del triángulo superior (si uplo = :U
) o inferior (si uplo = :L
) de la matriz A
.
Las vistas Simétrico
son principalmente útiles para matrices simétricas reales, para las cuales se habilitan algoritmos especializados (por ejemplo, para problemas de autovalores) para los tipos Simétrico
. Más generalmente, véase también Hermitiano(A)
para matrices hermitianas A == A'
, que es efectivamente equivalente a Simétrico
para matrices reales, pero también es útil para matrices complejas. (Mientras que las matrices Simétrico
complejas son compatibles, tienen pocos o ningún algoritmo especializado).
Para calcular la parte simétrica de una matriz real, o más generalmente la parte hermitiana (A + A') / 2
de una matriz real o compleja A
, use hermitianpart
.
Ejemplos
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> Supper = Simétrico(A)
3×3 Simétrico{Int64, Matrix{Int64}}:
1 2 3
2 5 6
3 6 9
julia> Slower = Simétrico(A, :L)
3×3 Simétrico{Int64, Matrix{Int64}}:
1 4 7
4 5 8
7 8 9
julia> hermitianpart(A)
3×3 Hermitiano{Float64, Matrix{Float64}}:
1.0 3.0 5.0
3.0 5.0 7.0
5.0 7.0 9.0
Tenga en cuenta que Supper
no será igual a Slower
a menos que A
sea simétrica (por ejemplo, si A == transpose(A)
).
LinearAlgebra.Hermitian
— TypeHermitiano(A::AbstractMatrix, uplo::Symbol=:U)
Construye una vista Hermitiano
del triángulo superior (si uplo = :U
) o inferior (si uplo = :L
) de la matriz A
.
Para calcular la parte hermitiana de A
, usa hermitianpart
.
Ejemplos
julia> A = [1 2+2im 3-3im; 4 5 6-6im; 7 8+8im 9]
3×3 Matrix{Complex{Int64}}:
1+0im 2+2im 3-3im
4+0im 5+0im 6-6im
7+0im 8+8im 9+0im
julia> Hupper = Hermitiano(A)
3×3 Hermitiano{Complex{Int64}, Matrix{Complex{Int64}}}:
1+0im 2+2im 3-3im
2-2im 5+0im 6-6im
3+3im 6+6im 9+0im
julia> Hlower = Hermitiano(A, :L)
3×3 Hermitiano{Complex{Int64}, Matrix{Complex{Int64}}}:
1+0im 4+0im 7+0im
4+0im 5+0im 8-8im
7+0im 8+8im 9+0im
julia> hermitianpart(A)
3×3 Hermitiano{ComplexF64, Matrix{ComplexF64}}:
1.0+0.0im 3.0+1.0im 5.0-1.5im
3.0-1.0im 5.0+0.0im 7.0-7.0im
5.0+1.5im 7.0+7.0im 9.0+0.0im
Ten en cuenta que Hupper
no será igual a Hlower
a menos que A
sea en sí misma hermitiana (por ejemplo, si A == adjoint(A)
).
Todas las partes no reales de la diagonal serán ignoradas.
Hermitiano(fill(complex(1,1), 1, 1)) == fill(1, 1, 1)
LinearAlgebra.LowerTriangular
— TypeLowerTriangular(A::AbstractMatrix)
Construye una vista LowerTriangular
de la matriz A
.
Ejemplos
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> LowerTriangular(A)
3×3 LowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 5.0 ⋅
7.0 8.0 9.0
LinearAlgebra.UpperTriangular
— TypeUpperTriangular(A::AbstractMatrix)
Construye una vista UpperTriangular
de la matriz A
.
Ejemplos
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UpperTriangular(A)
3×3 UpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 5.0 6.0
⋅ ⋅ 9.0
LinearAlgebra.UnitLowerTriangular
— TypeUnitLowerTriangular(A::AbstractMatrix)
Construye una vista UnitLowerTriangular
de la matriz A
. Tal vista tiene el oneunit
del eltype
de A
en su diagonal.
Ejemplos
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitLowerTriangular(A)
3×3 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 1.0 ⋅
7.0 8.0 1.0
LinearAlgebra.UnitUpperTriangular
— TypeUnitUpperTriangular(A::AbstractMatrix)
Construye una vista UnitUpperTriangular
de la matriz A
. Tal vista tiene el oneunit
del eltype
de A
en su diagonal.
Ejemplos
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitUpperTriangular(A)
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 1.0 6.0
⋅ ⋅ 1.0
LinearAlgebra.UpperHessenberg
— TypeUpperHessenberg(A::AbstractMatrix)
Construye una vista UpperHessenberg
de la matriz A
. Las entradas de A
por debajo de la primera subdiagonal son ignoradas.
Este tipo fue añadido en Julia 1.3.
Se implementan algoritmos eficientes para H \ b
, det(H)
, y similares.
Consulta también la función hessenberg
para factorizar cualquier matriz en una matriz superior de Hessenberg similar.
Si F::Hessenberg
es el objeto de factorización, la matriz unitaria se puede acceder con F.Q
y la matriz de Hessenberg con F.H
. Cuando se extrae Q
, el tipo resultante es el objeto HessenbergQ
, y puede ser convertido a una matriz regular con convert(Array, _)
(o Array(_)
para abreviar).
Iterar la descomposición produce los factores F.Q
y F.H
.
Ejemplos
julia> A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
4×4 Matrix{Int64}:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
julia> UpperHessenberg(A)
4×4 UpperHessenberg{Int64, Matrix{Int64}}:
1 2 3 4
5 6 7 8
⋅ 10 11 12
⋅ ⋅ 15 16
LinearAlgebra.UniformScaling
— TypeUniformScaling{T<:Number}
Operador de escalado uniforme de tamaño genérico definido como un escalar multiplicado por el operador identidad, λ*I
. Aunque sin un size
explícito, actúa de manera similar a una matriz en muchos casos e incluye soporte para algunos índices. Ver también I
.
La indexación utilizando rangos está disponible a partir de Julia 1.6.
Ejemplos
julia> J = UniformScaling(2.)
UniformScaling{Float64}
2.0*I
julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> J*A
2×2 Matrix{Float64}:
2.0 4.0
6.0 8.0
julia> J[1:2, 1:2]
2×2 Matrix{Float64}:
2.0 0.0
0.0 2.0
LinearAlgebra.I
— ConstantI
Un objeto del tipo UniformScaling
, que representa una matriz identidad de cualquier tamaño.
Ejemplos
julia> fill(1, (5,6)) * I == fill(1, (5,6))
true
julia> [1 2im 3; 1im 2 3] * I
2×3 Matrix{Complex{Int64}}:
1+0im 0+2im 3+0im
0+1im 2+0im 3+0im
LinearAlgebra.UniformScaling
— Method(I::UniformScaling)(n::Integer)
Construye una matriz Diagonal
a partir de un UniformScaling
.
Este método está disponible a partir de Julia 1.2.
Ejemplos
julia> I(3)
3×3 Diagonal{Bool, Vector{Bool}}:
1 ⋅ ⋅
⋅ 1 ⋅
⋅ ⋅ 1
julia> (0.7*I)(3)
3×3 Diagonal{Float64, Vector{Float64}}:
0.7 ⋅ ⋅
⋅ 0.7 ⋅
⋅ ⋅ 0.7
LinearAlgebra.Factorization
— TypeLinearAlgebra.Factorization
Tipo abstracto para factorizaciones de matrices también conocidas como descomposiciones de matrices. Consulta la documentación en línea para obtener una lista de las factorizaciones de matrices disponibles.
LinearAlgebra.LU
— TypeLU <: Factorización
Tipo de factorización de matriz de la factorización LU
de una matriz cuadrada A
. Este es el tipo de retorno de lu
, la función de factorización de matriz correspondiente.
Los componentes individuales de la factorización F::LU
se pueden acceder a través de getproperty
:
Componente | Descripción |
---|---|
F.L | Parte L (triangular inferior unitario) de LU |
F.U | Parte U (triangular superior) de LU |
F.p | Permutación Vector (derecha) |
F.P | Permutación Matrix (derecha) |
Iterar sobre la factorización produce los componentes F.L
, F.U
y F.p
.
Ejemplos
julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U factor:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> F.L * F.U == A[F.p, :]
true
julia> l, u, p = lu(A); # desestructuración a través de la iteración
julia> l == F.L && u == F.U && p == F.p
true
LinearAlgebra.lu
— Functionlu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU
Calcula la factorización LU de una matriz dispersa A
.
Para A
dispersa con tipo de elemento real o complejo, el tipo de retorno de F
es UmfpackLU{Tv, Ti}
, donde Tv
= Float64
o ComplexF64
respectivamente y Ti
es un tipo entero (Int32
o Int64
).
Cuando check = true
, se lanza un error si la descomposición falla. Cuando check = false
, la responsabilidad de verificar la validez de la descomposición (a través de issuccess
) recae en el usuario.
El vector de permutación q
puede ser un vector de permutación o nothing
. Si no se proporciona un vector de permutación o q
es nothing
, se utiliza el predeterminado de UMFPACK. Si la permutación no es basada en cero, se realiza una copia basada en cero.
El vector control
tiene como configuración predeterminada la configuración predeterminada del paquete SparseArrays de Julia para UMFPACK (NB: esto se modifica de los predeterminados de UMFPACK para deshabilitar el refinamiento iterativo), pero se puede cambiar pasando un vector de longitud UMFPACK_CONTROL
, consulta el manual de UMFPACK para posibles configuraciones. Por ejemplo, para reactivar el refinamiento iterativo:
umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # leer la configuración predeterminada de Julia para una matriz dispersa Float64
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # opcional - mostrar valores
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # reactivar el refinamiento iterativo (2 es el máximo de pasos de refinamiento iterativo predeterminado de UMFPACK)
Alu = lu(A; control = umfpack_control)
x = Alu \ b # resolver Ax = b, incluyendo el refinamiento iterativo de UMFPACK
Los componentes individuales de la factorización F
se pueden acceder mediante indexación:
Componente | Descripción |
---|---|
L | parte L (triangular inferior) de LU |
U | parte U (triangular superior) de LU |
p | permutación derecha Vector |
q | permutación izquierda Vector |
Rs | Vector de factores de escalado |
: | componentes (L,U,p,q,Rs) |
La relación entre F
y A
es
F.L*F.U == (F.Rs .* A)[F.p, F.q]
F
además soporta las siguientes funciones:
Consulta también lu!
lu(A::AbstractSparseMatrixCSC)
utiliza la biblioteca UMFPACK[ACM832] que es parte de SuiteSparse. Como esta biblioteca solo admite matrices dispersas con elementos Float64
o ComplexF64
, lu
convierte A
en una copia que es de tipo SparseMatrixCSC{Float64}
o SparseMatrixCSC{ComplexF64}
según corresponda.
lu(A, pivot = RowMaximum(); check = true, allowsingular = false) -> F::LU
Calcula la factorización LU de A
.
Cuando check = true
, se lanza un error si la descomposición falla. Cuando check = false
, la responsabilidad de verificar la validez de la descomposición (a través de issuccess
) recae en el usuario.
Por defecto, con check = true
, también se lanza un error cuando la descomposición produce factores válidos, pero el factor triangular superior U
es deficiente en rango. Esto se puede cambiar pasando allowsingular = true
.
En la mayoría de los casos, si A
es un subtipo S
de AbstractMatrix{T}
con un tipo de elemento T
que soporta +
, -
, *
y /
, el tipo de retorno es LU{T,S{T}}
.
En general, la factorización LU implica una permutación de las filas de la matriz (correspondiente a la salida F.p
descrita a continuación), conocida como "pivoting" (porque corresponde a elegir qué fila contiene el "pivot", la entrada diagonal de F.U
). Una de las siguientes estrategias de pivoting se puede seleccionar a través del argumento opcional pivot
:
RowMaximum()
(por defecto): la estrategia de pivoting estándar; el pivot corresponde al elemento de valor absoluto máximo entre las filas restantes a factorizar. Esta estrategia de pivoting requiere que el tipo de elemento también soporteabs
y<
. (Esta es generalmente la única opción numéricamente estable para matrices de punto flotante.)RowNonZero()
: el pivot corresponde al primer elemento no cero entre las filas restantes a factorizar. (Esto corresponde a la elección típica en cálculos manuales, y también es útil para tipos de números algebraicos más generales que soportaniszero
pero noabs
o<
.)NoPivot()
: pivoting desactivado (fallará si se encuentra una entrada cero en una posición de pivot, incluso cuandoallowsingular = true
).
Los componentes individuales de la factorización F
se pueden acceder a través de getproperty
:
Componente | Descripción |
---|---|
F.L | L (parte triangular inferior) de LU |
F.U | U (parte triangular superior) de LU |
F.p | Permutación Vector (derecha) |
F.P | Permutación Matrix (derecha) |
Iterar sobre la factorización produce los componentes F.L
, F.U
y F.p
.
La relación entre F
y A
es
F.L*F.U == A[F.p, :]
F
además soporta las siguientes funciones:
Función soportada | LU | LU{T,Tridiagonal{T}} |
---|---|---|
/ | ✓ | |
\ | ✓ | ✓ |
inv | ✓ | ✓ |
det | ✓ | ✓ |
logdet | ✓ | ✓ |
logabsdet | ✓ | ✓ |
size | ✓ | ✓ |
El argumento de palabra clave allowsingular
se agregó en Julia 1.11.
Ejemplos
julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U factor:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> F.L * F.U == A[F.p, :]
true
julia> l, u, p = lu(A); # desestructuración a través de la iteración
julia> l == F.L && u == F.U && p == F.p
true
julia> lu([1 2; 1 2], allowsingular = true)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
1.0 1.0
U factor (deficiente en rango):
2×2 Matrix{Float64}:
1.0 2.0
0.0 0.0
LinearAlgebra.lu!
— Functionlu!(F::UmfpackLU, A::AbstractSparseMatrixCSC; check=true, reuse_symbolic=true, q=nothing) -> F::UmfpackLU
Calcula la factorización LU de una matriz dispersa A
, reutilizando la factorización simbólica de una factorización LU ya existente almacenada en F
. A menos que reuse_symbolic
se establezca en falso, la matriz dispersa A
debe tener un patrón de no ceros idéntico al de la matriz utilizada para crear la factorización LU F
, de lo contrario se lanzará un error. Si el tamaño de A
y F
difiere, todos los vectores se redimensionarán en consecuencia.
Cuando check = true
, se lanza un error si la descomposición falla. Cuando check = false
, la responsabilidad de verificar la validez de la descomposición (a través de issuccess
) recae en el usuario.
La permutación q
puede ser un vector de permutación o nothing
. Si no se proporciona un vector de permutación o q
es nothing
, se utiliza el valor predeterminado de UMFPACK. Si la permutación no es basada en cero, se realiza una copia basada en cero.
Véase también lu
lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC)
utiliza la biblioteca UMFPACK que es parte de SuiteSparse. Como esta biblioteca solo admite matrices dispersas con elementos de Float64
o ComplexF64
, lu!
convertirá automáticamente los tipos a aquellos establecidos por la factorización LU o SparseMatrixCSC{ComplexF64}
según corresponda.
lu!
para UmfpackLU
requiere al menos Julia 1.5.
Ejemplos
julia> A = sparse(Float64[1.0 2.0; 0.0 3.0]);
julia> F = lu(A);
julia> B = sparse(Float64[1.0 1.0; 0.0 1.0]);
julia> lu!(F, B);
julia> F \ ones(2)
2-element Vector{Float64}:
0.0
1.0
lu!(A, pivot = RowMaximum(); check = true, allowsingular = false) -> LU
lu!
es lo mismo que lu
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia. Se lanza una excepción InexactError
si la factorización produce un número que no es representable por el tipo de elemento de A
, por ejemplo, para tipos enteros.
El argumento de palabra clave allowsingular
se agregó en Julia 1.11.
Ejemplos
julia> A = [4. 3.; 6. 3.]
2×2 Matrix{Float64}:
4.0 3.0
6.0 3.0
julia> F = lu!(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U factor:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> iA = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> lu!(iA)
ERROR: InexactError: Int64(0.6666666666666666)
Stacktrace:
[...]
LinearAlgebra.Cholesky
— TypeCholesky <: Factorización
Tipo de factorización de matriz de la factorización de Cholesky de una matriz densa simétrica/Hermítica definida positiva A
. Este es el tipo de retorno de cholesky
, la función de factorización de matriz correspondiente.
El factor triangular de Cholesky se puede obtener de la factorización F::Cholesky
a través de F.L
y F.U
, donde A ≈ F.U' * F.U ≈ F.L * F.L'
.
Las siguientes funciones están disponibles para objetos Cholesky
: size
, \
, inv
, det
, logdet
y isposdef
.
Iterar la descomposición produce los componentes L
y U
.
Ejemplos
julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
4.0 12.0 -16.0
12.0 37.0 -43.0
-16.0 -43.0 98.0
julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
2.0 ⋅ ⋅
6.0 1.0 ⋅
-8.0 5.0 3.0
julia> C.L * C.U == A
true
julia> l, u = C; # desestructuración a través de la iteración
julia> l == C.L && u == C.U
true
LinearAlgebra.CholeskyPivoted
— TypeCholeskyPivoted
Tipo de factorización de matriz de la factorización de Cholesky con pivoteo de una matriz densa simétrica/Hermítica positiva semidefinida A
. Este es el tipo de retorno de cholesky(_, ::RowMaximum)
, la función de factorización de matriz correspondiente.
El factor triangular de Cholesky se puede obtener de la factorización F::CholeskyPivoted
a través de F.L
y F.U
, y la permutación a través de F.p
, donde A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'
con Ur = F.U[1:F.rank, :]
y Lr = F.L[:, 1:F.rank]
, o alternativamente A ≈ Up' * Up ≈ Lp * Lp'
con Up = F.U[1:F.rank, invperm(F.p)]
y Lp = F.L[invperm(F.p), 1:F.rank]
.
Las siguientes funciones están disponibles para objetos CholeskyPivoted
: size
, \
, inv
, det
, y rank
.
Iterar la descomposición produce los componentes L
y U
.
Ejemplos
julia> X = [1.0, 2.0, 3.0, 4.0];
julia> A = X * X';
julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
4.0 2.0 3.0 1.0
⋅ 0.0 6.0 2.0
⋅ ⋅ 9.0 3.0
⋅ ⋅ ⋅ 1.0
permutation:
4-element Vector{Int64}:
4
2
3
1
julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true
julia> l, u = C; # destructuring via iteration
julia> l == C.L && u == C.U
true
LinearAlgebra.cholesky
— Functioncholesky(A, NoPivot(); check = true) -> Cholesky
Calcula la factorización de Cholesky de una matriz densa simétrica definida positiva A
y devuelve una Cholesky
factorización. La matriz A
puede ser una Symmetric
o Hermitian
AbstractMatrix
o una AbstractMatrix
perfectamente simétrica o hermítica.
El factor triangular de Cholesky se puede obtener de la factorización F
a través de F.L
y F.U
, donde A ≈ F.U' * F.U ≈ F.L * F.L'
.
Las siguientes funciones están disponibles para los objetos Cholesky
: size
, \
, inv
, det
, logdet
y isposdef
.
Si tienes una matriz A
que es ligeramente no hermítica debido a errores de redondeo en su construcción, envuélvela en Hermitian(A)
antes de pasarla a cholesky
para tratarla como perfectamente hermítica.
Cuando check = true
, se lanza un error si la descomposición falla. Cuando check = false
, la responsabilidad de verificar la validez de la descomposición (a través de issuccess
) recae en el usuario.
Ejemplos
julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
4.0 12.0 -16.0
12.0 37.0 -43.0
-16.0 -43.0 98.0
julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
2.0 6.0 -8.0
⋅ 1.0 5.0
⋅ ⋅ 3.0
julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
2.0 ⋅ ⋅
6.0 1.0 ⋅
-8.0 5.0 3.0
julia> C.L * C.U == A
true
cholesky(A, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted
Calcula la factorización de Cholesky pivotada de una matriz densa simétrica positiva semidefinida A
y devuelve una factorización CholeskyPivoted
. La matriz A
puede ser una Symmetric
o Hermitian
AbstractMatrix
o una AbstractMatrix
perfectamente simétrica o hermítica.
El factor triangular de Cholesky se puede obtener de la factorización F
a través de F.L
y F.U
, y la permutación a través de F.p
, donde A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'
con Ur = F.U[1:F.rank, :]
y Lr = F.L[:, 1:F.rank]
, o alternativamente A ≈ Up' * Up ≈ Lp * Lp'
con Up = F.U[1:F.rank, invperm(F.p)]
y Lp = F.L[invperm(F.p), 1:F.rank]
.
Las siguientes funciones están disponibles para objetos CholeskyPivoted
: size
, \
, inv
, det
, y rank
.
El argumento tol
determina la tolerancia para determinar el rango. Para valores negativos, la tolerancia es la precisión de la máquina.
Si tienes una matriz A
que es ligeramente no hermítica debido a errores de redondeo en su construcción, envuélvela en Hermitian(A)
antes de pasarla a cholesky
para tratarla como perfectamente hermítica.
Cuando check = true
, se lanza un error si la descomposición falla. Cuando check = false
, la responsabilidad de verificar la validez de la descomposición (a través de issuccess
) recae en el usuario.
Ejemplos
julia> X = [1.0, 2.0, 3.0, 4.0];
julia> A = X * X';
julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
4.0 2.0 3.0 1.0
⋅ 0.0 6.0 2.0
⋅ ⋅ 9.0 3.0
⋅ ⋅ ⋅ 1.0
permutation:
4-element Vector{Int64}:
4
2
3
1
julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true
julia> l, u = C; # destructuring via iteration
julia> l == C.L && u == C.U
true
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor
Calcula la factorización de Cholesky de una matriz dispersa definida positiva A
. A
debe ser una SparseMatrixCSC
o una vista Symmetric
/Hermitian
de una SparseMatrixCSC
. Ten en cuenta que incluso si A
no tiene la etiqueta de tipo, aún debe ser simétrica o hermítica. Si no se proporciona perm
, se utiliza una permutación que reduce el llenado. F = cholesky(A)
se usa con mayor frecuencia para resolver sistemas de ecuaciones con F\b
, pero también se definen los métodos diag
, det
y logdet
para F
. También puedes extraer factores individuales de F
, usando F.L
. Sin embargo, dado que el pivoteo está activado por defecto, la factorización se representa internamente como A == P'*L*L'*P
con una matriz de permutación P
; usar solo L
sin tener en cuenta P
dará respuestas incorrectas. Para incluir los efectos de la permutación, es preferible extraer factores "combinados" como PtL = F.PtL
(el equivalente de P'*L
) y LtP = F.UP
(el equivalente de L'*P
).
Cuando check = true
, se lanza un error si la descomposición falla. Cuando check = false
, la responsabilidad de verificar la validez de la descomposición (a través de issuccess
) recae en el usuario.
Establecer el argumento de palabra clave opcional shift
calcula la factorización de A+shift*I
en lugar de A
. Si se proporciona el argumento perm
, debe ser una permutación de 1:size(A,1)
que da el orden a utilizar (en lugar del orden AMD predeterminado de CHOLMOD).
Ejemplos
En el siguiente ejemplo, la permutación que reduce el llenado utilizada es [3, 2, 1]
. Si perm
se establece en 1:3
para forzar ninguna permutación, el número de elementos no nulos en el factor es 6.
julia> A = [2 1 1; 1 2 0; 1 0 2]
3×3 Matrix{Int64}:
2 1 1
1 2 0
1 0 2
julia> C = cholesky(sparse(A))
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type: LLt
method: simplicial
maxnnz: 5
nnz: 5
success: true
julia> C.p
3-element Vector{Int64}:
3
2
1
julia> L = sparse(C.L);
julia> Matrix(L)
3×3 Matrix{Float64}:
1.41421 0.0 0.0
0.0 1.41421 0.0
0.707107 0.707107 1.0
julia> L * L' ≈ A[C.p, C.p]
true
julia> P = sparse(1:3, C.p, ones(3))
3×3 SparseMatrixCSC{Float64, Int64} con 3 entradas almacenadas:
⋅ ⋅ 1.0
⋅ 1.0 ⋅
1.0 ⋅ ⋅
julia> P' * L * L' * P ≈ A
true
julia> C = cholesky(sparse(A), perm=1:3)
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type: LLt
method: simplicial
maxnnz: 6
nnz: 6
success: true
julia> L = sparse(C.L);
julia> Matrix(L)
3×3 Matrix{Float64}:
1.41421 0.0 0.0
0.707107 1.22474 0.0
0.707107 -0.408248 1.1547
julia> L * L' ≈ A
true
Este método utiliza la biblioteca CHOLMOD[ACM887][DavisHager2009] de SuiteSparse. CHOLMOD solo admite tipos reales o complejos en precisión simple o doble. Las matrices de entrada que no son de esos tipos de elementos se convertirán a estos tipos según sea apropiado.
Muchas otras funciones de CHOLMOD están envueltas pero no exportadas del módulo Base.SparseArrays.CHOLMOD
.
LinearAlgebra.cholesky!
— Functioncholesky!(A::AbstractMatrix, NoPivot(); check = true) -> Cholesky
Lo mismo que cholesky
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia. Se lanza una excepción InexactError
si la factorización produce un número que no se puede representar con el tipo de elemento de A
, por ejemplo, para tipos enteros.
Ejemplos
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> cholesky!(A)
ERROR: InexactError: Int64(6.782329983125268)
Stacktrace:
[...]
cholesky!(A::AbstractMatrix, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted
Lo mismo que cholesky
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia. Se lanza una excepción InexactError
si la factorización produce un número que no es representable por el tipo de elemento de A
, por ejemplo, para tipos enteros.
cholesky!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor
Calcula la factorización de Cholesky ($LL'$) de A
, reutilizando la factorización simbólica F
. A
debe ser una SparseMatrixCSC
o una vista Symmetric
/ Hermitian
de una SparseMatrixCSC
. Ten en cuenta que, incluso si A
no tiene la etiqueta de tipo, debe seguir siendo simétrica o hermitiana.
Consulta también cholesky
.
Este método utiliza la biblioteca CHOLMOD de SuiteSparse, que solo admite tipos reales o complejos en precisión simple o doble. Las matrices de entrada que no sean de esos tipos de elemento se convertirán a estos tipos según sea apropiado.
LinearAlgebra.lowrankupdate
— Functionlowrankupdate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Actualiza una factorización de Cholesky C
con el vector v
. Si A = C.U'C.U
entonces CC = cholesky(C.U'C.U + v*v')
pero el cálculo de CC
solo utiliza O(n^2)
operaciones.
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
Obtiene una factorización LDLt
de A + C*C'
dada una factorización LDLt
o LLt
F
de A
.
El factor devuelto es siempre una factorización LDLt
.
Véase también lowrankupdate!
, lowrankdowndate
, lowrankdowndate!
.
LinearAlgebra.lowrankdowndate
— Functionlowrankdowndate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Actualiza hacia abajo una factorización de Cholesky C
con el vector v
. Si A = C.U'C.U
entonces CC = cholesky(C.U'C.U - v*v')
pero el cálculo de CC
solo utiliza O(n^2)
operaciones.
lowrankdowndate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
Obtiene una factorización LDLt
de A + C*C'
dada una factorización LDLt
o LLt
F
de A
.
El factor devuelto es siempre una factorización LDLt
.
Véase también lowrankdowndate!
, lowrankupdate
, lowrankupdate!
.
LinearAlgebra.lowrankupdate!
— Functionlowrankupdate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Actualiza una factorización de Cholesky C
con el vector v
. Si A = C.U'C.U
entonces CC = cholesky(C.U'C.U + v*v')
pero el cálculo de CC
solo utiliza O(n^2)
operaciones. La factorización de entrada C
se actualiza en su lugar de modo que al salir C == CC
. El vector v
se destruye durante el cálculo.
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)
Actualiza una factorización LDLt
o LLt
F
de A
a una factorización de A + C*C'
.
Las factorizaciones LLt
se convierten en LDLt
.
Véase también lowrankupdate
, lowrankdowndate
, lowrankdowndate!
.
LinearAlgebra.lowrankdowndate!
— Functionlowrankdowndate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Realiza una actualización descendente de una factorización de Cholesky C
con el vector v
. Si A = C.U'C.U
entonces CC = cholesky(C.U'C.U - v*v')
pero el cálculo de CC
solo utiliza O(n^2)
operaciones. La factorización de entrada C
se actualiza en su lugar de tal manera que al salir C == CC
. El vector v
se destruye durante el cálculo.
lowrankdowndate!(F::CHOLMOD.Factor, C::AbstractArray)
Actualiza una factorización LDLt
o LLt
F
de A
a una factorización de A - C*C'
.
Las factorizaciones LLt
se convierten en LDLt
.
Véase también lowrankdowndate
, lowrankupdate
, lowrankupdate!
.
LinearAlgebra.LDLt
— TypeLDLt <: Factorización
Tipo de factorización de matriz de la factorización LDLt
de una matriz real SymTridiagonal
S
tal que S = L*Diagonal(d)*L'
, donde L
es una matriz UnitLowerTriangular
y d
es un vector. El uso principal de una factorización LDLt
F = ldlt(S)
es resolver el sistema de ecuaciones lineales Sx = b
con F\b
. Este es el tipo de retorno de ldlt
, la función de factorización de matriz correspondiente.
Los componentes individuales de la factorización F::LDLt
se pueden acceder a través de getproperty
:
Componente | Descripción |
---|---|
F.L | L (parte triangular inferior unitaria) de LDLt |
F.D | D (parte diagonal) de LDLt |
F.Lt | Lt (parte triangular superior unitaria) de LDLt |
F.d | valores diagonales de D como un Vector |
Ejemplos
julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 1.0 ⋅
1.0 4.0 2.0
⋅ 2.0 5.0
julia> F = ldlt(S)
LDLt{Float64, SymTridiagonal{Float64, Vector{Float64}}}
Factor L:
3×3 UnitLowerTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}:
1.0 ⋅ ⋅
0.333333 1.0 ⋅
0.0 0.545455 1.0
Factor D:
3×3 Diagonal{Float64, Vector{Float64}}:
3.0 ⋅ ⋅
⋅ 3.66667 ⋅
⋅ ⋅ 3.90909
LinearAlgebra.ldlt
— Functionldlt(S::SymTridiagonal) -> LDLt
Calcula una factorización LDLt
(es decir, $LDL^T$) de la matriz tridiagonal simétrica real S
tal que S = L*Diagonal(d)*L'
donde L
es una matriz triangular inferior unitaria y d
es un vector. El uso principal de una factorización LDLt
F = ldlt(S)
es resolver el sistema de ecuaciones lineales Sx = b
con F\b
.
Véase también bunchkaufman
para una factorización similar, pero con pivoteo, de matrices simétricas o hermitianas arbitrarias.
Ejemplos
julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 1.0 ⋅
1.0 4.0 2.0
⋅ 2.0 5.0
julia> ldltS = ldlt(S);
julia> b = [6., 7., 8.];
julia> ldltS \ b
3-element Vector{Float64}:
1.7906976744186047
0.627906976744186
1.3488372093023255
julia> S \ b
3-element Vector{Float64}:
1.7906976744186047
0.627906976744186
1.3488372093023255
ldlt(A::SparseMatrixCSC; shift = 0.0, check = true, perm=nothing) -> CHOLMOD.Factor
Calcula la factorización $LDL'$ de una matriz dispersa A
. A
debe ser una SparseMatrixCSC
o una vista Symmetric
/Hermitian
de una SparseMatrixCSC
. Ten en cuenta que, incluso si A
no tiene la etiqueta de tipo, aún debe ser simétrica o hermítica. Se utiliza una permutación que reduce el llenado. F = ldlt(A)
se usa con mayor frecuencia para resolver sistemas de ecuaciones A*x = b
con F\b
. El objeto de factorización devuelto F
también admite los métodos diag
, det
, logdet
y inv
. Puedes extraer factores individuales de F
usando F.L
. Sin embargo, dado que el pivoteo está activado por defecto, la factorización se representa internamente como A == P'*L*D*L'*P
con una matriz de permutación P
; usar solo L
sin tener en cuenta P
dará respuestas incorrectas. Para incluir los efectos de la permutación, generalmente es preferible extraer factores "combinados" como PtL = F.PtL
(el equivalente de P'*L
) y LtP = F.UP
(el equivalente de L'*P
). La lista completa de factores admitidos es :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP
.
Cuando check = true
, se lanza un error si la descomposición falla. Cuando check = false
, la responsabilidad de verificar la validez de la descomposición (a través de issuccess
) recae en el usuario.
Establecer el argumento de palabra clave opcional shift
calcula la factorización de A+shift*I
en lugar de A
. Si se proporciona el argumento perm
, debe ser una permutación de 1:size(A,1)
que da el orden a utilizar (en lugar del orden predeterminado AMD de CHOLMOD).
Este método utiliza la biblioteca CHOLMOD[ACM887][DavisHager2009] de SuiteSparse. CHOLMOD solo admite tipos reales o complejos en precisión simple o doble. Las matrices de entrada que no son de esos tipos de elementos se convertirán a estos tipos según sea apropiado.
Muchas otras funciones de CHOLMOD están envueltas pero no exportadas del módulo Base.SparseArrays.CHOLMOD
.
LinearAlgebra.ldlt!
— Functionldlt!(S::SymTridiagonal) -> LDLt
Igual que ldlt
, pero ahorra espacio al sobrescribir la entrada S
, en lugar de crear una copia.
Ejemplos
julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 1.0 ⋅
1.0 4.0 2.0
⋅ 2.0 5.0
julia> ldltS = ldlt!(S);
julia> ldltS === S
false
julia> S
3×3 SymTridiagonal{Float64, Vector{Float64}}:
3.0 0.333333 ⋅
0.333333 3.66667 0.545455
⋅ 0.545455 3.90909
ldlt!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor
Calcula la factorización $LDL'$ de A
, reutilizando la factorización simbólica F
. A
debe ser una SparseMatrixCSC
o una vista Symmetric
/Hermitian
de una SparseMatrixCSC
. Ten en cuenta que, incluso si A
no tiene la etiqueta de tipo, aún debe ser simétrica o hermitiana.
Consulta también ldlt
.
Este método utiliza la biblioteca CHOLMOD de SuiteSparse, que solo admite tipos reales o complejos en precisión simple o doble. Las matrices de entrada que no sean de esos tipos de elementos se convertirán a estos tipos según sea apropiado.
LinearAlgebra.QR
— TypeQR <: Factorización
Una factorización de matriz QR almacenada en un formato empaquetado, típicamente obtenida de qr
. Si $A$ es una matriz m
×n
, entonces
\[A = Q R\]
donde $Q$ es una matriz ortogonal/unitaria y $R$ es triangular superior. La matriz $Q$ se almacena como una secuencia de reflectores de Householder $v_i$ y coeficientes $\tau_i$ donde:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
Iterar la descomposición produce los componentes Q
y R
.
El objeto tiene dos campos:
factors
es una matrizm
×n
.- La parte triangular superior contiene los elementos de $R$, es decir,
R = triu(F.factors)
para un objetoQR
F
. - La parte subdiagonal contiene los reflectores $v_i$ almacenados en un formato empaquetado donde $v_i$ es la $i$-ésima columna de la matriz
V = I + tril(F.factors, -1)
.
- La parte triangular superior contiene los elementos de $R$, es decir,
τ
es un vector de longitudmin(m,n)
que contiene los coeficientes $au_i$.
LinearAlgebra.QRCompactWY
— TypeQRCompactWY <: Factorization
Una factorización de matriz QR almacenada en un formato compacto bloqueado, típicamente obtenida de qr
. Si $A$ es una matriz m
×n
, entonces
\[A = Q R\]
donde $Q$ es una matriz ortogonal/unitaria y $R$ es triangular superior. Es similar al formato QR
excepto que la matriz ortogonal/unitaria $Q$ se almacena en formato Compact WY [Schreiber1989]. Para el tamaño de bloque $n_b$, se almacena como una matriz trapezoidal inferior m
×n
$V$ y una matriz $T = (T_1 \; T_2 \; ... \; T_{b-1} \; T_b')$ compuesta de $b = \lceil \min(m,n) / n_b \rceil$ matrices triangulares superiores $T_j$ de tamaño $n_b$×$n_b$ ($j = 1, ..., b-1$) y una matriz trapezoidal superior $n_b$×$\min(m,n) - (b-1) n_b$ $T_b'$ ($j=b$) cuya parte cuadrada superior se denota con $T_b$ satisfaciendo
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T) = \prod_{j=1}^{b} (I - V_j T_j V_j^T)\]
de modo que $v_i$ es la $i$-ésima columna de $V$, $\tau_i$ es el $i$-ésimo elemento de [diag(T_1); diag(T_2); …; diag(T_b)]
, y $(V_1 \; V_2 \; ... \; V_b)$ es el bloque izquierdo m
×min(m, n)
de $V$. Cuando se construye utilizando qr
, el tamaño del bloque está dado por $n_b = \min(m, n, 36)$.
Iterar la descomposición produce los componentes Q
y R
.
El objeto tiene dos campos:
factors
, como en el tipoQR
, es una matrizm
×n
.- La parte triangular superior contiene los elementos de $R$, es decir,
R = triu(F.factors)
para un objetoQR
F
. - La parte subdiagonal contiene los reflectores $v_i$ almacenados en un formato empaquetado tal que
V = I + tril(F.factors, -1)
.
- La parte triangular superior contiene los elementos de $R$, es decir,
T
es una matriz de $n_b$ por $\min(m,n)$ como se describió anteriormente. Se ignoran los elementos subdiagonales para cada matriz triangular $T_j$.
Este formato no debe confundirse con la representación WY más antigua [Bischof1987].
LinearAlgebra.QRPivoted
— TypeQRPivoted <: Factorization
Una factorización de matriz QR con pivoteo de columnas en un formato empaquetado, típicamente obtenida de qr
. Si $A$ es una matriz m
×n
, entonces
\[A P = Q R\]
donde $P$ es una matriz de permutación, $Q$ es una matriz ortogonal/unitaria y $R$ es triangular superior. La matriz $Q$ se almacena como una secuencia de reflectores de Householder:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
Iterar la descomposición produce los componentes Q
, R
y p
.
El objeto tiene tres campos:
factors
es una matrizm
×n
.- La parte triangular superior contiene los elementos de $R$, es decir,
R = triu(F.factors)
para un objetoQR
F
. - La parte subdiagonal contiene los reflectores $v_i$ almacenados en un formato empaquetado donde $v_i$ es la $i$-ésima columna de la matriz
V = I + tril(F.factors, -1)
.
- La parte triangular superior contiene los elementos de $R$, es decir,
τ
es un vector de longitudmin(m,n)
que contiene los coeficientes $au_i$.jpvt
es un vector entero de longitudn
correspondiente a la permutación $P$.
LinearAlgebra.qr
— Functionqr(A::SparseMatrixCSC; tol=_default_tol(A), ordering=ORDERING_DEFAULT) -> QRSparse
Calcula la factorización QR
de una matriz dispersa A
. Se utilizan permutaciones de filas y columnas que reducen el llenado de manera que F.R = F.Q'*A[F.prow,F.pcol]
. La aplicación principal de este tipo es resolver problemas de mínimos cuadrados o subdeterminado con \
. La función llama a la biblioteca C SPQR[ACM933].
qr(A::SparseMatrixCSC)
utiliza la biblioteca SPQR que es parte de SuiteSparse. Dado que esta biblioteca solo admite matrices dispersas con elementos de tipo Float64
o ComplexF64
, a partir de Julia v1.4 qr
convierte A
en una copia que es de tipo SparseMatrixCSC{Float64}
o SparseMatrixCSC{ComplexF64}
según corresponda.
Ejemplos
julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} con 4 entradas almacenadas:
1.0 ⋅
1.0 ⋅
⋅ 1.0
⋅ 1.0
julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Factor Q:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
Factor R:
2×2 SparseMatrixCSC{Float64, Int64} con 2 entradas almacenadas:
-1.41421 ⋅
⋅ -1.41421
Permutación de filas:
Vector de 4 elementos{Int64}:
1
3
4
2
Permutación de columnas:
Vector de 2 elementos{Int64}:
1
2
qr(A, pivot = NoPivot(); blocksize) -> F
Calcula la factorización QR de la matriz A
: una matriz ortogonal (o unitaria si A
es de valor complejo) Q
, y una matriz triangular superior R
tal que
\[A = Q R\]
El objeto devuelto F
almacena la factorización en un formato empaquetado:
- si
pivot == ColumnNorm()
entoncesF
es un objetoQRPivoted
, - de lo contrario, si el tipo de elemento de
A
es un tipo BLAS (Float32
,Float64
,ComplexF32
oComplexF64
), entoncesF
es un objetoQRCompactWY
, - de lo contrario,
F
es un objetoQR
.
Los componentes individuales de la descomposición F
se pueden recuperar a través de accesores de propiedades:
F.Q
: la matriz ortogonal/unitariaQ
F.R
: la matriz triangular superiorR
F.p
: el vector de permutación del pivote (QRPivoted
solo)F.P
: la matriz de permutación del pivote (QRPivoted
solo)
Cada referencia al factor triangular superior a través de F.R
asigna un nuevo arreglo. Por lo tanto, es aconsejable almacenar ese arreglo, digamos, con R = F.R
y continuar trabajando con R
.
Iterar la descomposición produce los componentes Q
, R
, y si existe p
.
Las siguientes funciones están disponibles para los objetos QR
: inv
, size
, y \
. Cuando A
es rectangular, \
devolverá una solución de mínimos cuadrados y si la solución no es única, se devuelve la que tiene la norma más pequeña. Cuando A
no tiene rango completo, se requiere la factorización con pivoteo (por columna) para obtener una solución de norma mínima.
Se permite la multiplicación con respecto a Q
completo/cuadrado o no completo/cuadrado, es decir, tanto F.Q*F.R
como F.Q*A
son compatibles. Una matriz Q
se puede convertir en una matriz regular con Matrix
. Esta operación devuelve el factor Q "delgado", es decir, si A
es m
×n
con m>=n
, entonces Matrix(F.Q)
produce una matriz m
×n
con columnas ortonormales. Para recuperar el factor Q "completo", una matriz ortogonal m
×m
, usa F.Q*I
o collect(F.Q)
. Si m<=n
, entonces Matrix(F.Q)
produce una matriz ortogonal m
×m
.
El tamaño del bloque para la descomposición QR se puede especificar mediante el argumento de palabra clave blocksize :: Integer
cuando pivot == NoPivot()
y A isa StridedMatrix{<:BlasFloat}
. Se ignora cuando blocksize > minimum(size(A))
. Ver QRCompactWY
.
El argumento de palabra clave blocksize
requiere Julia 1.4 o posterior.
Ejemplos
julia> A = [3.0 -6.0; 4.0 -8.0; 0.0 1.0]
3×2 Matrix{Float64}:
3.0 -6.0
4.0 -8.0
0.0 1.0
julia> F = qr(A)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Factor Q: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
Factor R:
2×2 Matrix{Float64}:
-5.0 10.0
0.0 -1.0
julia> F.Q * F.R == A
true
qr
devuelve múltiples tipos porque LAPACK utiliza varias representaciones que minimizan los requisitos de almacenamiento de memoria de los productos de reflectores elementales de Householder, de modo que las matrices Q
y R
se pueden almacenar de manera compacta en lugar de como dos matrices densas separadas.
LinearAlgebra.qr!
— Functionqr!(A, pivot = NoPivot(); blocksize)
qr!
es lo mismo que qr
cuando A
es un subtipo de AbstractMatrix
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia. Se lanza una excepción InexactError
si la factorización produce un número que no es representable por el tipo de elemento de A
, por ejemplo, para tipos enteros.
El argumento de palabra clave blocksize
requiere Julia 1.4 o posterior.
Ejemplos
julia> a = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> qr!(a)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q factor: 2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R factor:
2×2 Matrix{Float64}:
-3.16228 -4.42719
0.0 -0.632456
julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> qr!(a)
ERROR: InexactError: Int64(3.1622776601683795)
Stacktrace:
[...]
LinearAlgebra.LQ
— TypeLQ <: Factorización
Tipo de factorización de matriz de la factorización LQ
de una matriz A
. La descomposición LQ
es la descomposición QR
de transpose(A)
. Este es el tipo de retorno de lq
, la función de factorización de matriz correspondiente.
Si S::LQ
es el objeto de factorización, el componente triangular inferior se puede obtener a través de S.L
, y el componente ortogonal/unitario a través de S.Q
, de modo que A ≈ S.L*S.Q
.
Iterar la descomposición produce los componentes S.L
y S.Q
.
Ejemplos
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> S = lq(A)
LQ{Float64, Matrix{Float64}, Vector{Float64}}
L factor:
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
Q factor: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}
julia> S.L * S.Q
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> l, q = S; # desestructuración a través de la iteración
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq
— Functionlq(A) -> S::LQ
Calcula la descomposición LQ de A
. El componente triangular inferior de la descomposición se puede obtener del objeto LQ
S
a través de S.L
, y el componente ortogonal/unitario a través de S.Q
, de modo que A ≈ S.L*S.Q
.
Iterar la descomposición produce los componentes S.L
y S.Q
.
La descomposición LQ es la descomposición QR de transpose(A)
, y es útil para calcular la solución de mínima norma lq(A) \ b
para un sistema de ecuaciones subdeterminado (A
tiene más columnas que filas, pero tiene rango completo de filas).
Ejemplos
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> S = lq(A)
LQ{Float64, Matrix{Float64}, Vector{Float64}}
Factor L:
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
Factor Q: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}
julia> S.L * S.Q
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> l, q = S; # desestructuración a través de la iteración
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq!
— Functionlq!(A) -> LQ
Calcula la factorización LQ
de A
, utilizando la matriz de entrada como espacio de trabajo. Consulta también lq
.
LinearAlgebra.BunchKaufman
— TypeBunchKaufman <: Factorization
Tipo de factorización de matriz de la factorización de Bunch-Kaufman de una matriz simétrica o hermítica A
como P'UDU'P
o P'LDL'P
, dependiendo de si el triángulo superior (el predeterminado) o el triángulo inferior se almacena en A
. Si A
es simétrica compleja, entonces U'
y L'
denotan las transpuestas no conjugadas, es decir, transpose(U)
y transpose(L)
, respectivamente. Este es el tipo de retorno de bunchkaufman
, la función de factorización de matriz correspondiente.
Si S::BunchKaufman
es el objeto de factorización, los componentes se pueden obtener a través de S.D
, S.U
o S.L
según corresponda dado S.uplo
, y S.p
.
Iterar la descomposición produce los componentes S.D
, S.U
o S.L
según corresponda dado S.uplo
, y S.p
.
Ejemplos
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A se envuelve internamente por Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U factor:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
permutation:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # desestructuración a través de la iteración
julia> d == S.D && u == S.U && p == S.p
true
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L factor:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
permutation:
2-element Vector{Int64}:
2
1
LinearAlgebra.bunchkaufman
— Functionbunchkaufman(A, rook::Bool=false; check = true) -> S::BunchKaufman
Calcula la factorización de Bunch-Kaufman [Bunch1977] de una matriz simétrica o hermítica A
como P'*U*D*U'*P
o P'*L*D*L'*P
, dependiendo de qué triángulo se almacene en A
, y devuelve un objeto BunchKaufman
. Ten en cuenta que si A
es simétrica compleja, entonces U'
y L'
denotan las transpuestas no conjugadas, es decir, transpose(U)
y transpose(L)
.
Iterar la descomposición produce los componentes S.D
, S.U
o S.L
según corresponda dado S.uplo
, y S.p
.
Si rook
es true
, se utiliza pivoteo de rook. Si rook
es falso, no se utiliza pivoteo de rook.
Cuando check = true
, se lanza un error si la descomposición falla. Cuando check = false
, la responsabilidad de verificar la validez de la descomposición (a través de issuccess
) recae en el usuario.
Las siguientes funciones están disponibles para objetos BunchKaufman
: size
, \
, inv
, issymmetric
, ishermitian
, getindex
.
Ejemplos
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A se envuelve internamente por Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U factor:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
permutation:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # desestructuración a través de la iteración
julia> d == S.D && u == S.U && p == S.p
true
julia> S.U*S.D*S.U' - S.P*A*S.P'
2×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L factor:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
permutation:
2-element Vector{Int64}:
2
1
julia> S.L*S.D*S.L' - A[S.p, S.p]
2×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
LinearAlgebra.bunchkaufman!
— Functionbunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufman
bunchkaufman!
es lo mismo que bunchkaufman
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia.
LinearAlgebra.Eigen
— TypeEigen <: Factorization
Tipo de factorización de matriz de la descomposición en valores propios/espectrales de una matriz cuadrada A
. Este es el tipo de retorno de eigen
, la función de factorización de matriz correspondiente.
Si F::Eigen
es el objeto de factorización, los valores propios se pueden obtener a través de F.values
y los vectores propios como las columnas de la matriz F.vectors
. (El k
-ésimo vector propio se puede obtener del segmento F.vectors[:, k]
.)
Iterar sobre la descomposición produce los componentes F.values
y F.vectors
.
Ejemplos
julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
1.0
3.0
18.0
vectors:
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> F.values
3-element Vector{Float64}:
1.0
3.0
18.0
julia> F.vectors
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.GeneralizedEigen
— TypeGeneralizedEigen <: Factorization
Tipo de factorización de matriz de la descomposición generalizada de valores propios/espectrales de A
y B
. Este es el tipo de retorno de eigen
, la función de factorización de matriz correspondiente, cuando se llama con dos argumentos de matriz.
Si F::GeneralizedEigen
es el objeto de factorización, los valores propios se pueden obtener a través de F.values
y los vectores propios como las columnas de la matriz F.vectors
. (El k
-ésimo vector propio se puede obtener de la porción F.vectors[:, k]
.)
Iterar sobre la descomposición produce los componentes F.values
y F.vectors
.
Ejemplos
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> F = eigen(A, B)
GeneralizedEigen{ComplexF64, ComplexF64, Matrix{ComplexF64}, Vector{ComplexF64}}
values:
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
vectors:
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> F.values
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> F.vectors
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.eigvals
— Functioneigvals(A; permute::Bool=true, scale::Bool=true, sortby) -> values
Devuelve los valores propios de A
.
Para matrices generales no simétricas, es posible especificar cómo se balancea la matriz antes del cálculo de los valores propios. Las palabras clave permute
, scale
y sortby
son las mismas que para eigen
.
Ejemplos
julia> diag_matrix = [1 0; 0 4]
2×2 Matrix{Int64}:
1 0
0 4
julia> eigvals(diag_matrix)
2-element Vector{Float64}:
1.0
4.0
Para una entrada escalar, eigvals
devolverá un escalar.
Ejemplos
julia> eigvals(-2)
-2
eigvals(A, B) -> valores
Calcule los valores propios generalizados de A
y B
.
Ejemplos
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> eigvals(A,B)
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values
Devuelve los valores propios de A
. Es posible calcular solo un subconjunto de los valores propios especificando un UnitRange
irange
que cubra índices de los valores propios ordenados, por ejemplo, los valores propios del 2º al 8º.
Ejemplos
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A, 2:2)
1-element Vector{Float64}:
0.9999999999999996
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values
Devuelve los valores propios de A
. Es posible calcular solo un subconjunto de los valores propios especificando un par vl
y vu
para los límites inferior y superior de los valores propios.
Ejemplos
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A, -1, 2)
1-element Vector{Float64}:
1.0000000000000009
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
LinearAlgebra.eigvals!
— Functioneigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values
Igual que eigvals
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia. Las palabras clave permute
, scale
y sortby
son las mismas que para eigen
.
La matriz de entrada A
no contendrá sus valores propios después de que se llame a eigvals!
sobre ella - A
se utiliza como un espacio de trabajo.
Ejemplos
julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> eigvals!(A)
2-element Vector{Float64}:
-0.3722813232690143
5.372281323269014
julia> A
2×2 Matrix{Float64}:
-0.372281 -1.0
0.0 5.37228
eigvals!(A, B; sortby) -> values
Igual que eigvals
, pero ahorra espacio al sobrescribir la entrada A
(y B
), en lugar de crear copias.
Las matrices de entrada A
y B
no contendrán sus valores propios después de que se llame a eigvals!
. Se utilizan como espacios de trabajo.
Ejemplos
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> eigvals!(A, B)
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> A
2×2 Matrix{Float64}:
-0.0 -1.0
1.0 -0.0
julia> B
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values
Igual que eigvals
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia. irange
es un rango de índices de valores propios a buscar; por ejemplo, los valores propios del 2º al 8º.
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values
Igual que eigvals
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia. vl
es el límite inferior del intervalo para buscar valores propios, y vu
es el límite superior.
LinearAlgebra.eigmax
— Functioneigmax(A; permute::Bool=true, scale::Bool=true)
Devuelve el mayor valor propio de A
. La opción permute=true
permuta la matriz para acercarse a una forma triangular superior, y scale=true
escala la matriz por sus elementos diagonales para hacer que las filas y columnas sean más iguales en norma. Ten en cuenta que si los valores propios de A
son complejos, este método fallará, ya que los números complejos no se pueden ordenar.
Ejemplos
julia> A = [0 im; -im 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
0-1im 0+0im
julia> eigmax(A)
1.0
julia> A = [0 im; -1 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
-1+0im 0+0im
julia> eigmax(A)
ERROR: DomainError with Complex{Int64}[0+0im 0+1im; -1+0im 0+0im]:
`A` no puede tener valores propios complejos.
Stacktrace:
[...]
LinearAlgebra.eigmin
— Functioneigmin(A; permute::Bool=true, scale::Bool=true)
Devuelve el valor propio más pequeño de A
. La opción permute=true
permuta la matriz para acercarse a una forma triangular superior, y scale=true
escala la matriz por sus elementos diagonales para hacer que las filas y columnas sean más iguales en norma. Ten en cuenta que si los valores propios de A
son complejos, este método fallará, ya que los números complejos no se pueden ordenar.
Ejemplos
julia> A = [0 im; -im 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
0-1im 0+0im
julia> eigmin(A)
-1.0
julia> A = [0 im; -1 0]
2×2 Matrix{Complex{Int64}}:
0+0im 0+1im
-1+0im 0+0im
julia> eigmin(A)
ERROR: DomainError with Complex{Int64}[0+0im 0+1im; -1+0im 0+0im]:
`A` no puede tener valores propios complejos.
Stacktrace:
[...]
LinearAlgebra.eigvecs
— Functioneigvecs(A::SymTridiagonal[, eigvals]) -> Matrix
Devuelve una matriz M
cuyas columnas son los eigenvectores de A
. (El k
-ésimo eigenvector se puede obtener de la porción M[:, k]
.)
Si se especifica el vector opcional de eigenvalores eigvals
, eigvecs
devuelve los eigenvectores correspondientes específicos.
Ejemplos
julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
1.0 2.0 ⋅
2.0 2.0 3.0
⋅ 3.0 1.0
julia> eigvals(A)
3-element Vector{Float64}:
-2.1400549446402604
1.0000000000000002
5.140054944640259
julia> eigvecs(A)
3×3 Matrix{Float64}:
0.418304 -0.83205 0.364299
-0.656749 -7.39009e-16 0.754109
0.627457 0.5547 0.546448
julia> eigvecs(A, [1.])
3×1 Matrix{Float64}:
0.8320502943378438
4.263514128092366e-17
-0.5547001962252291
eigvecs(A; permute::Bool=true, scale::Bool=true, `sortby`) -> Matrix
Devuelve una matriz M
cuyas columnas son los vectores propios de A
. (El k
-ésimo vector propio se puede obtener del corte M[:, k]
.) Las palabras clave permute
, scale
y sortby
son las mismas que para eigen
.
Ejemplos
julia> eigvecs([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
eigvecs(A, B) -> Matrix
Devuelve una matriz M
cuyas columnas son los eigenvectores generalizados de A
y B
. (El k
-ésimo eigenvector se puede obtener del corte M[:, k]
.)
Ejemplos
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> eigvecs(A, B)
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
LinearAlgebra.eigen
— Functioneigen(A; permute::Bool=true, scale::Bool=true, sortby) -> Eigen
Calcula la descomposición en valores propios de A
, devolviendo un objeto de factorización Eigen
F
que contiene los valores propios en F.values
y los vectores propios en las columnas de la matriz F.vectors
. Esto corresponde a resolver un problema de valores propios de la forma Ax = λx
, donde A
es una matriz, x
es un vector propio, y λ
es un valor propio. (El k
-ésimo vector propio se puede obtener de la porción F.vectors[:, k]
.)
Iterar la descomposición produce los componentes F.values
y F.vectors
.
Las siguientes funciones están disponibles para los objetos Eigen
: inv
, det
, y isposdef
.
Para matrices generales no simétricas, es posible especificar cómo se balancea la matriz antes del cálculo del vector propio. La opción permute=true
permuta la matriz para acercarse a una forma triangular superior, y scale=true
escala la matriz por sus elementos diagonales para hacer que las filas y columnas sean más iguales en norma. El valor predeterminado es true
para ambas opciones.
Por defecto, los valores y vectores propios se ordenan lexicográficamente por (real(λ),imag(λ))
. Se puede pasar una función de comparación diferente by(λ)
a sortby
, o se puede pasar sortby=nothing
para dejar los valores propios en un orden arbitrario. Algunos tipos de matriz especiales (por ejemplo, Diagonal
o SymTridiagonal
) pueden implementar su propia convención de ordenación y no aceptar una palabra clave sortby
.
Ejemplos
julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
1.0
3.0
18.0
vectors:
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> F.values
3-element Vector{Float64}:
1.0
3.0
18.0
julia> F.vectors
3×3 Matrix{Float64}:
1.0 0.0 0.0
0.0 1.0 0.0
0.0 0.0 1.0
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
eigen(A, B; sortby) -> GeneralizedEigen
Calcula la descomposición de valores propios generalizados de A
y B
, devolviendo un objeto de factorización GeneralizedEigen
F
que contiene los valores propios generalizados en F.values
y los vectores propios generalizados en las columnas de la matriz F.vectors
. Esto corresponde a resolver un problema de valores propios generalizados de la forma Ax = λBx
, donde A, B
son matrices, x
es un vector propio y λ
es un valor propio. (El k
-ésimo vector propio generalizado se puede obtener de la porción F.vectors[:, k]
.)
Iterar la descomposición produce los componentes F.values
y F.vectors
.
Por defecto, los valores propios y vectores se ordenan lexicográficamente por (real(λ),imag(λ))
. Se puede pasar una función de comparación diferente by(λ)
a sortby
, o se puede pasar sortby=nothing
para dejar los valores propios en un orden arbitrario.
Ejemplos
julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
1 0
0 -1
julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
0 1
1 0
julia> F = eigen(A, B);
julia> F.values
2-element Vector{ComplexF64}:
0.0 - 1.0im
0.0 + 1.0im
julia> F.vectors
2×2 Matrix{ComplexF64}:
0.0+1.0im 0.0-1.0im
-1.0+0.0im -1.0-0.0im
julia> vals, vecs = F; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> Eigen
Calcula la descomposición en valores propios de A
, devolviendo un objeto de factorización Eigen
F
que contiene los valores propios en F.values
y los vectores propios en las columnas de la matriz F.vectors
. (El k
-ésimo vector propio se puede obtener de la porción F.vectors[:, k]
.)
Iterar la descomposición produce los componentes F.values
y F.vectors
.
Las siguientes funciones están disponibles para los objetos Eigen
: inv
, det
, y isposdef
.
El UnitRange
irange
especifica los índices de los valores propios ordenados a buscar.
Si irange
no es 1:n
, donde n
es la dimensión de A
, entonces la factorización devuelta será una factorización truncada.
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> Eigen
Calcula la descomposición en valores propios de A
, devolviendo un objeto de factorización Eigen
F
que contiene los valores propios en F.values
y los vectores propios en las columnas de la matriz F.vectors
. (El k
-ésimo vector propio se puede obtener de la porción F.vectors[:, k]
.)
Iterar sobre la descomposición produce los componentes F.values
y F.vectors
.
Las siguientes funciones están disponibles para los objetos Eigen
: inv
, det
, y isposdef
.
vl
es el límite inferior de la ventana de valores propios a buscar, y vu
es el límite superior.
Si [vl
, vu
] no contiene todos los valores propios de A
, entonces la factorización devuelta será una factorización truncada.
LinearAlgebra.eigen!
— Functioneigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)
Igual que eigen
, pero ahorra espacio al sobrescribir la entrada A
(y B
), en lugar de crear una copia.
LinearAlgebra.Hessenberg
— TypeHessenberg <: Factorización
Un objeto Hessenberg
representa la factorización de Hessenberg QHQ'
de una matriz cuadrada, o un desplazamiento Q(H+μI)Q'
de la misma, que es producido por la función hessenberg
.
LinearAlgebra.hessenberg
— Functionhessenberg(A) -> Hessenberg
Calcula la descomposición de Hessenberg de A
y devuelve un objeto Hessenberg
. Si F
es el objeto de factorización, la matriz unitaria se puede acceder con F.Q
(de tipo LinearAlgebra.HessenbergQ
) y la matriz de Hessenberg con F.H
(de tipo UpperHessenberg
), cualquiera de las cuales puede ser convertida a una matriz regular con Matrix(F.H)
o Matrix(F.Q)
.
Si A
es Hermitiana
o real-Simétrica
, entonces la descomposición de Hessenberg produce una matriz tridiagonal real-simétrica y F.H
es de tipo SymTridiagonal
.
Ten en cuenta que la factorización desplazada A+μI = Q (H+μI) Q'
se puede construir de manera eficiente mediante F + μ*I
usando el objeto UniformScaling
I
, que crea un nuevo objeto Hessenberg
con almacenamiento compartido y un desplazamiento modificado. El desplazamiento de un dado F
se obtiene mediante F.μ
. Esto es útil porque múltiples resoluciones desplazadas (F + μ*I) \ b
(para diferentes μ
y/o b
) se pueden realizar de manera eficiente una vez que se crea F
.
Iterar la descomposición produce los factores F.Q, F.H, F.μ
.
Ejemplos
julia> A = [4. 9. 7.; 4. 4. 1.; 4. 3. 2.]
3×3 Matrix{Float64}:
4.0 9.0 7.0
4.0 4.0 1.0
4.0 3.0 2.0
julia> F = hessenberg(A)
Hessenberg{Float64, UpperHessenberg{Float64, Matrix{Float64}}, Matrix{Float64}, Vector{Float64}, Bool}
Q factor: 3×3 LinearAlgebra.HessenbergQ{Float64, Matrix{Float64}, Vector{Float64}, false}
H factor:
3×3 UpperHessenberg{Float64, Matrix{Float64}}:
4.0 -11.3137 -1.41421
-5.65685 5.0 2.0
⋅ -8.88178e-16 1.0
julia> F.Q * F.H * F.Q'
3×3 Matrix{Float64}:
4.0 9.0 7.0
4.0 4.0 1.0
4.0 3.0 2.0
julia> q, h = F; # desestructuración mediante iteración
julia> q == F.Q && h == F.H
true
LinearAlgebra.hessenberg!
— Functionhessenberg!(A) -> Hessenberg
hessenberg!
es lo mismo que hessenberg
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia.
LinearAlgebra.Schur
— TypeSchur <: Factorización
Tipo de factorización de matriz de la factorización de Schur de una matriz A
. Este es el tipo de retorno de schur(_)
, la función de factorización de matriz correspondiente.
Si F::Schur
es el objeto de factorización, el factor de Schur (cuasi) triangular se puede obtener a través de F.Schur
o F.T
y los vectores de Schur ortogonales/unitarios a través de F.vectors
o F.Z
de tal manera que A = F.vectors * F.Schur * F.vectors'
. Los eigenvalores de A
se pueden obtener con F.values
.
Iterar la descomposición produce los componentes F.T
, F.Z
y F.values
.
Ejemplos
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T factor:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z factor:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
eigenvalores:
2-element Vector{Float64}:
3.0
-2.0
julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> t, z, vals = F; # desestructuración a través de la iteración
julia> t == F.T && z == F.Z && vals == F.values
true
LinearAlgebra.GeneralizedSchur
— TypeGeneralizedSchur <: Factorization
Tipo de factorización de matriz de la factorización de Schur generalizada de dos matrices A
y B
. Este es el tipo de retorno de schur(_, _)
, la función de factorización de matriz correspondiente.
Si F::GeneralizedSchur
es el objeto de factorización, los factores de Schur (cuasi) triangulares se pueden obtener a través de F.S
y F.T
, los vectores de Schur unitarios/ortogonales a la izquierda a través de F.left
o F.Q
, y los vectores de Schur unitarios/ortogonales a la derecha se pueden obtener con F.right
o F.Z
de tal manera que A=F.left*F.S*F.right'
y B=F.left*F.T*F.right'
. Los valores propios generalizados de A
y B
se pueden obtener con F.α./F.β
.
Iterar la descomposición produce los componentes F.S
, F.T
, F.Q
, F.Z
, F.α
y F.β
.
LinearAlgebra.schur
— Functionschur(A) -> F::Schur
Calcula la factorización de Schur de la matriz A
. El factor de Schur (cuasi) triangular se puede obtener del objeto Schur
F
con F.Schur
o F.T
y los vectores de Schur ortogonales/unitarios se pueden obtener con F.vectors
o F.Z
de tal manera que A = F.vectors * F.Schur * F.vectors'
. Los valores propios de A
se pueden obtener con F.values
.
Para A
real, la factorización de Schur es "cuasitridimensional", lo que significa que es superior-triangular excepto con bloques diagonales de 2×2 para cualquier par conjugado de valores propios complejos; esto permite que la factorización sea puramente real incluso cuando hay valores propios complejos. Para obtener la factorización de Schur (compleja) puramente superior-triangular a partir de una factorización cuasitridimensional real, puedes usar Schur{Complex}(schur(A))
.
Iterar la descomposición produce los componentes F.T
, F.Z
y F.values
.
Ejemplos
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T factor:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z factor:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
valores propios:
2-element Vector{Float64}:
3.0
-2.0
julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> t, z, vals = F; # desestructuración a través de la iteración
julia> t == F.T && z == F.Z && vals == F.values
true
schur(A, B) -> F::GeneralizedSchur
Calcula la factorización Schur generalizada (o QZ) de las matrices A
y B
. Los factores Schur (cuasi) triangulares se pueden obtener del objeto Schur
F
con F.S
y F.T
, los vectores Schur unitarios/ortogonales izquierdos se pueden obtener con F.left
o F.Q
y los vectores Schur unitarios/ortogonales derechos se pueden obtener con F.right
o F.Z
de tal manera que A=F.left*F.S*F.right'
y B=F.left*F.T*F.right'
. Los valores propios generalizados de A
y B
se pueden obtener con F.α./F.β
.
Iterar la descomposición produce los componentes F.S
, F.T
, F.Q
, F.Z
, F.α
y F.β
.
LinearAlgebra.schur!
— Functionschur!(A) -> F::Schur
Igual que schur
pero utiliza el argumento de entrada A
como espacio de trabajo.
Ejemplos
julia> A = [5. 7.; -2. -4.]
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> F = schur!(A)
Schur{Float64, Matrix{Float64}, Vector{Float64}}
T factor:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z factor:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
valores propios:
2-element Vector{Float64}:
3.0
-2.0
julia> A
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
schur!(A::StridedMatrix, B::StridedMatrix) -> F::GeneralizedSchur
Igual que schur
pero utiliza las matrices de entrada A
y B
como espacio de trabajo.
LinearAlgebra.ordschur
— Functionordschur(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
Reordena la factorización de Schur F
de una matriz A = Z*T*Z'
de acuerdo con el arreglo lógico select
, devolviendo el objeto de factorización reordenado F
. Los valores propios seleccionados aparecen en la diagonal principal de F.Schur
y las correspondientes columnas principales de F.vectors
forman una base ortogonal/unitaria del subespacio invariante derecho correspondiente. En el caso real, un par de valores propios conjugados complejos debe ser incluido o excluido en su totalidad a través de select
.
ordschur(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
Reordena la factorización de Schur generalizada F
de un par de matrices (A, B) = (Q*S*Z', Q*T*Z')
de acuerdo con el arreglo lógico select
y devuelve un objeto GeneralizedSchur F
. Los valores propios seleccionados aparecen en la diagonal principal de ambos F.S
y F.T
, y los vectores de Schur ortogonales/unitarios izquierdo y derecho también se reordenan de tal manera que (A, B) = F.Q*(F.S, F.T)*F.Z'
aún se mantiene y los valores propios generalizados de A
y B
aún se pueden obtener con F.α./F.β
.
LinearAlgebra.ordschur!
— Functionordschur!(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
Igual que ordschur
pero sobrescribe la factorización F
.
ordschur!(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
Igual que ordschur
, pero sobrescribe la factorización F
.
LinearAlgebra.SVD
— TypeSVD <: Factorización
Tipo de factorización de matriz de la descomposición en valores singulares (SVD) de una matriz A
. Este es el tipo de retorno de svd(_)
, la función de factorización de matriz correspondiente.
Si F::SVD
es el objeto de factorización, U
, S
, V
y Vt
se pueden obtener a través de F.U
, F.S
, F.V
y F.Vt
, de tal manera que A = U * Diagonal(S) * Vt
. Los valores singulares en S
están ordenados en orden descendente.
Iterar la descomposición produce los componentes U
, S
y V
.
Ejemplos
julia> A = [1. 0. 0. 0. 2.; 0. 0. 3. 0. 0.; 0. 0. 0. 0. 0.; 0. 2. 0. 0. 0.]
4×5 Matrix{Float64}:
1.0 0.0 0.0 0.0 2.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 2.0 0.0 0.0 0.0
julia> F = svd(A)
SVD{Float64, Float64, Matrix{Float64}, Vector{Float64}}
U factor:
4×4 Matrix{Float64}:
0.0 1.0 0.0 0.0
1.0 0.0 0.0 0.0
0.0 0.0 0.0 1.0
0.0 0.0 -1.0 0.0
valores singulares:
4-element Vector{Float64}:
3.0
2.23606797749979
2.0
0.0
Vt factor:
4×5 Matrix{Float64}:
-0.0 0.0 1.0 -0.0 0.0
0.447214 0.0 0.0 0.0 0.894427
0.0 -1.0 0.0 0.0 0.0
0.0 0.0 0.0 1.0 0.0
julia> F.U * Diagonal(F.S) * F.Vt
4×5 Matrix{Float64}:
1.0 0.0 0.0 0.0 2.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 2.0 0.0 0.0 0.0
julia> u, s, v = F; # desestructuración a través de la iteración
julia> u == F.U && s == F.S && v == F.V
true
LinearAlgebra.GeneralizedSVD
— TypeGeneralizedSVD <: Factorization
Tipo de factorización de matriz de la descomposición en valores singulares generalizada (SVD) de dos matrices A
y B
, tal que A = F.U*F.D1*F.R0*F.Q'
y B = F.V*F.D2*F.R0*F.Q'
. Este es el tipo de retorno de svd(_, _)
, la función de factorización de matriz correspondiente.
Para una matriz A
de M por N y una matriz B
de P por N,
U
es una matriz ortogonal de M por M,V
es una matriz ortogonal de P por P,Q
es una matriz ortogonal de N por N,D1
es una matriz diagonal de M por (K+L) con 1s en las primeras K entradas,D2
es una matriz de P por (K+L) cuyo bloque superior derecho de L por L es diagonal,R0
es una matriz de (K+L) por N cuyo bloque superior derecho de (K+L) por (K+L) es no singular y triangular superior,
K+L
es el rango numérico efectivo de la matriz [A; B]
.
Iterar la descomposición produce los componentes U
, V
, Q
, D1
, D2
y R0
.
Las entradas de F.D1
y F.D2
están relacionadas, como se explica en la documentación de LAPACK para el SVD generalizado y la rutina xGGSVD3 que se llama por debajo (en LAPACK 3.6.0 y versiones más nuevas).
Ejemplos
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> F = svd(A, B)
GeneralizedSVD{Float64, Matrix{Float64}, Float64, Vector{Float64}}
U factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
V factor:
2×2 Matrix{Float64}:
-0.0 -1.0
1.0 0.0
Q factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
D1 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
D2 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
R0 factor:
2×2 Matrix{Float64}:
1.41421 0.0
0.0 -1.41421
julia> F.U*F.D1*F.R0*F.Q'
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> F.V*F.D2*F.R0*F.Q'
2×2 Matrix{Float64}:
-0.0 1.0
1.0 0.0
LinearAlgebra.svd
— Functionsvd(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD
Calcula la descomposición en valores singulares (SVD) de A
y devuelve un objeto SVD
.
U
, S
, V
y Vt
se pueden obtener de la factorización F
con F.U
, F.S
, F.V
y F.Vt
, de tal manera que A = U * Diagonal(S) * Vt
. El algoritmo produce Vt
y, por lo tanto, es más eficiente extraer Vt
que V
. Los valores singulares en S
están ordenados en orden descendente.
Iterar la descomposición produce los componentes U
, S
y V
.
Si full = false
(por defecto), se devuelve una SVD "delgada". Para una matriz A
de $M \times N$, en la factorización completa U
es $M \times M$ y V
es $N \times N$, mientras que en la factorización delgada U
es $M \times K$ y V
es $N \times K$, donde $K = \min(M,N)$ es el número de valores singulares.
Si alg = DivideAndConquer()
, se utiliza un algoritmo de divide y vencerás para calcular la SVD. Otra opción (típicamente más lenta pero más precisa) es alg = QRIteration()
.
El argumento de palabra clave alg
requiere Julia 1.3 o posterior.
Ejemplos
julia> A = rand(4,3);
julia> F = svd(A); # Almacenar el objeto de factorización
julia> A ≈ F.U * Diagonal(F.S) * F.Vt
true
julia> U, S, V = F; # desestructuración a través de la iteración
julia> A ≈ U * Diagonal(S) * V'
true
julia> Uonly, = svd(A); # Almacenar solo U
julia> Uonly == U
true
svd(A, B) -> GeneralizedSVD
Calcula la SVD generalizada de A
y B
, devolviendo un objeto de factorización GeneralizedSVD
F
tal que [A;B] = [F.U * F.D1; F.V * F.D2] * F.R0 * F.Q'
U
es una matriz ortogonal de M por M,V
es una matriz ortogonal de P por P,Q
es una matriz ortogonal de N por N,D1
es una matriz diagonal de M por (K+L) con 1s en las primeras K entradas,D2
es una matriz de P por (K+L) cuyo bloque superior derecho de L por L es diagonal,R0
es una matriz de (K+L) por N cuyo bloque superior derecho de (K+L) por (K+L) es no singular y triangular superior,
K+L
es el rango numérico efectivo de la matriz [A; B]
.
Iterar la descomposición produce los componentes U
, V
, Q
, D1
, D2
y R0
.
La SVD generalizada se utiliza en aplicaciones como cuando se quiere comparar cuánto pertenece a A
frente a cuánto pertenece a B
, como en el genoma humano frente al de levadura, o señal frente a ruido, o entre clústeres frente a dentro de clústeres. (Ver Edelman y Wang para discusión: https://arxiv.org/abs/1901.00485)
Descompone [A; B]
en [UC; VS]H
, donde [UC; VS]
es una base ortogonal natural para el espacio de columnas de [A; B]
, y H = RQ'
es una base no ortogonal natural para el espacio de filas de [A;B]
, donde las filas superiores se atribuyen más estrechamente a la matriz A
, y las inferiores a la matriz B
. Las matrices multi-coseno/seno C
y S
proporcionan una medida múltiple de cuánto A
frente a cuánto B
, y U
y V
proporcionan direcciones en las que se miden.
Ejemplos
julia> A = randn(3,2); B=randn(4,2);
julia> F = svd(A, B);
julia> U,V,Q,C,S,R = F;
julia> H = R*Q';
julia> [A; B] ≈ [U*C; V*S]*H
true
julia> [A; B] ≈ [F.U*F.D1; F.V*F.D2]*F.R0*F.Q'
true
julia> Uonly, = svd(A,B);
julia> U == Uonly
true
LinearAlgebra.svd!
— Functionsvd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD
svd!
es lo mismo que svd
, pero ahorra espacio al sobrescribir la entrada A
, en lugar de crear una copia. Consulta la documentación de svd
para más detalles.
svd!(A, B) -> GeneralizedSVD
svd!
es lo mismo que svd
, pero modifica los argumentos A
y B
en su lugar, en lugar de hacer copias. Consulta la documentación de svd
para más detalles.
LinearAlgebra.svdvals
— Functionsvdvals(A)
Devuelve los valores singulares de A
en orden descendente.
Ejemplos
julia> A = [1. 0. 0. 0. 2.; 0. 0. 3. 0. 0.; 0. 0. 0. 0. 0.; 0. 2. 0. 0. 0.]
4×5 Matrix{Float64}:
1.0 0.0 0.0 0.0 2.0
0.0 0.0 3.0 0.0 0.0
0.0 0.0 0.0 0.0 0.0
0.0 2.0 0.0 0.0 0.0
julia> svdvals(A)
4-element Vector{Float64}:
3.0
2.23606797749979
2.0
0.0
svdvals(A, B)
Devuelve los valores singulares generalizados de la descomposición en valores singulares generalizados de A
y B
. Ver también svd
.
Ejemplos
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> svdvals(A, B)
2-element Vector{Float64}:
1.0
1.0
LinearAlgebra.svdvals!
— Functionsvdvals!(A)
Devuelve los valores singulares de A
, ahorrando espacio al sobrescribir la entrada. Consulta también svdvals
y svd
.
svdvals!(A, B)
Devuelve los valores singulares generalizados de la descomposición en valores singulares generalizados de A
y B
, ahorrando espacio al sobrescribir A
y B
. Véase también svd
y svdvals
.
LinearAlgebra.Givens
— TypeLinearAlgebra.Givens(i1,i2,c,s) -> G
Un operador lineal de rotación de Givens. Los campos c
y s
representan el coseno y el seno del ángulo de rotación, respectivamente. El tipo Givens
admite la multiplicación por la izquierda G*A
y la multiplicación por la derecha con transposición conjugada A*G'
. El tipo no tiene un size
y, por lo tanto, se puede multiplicar con matrices de tamaño arbitrario siempre que i2<=size(A,2)
para G*A
o i2<=size(A,1)
para A*G'
.
Ver también givens
.
LinearAlgebra.givens
— Functiongivens(f::T, g::T, i1::Integer, i2::Integer) where {T} -> (G::Givens, r::T)
Calcula la rotación de Givens G
y el escalar r
tal que para cualquier vector x
donde
x[i1] = f
x[i2] = g
el resultado de la multiplicación
y = G*x
tiene la propiedad de que
y[i1] = r
y[i2] = 0
Ver también LinearAlgebra.Givens
.
givens(A::AbstractArray, i1::Integer, i2::Integer, j::Integer) -> (G::Givens, r)
Calcula la rotación de Givens G
y el escalar r
tal que el resultado de la multiplicación
B = G*A
tiene la propiedad de que
B[i1,j] = r
B[i2,j] = 0
Ver también LinearAlgebra.Givens
. ```
givens(x::AbstractVector, i1::Integer, i2::Integer) -> (G::Givens, r)
Calcula la rotación de Givens G
y el escalar r
tal que el resultado de la multiplicación
B = G*x
tiene la propiedad de que
B[i1] = r
B[i2] = 0
Ver también LinearAlgebra.Givens
. ```
LinearAlgebra.triu
— Functiontriu(M)
Triángulo superior de una matriz.
Ejemplos
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> triu(a)
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
0.0 1.0 1.0 1.0
0.0 0.0 1.0 1.0
0.0 0.0 0.0 1.0
triu(M, k::Integer)
Devuelve el triángulo superior de M
comenzando desde la k
-ésima superdiagonal.
Ejemplos
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> triu(a,3)
4×4 Matrix{Float64}:
0.0 0.0 0.0 1.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
julia> triu(a,-3)
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
LinearAlgebra.triu!
— Functiontriu!(M)
Triángulo superior de una matriz, sobrescribiendo M
en el proceso. Ver también triu
.
triu!(M, k::Integer)
Devuelve el triángulo superior de M
comenzando desde la k
-ésima superdiagonal, sobrescribiendo M
en el proceso.
Ejemplos
julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
julia> triu!(M, 1)
5×5 Matrix{Int64}:
0 2 3 4 5
0 0 3 4 5
0 0 0 4 5
0 0 0 0 5
0 0 0 0 0
LinearAlgebra.tril
— Functiontril(M)
Triángulo inferior de una matriz.
Ejemplos
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> tril(a)
4×4 Matrix{Float64}:
1.0 0.0 0.0 0.0
1.0 1.0 0.0 0.0
1.0 1.0 1.0 0.0
1.0 1.0 1.0 1.0
tril(M, k::Integer)
Devuelve el triángulo inferior de M
comenzando desde la k
-ésima superdiagonal.
Ejemplos
julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> tril(a,3)
4×4 Matrix{Float64}:
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
julia> tril(a,-3)
4×4 Matrix{Float64}:
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
0.0 0.0 0.0 0.0
1.0 0.0 0.0 0.0
LinearAlgebra.tril!
— Functiontril!(M)
Triángulo inferior de una matriz, sobrescribiendo M
en el proceso. Ver también tril
.
tril!(M, k::Integer)
Devuelve el triángulo inferior de M
comenzando desde la k
-ésima superdiagonal, sobrescribiendo M
en el proceso.
Ejemplos
julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
julia> tril!(M, 2)
5×5 Matrix{Int64}:
1 2 3 0 0
1 2 3 4 0
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
LinearAlgebra.diagind
— Functiondiagind(M::AbstractMatrix, k::Integer = 0, indstyle::IndexStyle = IndexLinear())
diagind(M::AbstractMatrix, indstyle::IndexStyle = IndexLinear())
Un AbstractRange
que da los índices de la k
-ésima diagonal de la matriz M
. Opcionalmente, se puede especificar un estilo de índice que determina el tipo de rango devuelto. Si indstyle isa IndexLinear
(por defecto), esto devuelve un AbstractRange{Integer}
. Por otro lado, si indstyle isa IndexCartesian
, esto devuelve un AbstractRange{CartesianIndex{2}}
.
Si k
no se proporciona, se asume que es 0
(correspondiente a la diagonal principal).
Ver también: diag
, diagm
, Diagonal
.
Ejemplos
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> diagind(A, -1)
2:4:6
julia> diagind(A, IndexCartesian())
StepRangeLen(CartesianIndex(1, 1), CartesianIndex(1, 1), 3)
Especificar un IndexStyle
requiere al menos Julia 1.11.
LinearAlgebra.diag
— Functiondiag(M, k::Integer=0)
La k
-ésima diagonal de una matriz, como un vector.
Véase también diagm
, diagind
, Diagonal
, isdiag
.
Ejemplos
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> diag(A,1)
2-element Vector{Int64}:
2
6
LinearAlgebra.diagm
— Functiondiagm(kv::Pair{<:Integer,<:AbstractVector}...)
diagm(m::Integer, n::Integer, kv::Pair{<:Integer,<:AbstractVector}...)
Construye una matriz a partir de `Pair`s de diagonales y vectores. El vector `kv.second` se colocará en la diagonal `kv.first`. Por defecto, la matriz es cuadrada y su tamaño se infiere de `kv`, pero se puede especificar un tamaño no cuadrado `m`×`n` (rellenado con ceros según sea necesario) pasando `m,n` como los primeros argumentos. Para índices de diagonal repetidos `kv.first`, los valores en los vectores correspondientes `kv.second` se sumarán.
`diagm` construye una matriz completa; si deseas versiones que ahorren espacio con aritmética rápida, consulta [`Diagonal`](@ref), [`Bidiagonal`](@ref), [`Tridiagonal`](@ref) y [`SymTridiagonal`](@ref).
# Ejemplos
jldoctest julia> diagm(1 => [1,2,3]) 4×4 Matrix{Int64}: 0 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0
julia> diagm(1 => [1,2,3], -1 => [4,5]) 4×4 Matrix{Int64}: 0 1 0 0 4 0 2 0 0 5 0 3 0 0 0 0
julia> diagm(1 => [1,2,3], 1 => [1,2,3]) 4×4 Matrix{Int64}: 0 2 0 0 0 0 4 0 0 0 0 6 0 0 0 0 ```
diagm(v::AbstractVector)
diagm(m::Integer, n::Integer, v::AbstractVector)
Construye una matriz con los elementos del vector como elementos diagonales. Por defecto, la matriz es cuadrada y su tamaño está dado por length(v)
, pero se puede especificar un tamaño no cuadrado m
×n
pasando m,n
como los primeros argumentos.
Ejemplos
julia> diagm([1,2,3])
3×3 Matrix{Int64}:
1 0 0
0 2 0
0 0 3
LinearAlgebra.rank
— Functionrank(::QRSparse{Tv,Ti}) -> Ti
Devuelve el rango de la factorización QR
rank(S::SparseMatrixCSC{Tv,Ti}; [tol::Real]) -> Ti
Calcula el rango de S
calculando su factorización QR. Los valores menores que tol
se consideran cero. Consulta el manual de SPQR.
rank(A::AbstractMatrix; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
rank(A::AbstractMatrix, rtol::Real)
Calcula el rango numérico de una matriz contando cuántos valores de salida de svdvals(A)
son mayores que max(atol, rtol*σ₁)
, donde σ₁
es el valor singular más grande calculado de A
. atol
y rtol
son las tolerancias absolutas y relativas, respectivamente. La tolerancia relativa por defecto es n*ϵ
, donde n
es el tamaño de la dimensión más pequeña de A
, y ϵ
es el eps
del tipo de elemento de A
.
El rango numérico puede ser una caracterización sensible e imprecisa de matrices mal condicionadas con valores singulares que están cerca de la tolerancia umbral max(atol, rtol*σ₁)
. En tales casos, ligeras perturbaciones en el cálculo del valor singular o en la matriz pueden cambiar el resultado de rank
al empujar uno o más valores singulares a través del umbral. Estas variaciones pueden incluso ocurrir debido a cambios en errores de punto flotante entre diferentes versiones de Julia, arquitecturas, compiladores o sistemas operativos.
Los argumentos de palabra clave atol
y rtol
requieren al menos Julia 1.1. En Julia 1.0, rtol
está disponible como un argumento posicional, pero esto será desaprobado en Julia 2.0.
Ejemplos
julia> rank(Matrix(I, 3, 3))
3
julia> rank(diagm(0 => [1, 0, 2]))
2
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.1)
2
julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.00001)
3
julia> rank(diagm(0 => [1, 0.001, 2]), atol=1.5)
1
LinearAlgebra.norm
— Functionnorm(A, p::Real=2)
Para cualquier contenedor iterable A
(incluyendo arreglos de cualquier dimensión) de números (o cualquier tipo de elemento para el cual norm
está definido), calcula la p
-norma (por defecto p=2
) como si A
fuera un vector de la longitud correspondiente.
La p
-norma se define como
\[\|A\|_p = \left( \sum_{i=1}^n | a_i | ^p \right)^{1/p}\]
con $a_i$ las entradas de A
, $| a_i |$ la norm
de $a_i$, y $n$ la longitud de A
. Dado que la p
-norma se calcula utilizando las norm
s de las entradas de A$, la
p-norma de un vector de vectores no es compatible con la interpretación de este como un vector bloque en general si
p != 2`.
p
puede asumir cualquier valor numérico (aunque no todos los valores producen una norma de vector matemáticamente válida). En particular, norm(A, Inf)
devuelve el valor más grande en abs.(A)
, mientras que norm(A, -Inf)
devuelve el más pequeño. Si A
es una matriz y p=2
, entonces esto es equivalente a la norma de Frobenius.
El segundo argumento p
no es necesariamente parte de la interfaz para norm
, es decir, un tipo personalizado puede implementar solo norm(A)
sin el segundo argumento.
Usa opnorm
para calcular la norma del operador de una matriz.
Ejemplos
julia> v = [3, -2, 6]
3-element Vector{Int64}:
3
-2
6
julia> norm(v)
7.0
julia> norm(v, 1)
11.0
julia> norm(v, Inf)
6.0
julia> norm([1 2 3; 4 5 6; 7 8 9])
16.881943016134134
julia> norm([1 2 3 4 5 6 7 8 9])
16.881943016134134
julia> norm(1:9)
16.881943016134134
julia> norm(hcat(v,v), 1) == norm(vcat(v,v), 1) != norm([v,v], 1)
true
julia> norm(hcat(v,v), 2) == norm(vcat(v,v), 2) == norm([v,v], 2)
true
julia> norm(hcat(v,v), Inf) == norm(vcat(v,v), Inf) != norm([v,v], Inf)
true
norm(x::Number, p::Real=2)
Para números, devuelve $\left( |x|^p \right)^{1/p}$.
Ejemplos
julia> norm(2, 1)
2.0
julia> norm(-2, 1)
2.0
julia> norm(2, 2)
2.0
julia> norm(-2, 2)
2.0
julia> norm(2, Inf)
2.0
julia> norm(-2, Inf)
2.0
LinearAlgebra.opnorm
— Functionopnorm(A::AbstractMatrix, p::Real=2)
Calcula la norma del operador (o norma de matriz) inducida por la norma vectorial p
, donde los valores válidos de p
son 1
, 2
o Inf
. (Ten en cuenta que para matrices dispersas, p=2
actualmente no está implementado). Usa norm
para calcular la norma de Frobenius.
Cuando p=1
, la norma del operador es la suma máxima de columnas absolutas de A
:
\[\|A\|_1 = \max_{1 ≤ j ≤ n} \sum_{i=1}^m | a_{ij} |\]
con $a_{ij}$ las entradas de $A$, y $m$ y $n$ sus dimensiones.
Cuando p=2
, la norma del operador es la norma espectral, igual al mayor valor singular de A
.
Cuando p=Inf
, la norma del operador es la suma máxima de filas absolutas de A
:
\[\|A\|_\infty = \max_{1 ≤ i ≤ m} \sum _{j=1}^n | a_{ij} |\]
Ejemplos
julia> A = [1 -2 -3; 2 3 -1]
2×3 Matrix{Int64}:
1 -2 -3
2 3 -1
julia> opnorm(A, Inf)
6.0
julia> opnorm(A, 1)
5.0
opnorm(x::Number, p::Real=2)
Para números, devuelve $\left( |x|^p \right)^{1/p}$. Esto es equivalente a norm
.
opnorm(A::Adjoint{<:Any,<:AbstractVector}, q::Real=2)
opnorm(A::Transpose{<:Any,<:AbstractVector}, q::Real=2)
Para vectores envueltos en Adjoint/Transpose, devuelve el operador $q$-norm de A
, que es equivalente al p
-norm con valor p = q/(q-1)
. Coinciden en p = q = 2
. Usa norm
para calcular el p
norm de A
como un vector.
La diferencia en la norma entre un espacio vectorial y su dual surge para preservar la relación entre dualidad y el producto punto, y el resultado es consistente con el operador p
-norm de una matriz 1 × n
.
Ejemplos
julia> v = [1; im];
julia> vc = v';
julia> opnorm(vc, 1)
1.0
julia> norm(vc, 1)
2.0
julia> norm(v, 1)
2.0
julia> opnorm(vc, 2)
1.4142135623730951
julia> norm(vc, 2)
1.4142135623730951
julia> norm(v, 2)
1.4142135623730951
julia> opnorm(vc, Inf)
2.0
julia> norm(vc, Inf)
1.0
julia> norm(v, Inf)
1.0
LinearAlgebra.normalize!
— Functionnormalize!(a::AbstractArray, p::Real=2)
Normaliza el arreglo a
en su lugar para que su p
-norma sea igual a la unidad, es decir, norm(a, p) == 1
. Consulta también normalize
y norm
.
LinearAlgebra.normalize
— Functionnormalize(a, p::Real=2)
Normaliza a
de modo que su p
-norma sea igual a la unidad, es decir, norm(a, p) == 1
. Para escalares, esto es similar a sign(a), excepto que normalize(0) = NaN. Consulta también normalize!
, norm
, y sign
.
Ejemplos
julia> a = [1,2,4];
julia> b = normalize(a)
3-element Vector{Float64}:
0.2182178902359924
0.4364357804719848
0.8728715609439696
julia> norm(b)
1.0
julia> c = normalize(a, 1)
3-element Vector{Float64}:
0.14285714285714285
0.2857142857142857
0.5714285714285714
julia> norm(c, 1)
1.0
julia> a = [1 2 4 ; 1 2 4]
2×3 Matrix{Int64}:
1 2 4
1 2 4
julia> norm(a)
6.48074069840786
julia> normalize(a)
2×3 Matrix{Float64}:
0.154303 0.308607 0.617213
0.154303 0.308607 0.617213
julia> normalize(3, 1)
1.0
julia> normalize(-8, 1)
-1.0
julia> normalize(0, 1)
NaN
LinearAlgebra.cond
— Functioncond(M, p::Real=2)
Número de condición de la matriz M
, calculado utilizando la norma del operador p
. Los valores válidos para p
son 1
, 2
(por defecto) o Inf
.
LinearAlgebra.condskeel
— Functioncondskeel(M, [x, p::Real=Inf])
\[\kappa_S(M, p) = \left\Vert \left\vert M \right\vert \left\vert M^{-1} \right\vert \right\Vert_p \\ \kappa_S(M, x, p) = \frac{\left\Vert \left\vert M \right\vert \left\vert M^{-1} \right\vert \left\vert x \right\vert \right\Vert_p}{\left \Vert x \right \Vert_p}\]
El número de condición de Skeel $\kappa_S$ de la matriz M
, opcionalmente con respecto al vector x
, se calcula utilizando la norma del operador p
. $\left\vert M \right\vert$ denota la matriz de valores absolutos (por entrada) de $M$; $\left\vert M \right\vert_{ij} = \left\vert M_{ij} \right\vert$. Los valores válidos para p
son 1
, 2
e Inf
(por defecto).
Esta cantidad también se conoce en la literatura como el número de condición de Bauer, número de condición relativo o número de condición relativo por componente.
LinearAlgebra.tr
— Functiontr(M)
Traza de la matriz. Suma los elementos diagonales de M
.
Ejemplos
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> tr(A)
5
LinearAlgebra.det
— Functiondet(M)
Determinante de la matriz.
Véase también: logdet
y logabsdet
.
Ejemplos
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> det(M)
2.0
LinearAlgebra.logdet
— Functionlogdet(M)
Logaritmo del determinante de la matriz. Equivalente a log(det(M))
, pero puede proporcionar mayor precisión y evita desbordamiento/subdesbordamiento.
Ejemplos
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> logdet(M)
0.6931471805599453
julia> logdet(Matrix(I, 3, 3))
0.0
LinearAlgebra.logabsdet
— Functionlogabsdet(M)
Logaritmo del valor absoluto del determinante de la matriz. Equivalente a (log(abs(det(M))), sign(det(M)))
, pero puede proporcionar mayor precisión y/o velocidad.
Ejemplos
julia> A = [-1. 0.; 0. 1.]
2×2 Matrix{Float64}:
-1.0 0.0
0.0 1.0
julia> det(A)
-1.0
julia> logabsdet(A)
(0.0, -1.0)
julia> B = [2. 0.; 0. 1.]
2×2 Matrix{Float64}:
2.0 0.0
0.0 1.0
julia> det(B)
2.0
julia> logabsdet(B)
(0.6931471805599453, 1.0)
Base.inv
— Methodinv(M)
Inversa de matriz. Calcula la matriz N
tal que M * N = I
, donde I
es la matriz identidad. Se calcula resolviendo la división izquierda N = M \ I
.
Ejemplos
julia> M = [2 5; 1 3]
2×2 Matrix{Int64}:
2 5
1 3
julia> N = inv(M)
2×2 Matrix{Float64}:
3.0 -5.0
-1.0 2.0
julia> M*N == N*M == Matrix(I, 2, 2)
true
LinearAlgebra.pinv
— Functionpinv(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
pinv(M, rtol::Real) = pinv(M; rtol=rtol) # será desaprobado en Julia 2.0
Calcula la pseudoinversa de Moore-Penrose.
Para matrices M
con elementos de punto flotante, es conveniente calcular la pseudoinversa invirtiendo solo los valores singulares mayores que max(atol, rtol*σ₁)
donde σ₁
es el mayor valor singular de M
.
La elección óptima de la tolerancia absoluta (atol
) y la tolerancia relativa (rtol
) varía tanto con el valor de M
como con la aplicación prevista de la pseudoinversa. La tolerancia relativa predeterminada es n*ϵ
, donde n
es el tamaño de la dimensión más pequeña de M
, y ϵ
es el eps
del tipo de elemento de M
.
Para invertir matrices densas mal condicionadas en un sentido de mínimos cuadrados, se recomienda rtol = sqrt(eps(real(float(oneunit(eltype(M))))))
.
Para más información, consulte [issue8859], [B96], [S84], [KY88].
Ejemplos
julia> M = [1.5 1.3; 1.2 1.9]
2×2 Matrix{Float64}:
1.5 1.3
1.2 1.9
julia> N = pinv(M)
2×2 Matrix{Float64}:
1.47287 -1.00775
-0.930233 1.16279
julia> M * N
2×2 Matrix{Float64}:
1.0 -2.22045e-16
4.44089e-16 1.0
LinearAlgebra.nullspace
— Functionnullspace(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
nullspace(M, rtol::Real) = nullspace(M; rtol=rtol) # será desaprobado en Julia 2.0
Calcula una base para el espacio nulo de `M` incluyendo los vectores singulares de `M` cuyos valores singulares tienen magnitudes menores que `max(atol, rtol*σ₁)`, donde `σ₁` es el mayor valor singular de `M`.
Por defecto, la tolerancia relativa `rtol` es `n*ϵ`, donde `n` es el tamaño de la dimensión más pequeña de `M`, y `ϵ` es el [`eps`](@ref) del tipo de elemento de `M`.
# Ejemplos
jldoctest julia> M = [1 0 0; 0 1 0; 0 0 0] 3×3 Matrix{Int64}: 1 0 0 0 1 0 0 0 0
julia> nullspace(M) 3×1 Matrix{Float64}: 0.0 0.0 1.0
julia> nullspace(M, rtol=3) 3×3 Matrix{Float64}: 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0
julia> nullspace(M, atol=0.95) 3×1 Matrix{Float64}: 0.0 0.0 1.0 ```
Base.kron
— Functionkron(A, B)
Calcula el producto de Kronecker de dos vectores, matrices o números.
Para vectores reales v
y w
, el producto de Kronecker está relacionado con el producto exterior por kron(v,w) == vec(w * transpose(v))
o w * transpose(v) == reshape(kron(v,w), (length(w), length(v)))
. Nota cómo el orden de v
y w
difiere a la izquierda y a la derecha de estas expresiones (debido al almacenamiento por columnas). Para vectores complejos, el producto exterior w * v'
también difiere por la conjugación de v
.
Ejemplos
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> B = [im 1; 1 -im]
2×2 Matrix{Complex{Int64}}:
0+1im 1+0im
1+0im 0-1im
julia> kron(A, B)
4×4 Matrix{Complex{Int64}}:
0+1im 1+0im 0+2im 2+0im
1+0im 0-1im 2+0im 0-2im
0+3im 3+0im 0+4im 4+0im
3+0im 0-3im 4+0im 0-4im
julia> v = [1, 2]; w = [3, 4, 5];
julia> w*transpose(v)
3×2 Matrix{Int64}:
3 6
4 8
5 10
julia> reshape(kron(v,w), (length(w), length(v)))
3×2 Matrix{Int64}:
3 6
4 8
5 10
Base.kron!
— Functionkron!(C, A, B)
Calcula el producto de Kronecker de A
y B
y almacena el resultado en C
, sobrescribiendo el contenido existente de C
. Esta es la versión en su lugar de kron
.
Esta función requiere Julia 1.6 o posterior.
Base.exp
— Methodexp(A::AbstractMatrix)
Calcula la exponencial de la matriz de A
, definida por
\[e^A = \sum_{n=0}^{\infty} \frac{A^n}{n!}.\]
Para A
simétrica o hermítica, se utiliza una descomposición en valores propios (eigen
), de lo contrario se elige el algoritmo de escalado y cuadrado (ver [H05]).
Ejemplos
julia> A = Matrix(1.0I, 2, 2)
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
julia> exp(A)
2×2 Matrix{Float64}:
2.71828 0.0
0.0 2.71828
Base.cis
— Methodcis(A::AbstractMatrix)
Método más eficiente para exp(im*A)
de la matriz cuadrada A
(especialmente si A
es Hermitiana
o Simétrica
real).
Véase también cispi
, sincos
, exp
.
El soporte para usar cis
con matrices se agregó en Julia 1.7.
Ejemplos
julia> cis([π 0; 0 π]) ≈ -I
true
Base.:^
— Method^(A::AbstractMatrix, p::Number)
Potencia de matriz, equivalente a $\exp(p\log(A))$
Ejemplos
julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
1 26
0 27
Base.:^
— Method^(b::Número, A::MatrizAbstracta)
Exponencial de matriz, equivalente a $\exp(\log(b)A)$.
Se agregó soporte para elevar números Irrational
(como ℯ
) a una matriz en Julia 1.1.
Ejemplos
julia> 2^[1 2; 0 3]
2×2 Matriz{Float64}:
2.0 6.0
0.0 8.0
julia> ℯ^[1 2; 0 3]
2×2 Matriz{Float64}:
2.71828 17.3673
0.0 20.0855
Base.log
— Methodlog(A::AbstractMatrix)
Si A
no tiene valores propios reales negativos, calcula el logaritmo matricial principal de A
, es decir, la matriz única $X$ tal que $e^X = A$ y $-\pi < Im(\lambda) < \pi$ para todos los valores propios $\lambda$ de $X$. Si A
tiene valores propios no positivos, se devuelve una función matricial no principal siempre que sea posible.
Si A
es simétrica o hermítica, se utiliza su descomposición en valores propios (eigen
), si A
es triangular se emplea una versión mejorada del método de escalado inverso y cuadrado (ver [AH12] y [AHR13]). Si A
es real sin valores propios negativos, entonces se calcula la forma de Schur real. De lo contrario, se calcula la forma de Schur compleja. Luego se utiliza el algoritmo triangular superior (cuasi-)triangular en [AHR13] sobre el factor (cuasi-)triangular superior.
Ejemplos
julia> A = Matrix(2.7182818*I, 2, 2)
2×2 Matrix{Float64}:
2.71828 0.0
0.0 2.71828
julia> log(A)
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
Base.sqrt
— Methodsqrt(x)
Devuelve $\sqrt{x}$.
Lanza DomainError
para argumentos Real
negativos. Usa argumentos negativos complejos en su lugar. Ten en cuenta que sqrt
tiene un corte de rama a lo largo del eje real negativo.
El operador prefijo √
es equivalente a sqrt
.
Véase también: hypot
.
Ejemplos
julia> sqrt(big(81))
9.0
julia> sqrt(big(-81))
ERROR: DomainError con -81.0:
Resultado NaN para entrada no-NaN.
Stacktrace:
[1] sqrt(::BigFloat) at ./mpfr.jl:501
[...]
julia> sqrt(big(complex(-81)))
0.0 + 9.0im
julia> sqrt(-81 - 0.0im) # -0.0im está por debajo del corte de rama
0.0 - 9.0im
julia> .√(1:4)
Vector de 4 elementos{Float64}:
1.0
1.4142135623730951
1.7320508075688772
2.0
sqrt(A::AbstractMatrix)
Si A
no tiene valores propios reales negativos, calcula la raíz cuadrada principal de la matriz A
, es decir, la matriz única $X$ con valores propios que tienen parte real positiva tal que $X^2 = A$. De lo contrario, se devuelve una raíz cuadrada no principal.
Si A
es simétrica real o hermítica, se utiliza su descomposición en valores propios (eigen
) para calcular la raíz cuadrada. Para tales matrices, los valores propios λ que parecen ser ligeramente negativos debido a errores de redondeo se tratan como si fueran cero. Más precisamente, las matrices con todos los valores propios ≥ -rtol*(max |λ|)
se tratan como semidefinidas (produciendo una raíz cuadrada hermítica), con los valores propios negativos considerados como cero. rtol
es un argumento de palabra clave para sqrt
(solo en el caso hermítico/simétrico real) que por defecto es la precisión de la máquina escalada por size(A,1)
.
De lo contrario, la raíz cuadrada se determina por medio del método de Björck-Hammarling [BH83], que calcula la forma de Schur compleja (schur
) y luego la raíz cuadrada compleja del factor triangular. Si existe una raíz cuadrada real, entonces se utiliza una extensión de este método [H87] que calcula la forma de Schur real y luego la raíz cuadrada real del factor cuasi-triangular.
Ejemplos
julia> A = [4 0; 0 4]
2×2 Matrix{Int64}:
4 0
0 4
julia> sqrt(A)
2×2 Matrix{Float64}:
2.0 0.0
0.0 2.0
Base.Math.cbrt
— Methodcbrt(A::AbstractMatrix{<:Real})
Calcula la raíz cúbica de valor real de una matriz de valor real A
. Si T = cbrt(A)
, entonces tenemos T*T*T ≈ A
, ver el ejemplo dado a continuación.
Si A
es simétrica, es decir, de tipo HermOrSym{<:Real}
, entonces se utiliza (eigen
) para encontrar la raíz cúbica. De lo contrario, se utiliza una versión especializada del algoritmo de raíz p-ésima [S03], que explota la descomposición de Schur de valor real (schur
) para calcular la raíz cúbica.
Ejemplos
julia> A = [0.927524 -0.15857; -1.3677 -1.01172]
2×2 Matrix{Float64}:
0.927524 -0.15857
-1.3677 -1.01172
julia> T = cbrt(A)
2×2 Matrix{Float64}:
0.910077 -0.151019
-1.30257 -0.936818
julia> T*T*T ≈ A
true
Base.cos
— Methodcos(A::AbstractMatrix)
Calcula el coseno de matriz de una matriz cuadrada A
.
Si A
es simétrica o hermítica, se utiliza su descomposición en valores propios (eigen
) para calcular el coseno. De lo contrario, el coseno se determina llamando a exp
.
Ejemplos
julia> cos(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.sin
— Methodsin(A::AbstractMatrix)
Calcula el seno de matriz de una matriz cuadrada A
.
Si A
es simétrica o hermitiana, se utiliza su descomposición en valores propios (eigen
) para calcular el seno. De lo contrario, el seno se determina llamando a exp
.
Ejemplos
julia> sin(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.454649 0.454649
0.454649 0.454649
Base.Math.sincos
— Methodsincos(A::AbstractMatrix)
Calcula el seno y el coseno de matriz de una matriz cuadrada A
.
Ejemplos
julia> S, C = sincos(fill(1.0, (2,2)));
julia> S
2×2 Matrix{Float64}:
0.454649 0.454649
0.454649 0.454649
julia> C
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.tan
— Methodtan(A::AbstractMatrix)
Calcula la tangente de matriz de una matriz cuadrada A
.
Si A
es simétrica o hermítica, se utiliza su descomposición en valores propios (eigen
) para calcular la tangente. De lo contrario, la tangente se determina llamando a exp
.
Ejemplos
julia> tan(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
-1.09252 -1.09252
-1.09252 -1.09252
Base.Math.sec
— Methodsec(A::AbstractMatrix)
Calcula la secante de matriz de una matriz cuadrada A
.
Base.Math.csc
— Methodcsc(A::AbstractMatrix)
Calcula la cosecante de matriz de una matriz cuadrada A
.
Base.Math.cot
— Methodcot(A::AbstractMatrix)
Calcula la cotangente de matriz de una matriz cuadrada A
.
Base.cosh
— Methodcosh(A::AbstractMatrix)
Calcula el coseno hiperbólico de matriz de una matriz cuadrada A
.
Base.sinh
— Methodsinh(A::AbstractMatrix)
Calcula el seno hiperbólico de matriz de una matriz cuadrada A
.
Base.tanh
— Methodtanh(A::AbstractMatrix)
Calcula la tangente hiperbólica de una matriz cuadrada A
.
Base.Math.sech
— Methodsech(A::AbstractMatrix)
Calcula la secante hiperbólica de matriz del cuadrado A
.
Base.Math.csch
— Methodcsch(A::AbstractMatrix)
Calcula la cosecante hiperbólica de matriz del cuadrado A
.
Base.Math.coth
— Methodcoth(A::AbstractMatrix)
Calcula la cotangente hiperbólica de matriz del cuadrado A
.
Base.acos
— Methodacos(A::AbstractMatrix)
Calcula el coseno inverso de una matriz cuadrada A
.
Si A
es simétrica o hermítica, se utiliza su descomposición en valores propios (eigen
) para calcular el coseno inverso. De lo contrario, el coseno inverso se determina utilizando log
y sqrt
. Para la teoría y las fórmulas logarítmicas utilizadas para calcular esta función, consulte [AH16_1].
Ejemplos
julia> acos(cos([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5-8.32667e-17im 0.1+0.0im
-0.2+2.63678e-16im 0.3-3.46945e-16im
Base.asin
— Methodasin(A::AbstractMatrix)
Calcula el seno inverso de una matriz cuadrada A
.
Si A
es simétrica o hermítica, se utiliza su descomposición en valores propios (eigen
) para calcular el seno inverso. De lo contrario, el seno inverso se determina utilizando log
y sqrt
. Para la teoría y las fórmulas logarítmicas utilizadas para calcular esta función, consulte [AH16_2].
Ejemplos
julia> asin(sin([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5-4.16334e-17im 0.1-5.55112e-17im
-0.2+9.71445e-17im 0.3-1.249e-16im
Base.atan
— Methodatan(A::AbstractMatrix)
Calcula la tangente inversa de una matriz cuadrada A
.
Si A
es simétrica o hermítica, se utiliza su descomposición en valores propios (eigen
) para calcular la tangente inversa. De lo contrario, la tangente inversa se determina utilizando log
. Para la teoría y las fórmulas logarítmicas utilizadas para calcular esta función, consulte [AH16_3].
Ejemplos
julia> atan(tan([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5+1.38778e-17im 0.1-2.77556e-17im
-0.2+6.93889e-17im 0.3-4.16334e-17im
Base.Math.asec
— Methodasec(A::AbstractMatrix)
Calcula la matriz secante inversa de A
.
Base.Math.acsc
— Methodacsc(A::AbstractMatrix)
Calcula la cosecante de la matriz inversa de A
.
Base.Math.acot
— Methodacot(A::AbstractMatrix)
Calcula la matriz cotangente inversa de A
.
Base.acosh
— Methodacosh(A::AbstractMatrix)
Calcula el coseno hiperbólico inverso de una matriz cuadrada A
. Para la teoría y las fórmulas logarítmicas utilizadas para calcular esta función, consulta [AH16_4].
Base.asinh
— Methodasinh(A::AbstractMatrix)
Calcula el seno hiperbólico inverso de una matriz cuadrada A
. Para la teoría y las fórmulas logarítmicas utilizadas para calcular esta función, consulta [AH16_5].
Base.atanh
— Methodatanh(A::AbstractMatrix)
Calcula la tangente hiperbólica inversa de una matriz cuadrada A
. Para la teoría y las fórmulas logarítmicas utilizadas para calcular esta función, consulta [AH16_6].
Base.Math.asech
— Methodasech(A::AbstractMatrix)
Calcula la secante hiperbólica inversa de A
.
Base.Math.acsch
— Methodacsch(A::AbstractMatrix)
Calcula la cosecante hiperbólica inversa de la matriz A
.
Base.Math.acoth
— Methodacoth(A::AbstractMatrix)
Calcula la cotangente hiperbólica inversa de A
.
LinearAlgebra.lyap
— Functionlyap(A, C)
Calcula la solución X
de la ecuación de Lyapunov continua AX + XA' + C = 0
, donde ningún valor propio de A
tiene una parte real cero y ningún par de valores propios son conjugados complejos negativos entre sí.
Ejemplos
julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
3.0 4.0
5.0 6.0
julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
1.0 1.0
1.0 2.0
julia> X = lyap(A, B)
2×2 Matrix{Float64}:
0.5 -0.5
-0.5 0.25
julia> A*X + X*A' ≈ -B
true
LinearAlgebra.sylvester
— Functionsylvester(A, B, C)
Calcula la solución X
de la ecuación de Sylvester AX + XB + C = 0
, donde A
, B
y C
tienen dimensiones compatibles y A
y -B
no tienen valores propios con la misma parte real.
Ejemplos
julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
3.0 4.0
5.0 6.0
julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
1.0 1.0
1.0 2.0
julia> C = [1. 2.; -2. 1]
2×2 Matrix{Float64}:
1.0 2.0
-2.0 1.0
julia> X = sylvester(A, B, C)
2×2 Matrix{Float64}:
-4.46667 1.93333
3.73333 -1.8
julia> A*X + X*B ≈ -C
true
LinearAlgebra.issuccess
— Functionissuccess(F::Factorization)
Prueba que una factorización de una matriz tuvo éxito.
issuccess(::CholeskyPivoted)
requiere Julia 1.6 o posterior.
Ejemplos
julia> F = cholesky([1 0; 0 1]);
julia> issuccess(F)
true
issuccess(F::LU; allowsingular = false)
Prueba que la factorización LU de una matriz tuvo éxito. Por defecto, una factorización que produce un factor U válido pero deficiente en rango se considera un fallo. Esto se puede cambiar pasando allowsingular = true
.
El argumento de palabra clave allowsingular
se agregó en Julia 1.11.
Ejemplos
julia> F = lu([1 2; 1 2], check = false);
julia> issuccess(F)
false
julia> issuccess(F, allowsingular = true)
true
LinearAlgebra.issymmetric
— Functionissymmetric(A) -> Bool
Prueba si una matriz es simétrica.
Ejemplos
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> issymmetric(a)
true
julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
1+0im 0+1im
0-1im 1+0im
julia> issymmetric(b)
false
LinearAlgebra.isposdef
— Functionisposdef(A) -> Bool
Prueba si una matriz es definida positiva (y Hermitiana) intentando realizar una factorización de Cholesky de A
.
Ver también isposdef!
, cholesky
.
Ejemplos
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> isposdef(A)
true
LinearAlgebra.isposdef!
— Functionisposdef!(A) -> Bool
Prueba si una matriz es definida positiva (y Hermitiana) intentando realizar una factorización de Cholesky de A
, sobrescribiendo A
en el proceso. Ver también isposdef
.
Ejemplos
julia> A = [1. 2.; 2. 50.];
julia> isposdef!(A)
true
julia> A
2×2 Matrix{Float64}:
1.0 2.0
2.0 6.78233
LinearAlgebra.istril
— Functionistril(A::AbstractMatrix, k::Integer = 0) -> Bool
Prueba si A
es triangular inferior comenzando desde la k
-ésima superdiagonal.
Ejemplos
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> istril(a)
false
julia> istril(a, 1)
true
julia> c = [1 1 0; 1 1 1; 1 1 1]
3×3 Matrix{Int64}:
1 1 0
1 1 1
1 1 1
julia> istril(c)
false
julia> istril(c, 1)
true
LinearAlgebra.istriu
— Functionistriu(A::AbstractMatrix, k::Integer = 0) -> Bool
Prueba si A
es triangular superior comenzando desde la k
-ésima superdiagonal.
Ejemplos
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> istriu(a)
false
julia> istriu(a, -1)
true
julia> c = [1 1 1; 1 1 1; 0 1 1]
3×3 Matrix{Int64}:
1 1 1
1 1 1
0 1 1
julia> istriu(c)
false
julia> istriu(c, -1)
true
LinearAlgebra.isdiag
— Functionisdiag(A) -> Bool
Prueba si una matriz es diagonal en el sentido de que iszero(A[i,j])
es verdadero a menos que i == j
. Ten en cuenta que no es necesario que A
sea cuadrada; si también deseas verificar eso, necesitas comprobar que size(A, 1) == size(A, 2)
.
Ejemplos
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> isdiag(a)
false
julia> b = [im 0; 0 -im]
2×2 Matrix{Complex{Int64}}:
0+1im 0+0im
0+0im 0-1im
julia> isdiag(b)
true
julia> c = [1 0 0; 0 2 0]
2×3 Matrix{Int64}:
1 0 0
0 2 0
julia> isdiag(c)
true
julia> d = [1 0 0; 0 2 3]
2×3 Matrix{Int64}:
1 0 0
0 2 3
julia> isdiag(d)
false
LinearAlgebra.ishermitian
— Functionishermitian(A) -> Bool
Prueba si una matriz es Hermitiana.
Ejemplos
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> ishermitian(a)
true
julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
1+0im 0+1im
0-1im 1+0im
julia> ishermitian(b)
true
Base.transpose
— Functiontranspose(A)
Transposición perezosa. Mutar el objeto devuelto debería mutar apropiadamente A
. A menudo, pero no siempre, produce Transpose(A)
, donde Transpose
es un envoltorio de transposición perezosa. Tenga en cuenta que esta operación es recursiva.
Esta operación está destinada al uso en álgebra lineal; para manipulación de datos general, consulte permutedims
, que no es recursiva.
Ejemplos
julia> A = [3 2; 0 0]
2×2 Matrix{Int64}:
3 2
0 0
julia> B = transpose(A)
2×2 transpose(::Matrix{Int64}) with eltype Int64:
3 0
2 0
julia> B isa Transpose
true
julia> transpose(B) === A # la transposición de una transposición desenvuelve el padre
true
julia> Transpose(B) # sin embargo, el constructor siempre envuelve su argumento
2×2 transpose(transpose(::Matrix{Int64})) with eltype Int64:
3 2
0 0
julia> B[1,2] = 4; # modificar B modificará A automáticamente
julia> A
2×2 Matrix{Int64}:
3 2
4 0
Para matrices complejas, la operación adjoint
es equivalente a una transposición conjugada.
julia> A = reshape([Complex(x, x) for x in 1:4], 2, 2)
2×2 Matrix{Complex{Int64}}:
1+1im 3+3im
2+2im 4+4im
julia> adjoint(A) == conj(transpose(A))
true
La transpose
de un AbstractVector
es un vector fila:
julia> v = [1,2,3]
3-element Vector{Int64}:
1
2
3
julia> transpose(v) # devuelve un vector fila
1×3 transpose(::Vector{Int64}) with eltype Int64:
1 2 3
julia> transpose(v) * v # calcular el producto punto
14
Para una matriz de matrices, los bloques individuales se operan recursivamente:
julia> C = [1 3; 2 4]
2×2 Matrix{Int64}:
1 3
2 4
julia> D = reshape([C, 2C, 3C, 4C], 2, 2) # construir una matriz de bloques
2×2 Matrix{Matrix{Int64}}:
[1 3; 2 4] [3 9; 6 12]
[2 6; 4 8] [4 12; 8 16]
julia> transpose(D) # los bloques se transponen recursivamente
2×2 transpose(::Matrix{Matrix{Int64}}) with eltype Transpose{Int64, Matrix{Int64}}:
[1 2; 3 4] [2 4; 6 8]
[3 6; 9 12] [4 8; 12 16]
transpose(F::Factorization)
Transposición perezosa de la factorización F
. Por defecto, devuelve una TransposeFactorization
, excepto para Factorization
s con eltype
real, en cuyo caso devuelve una AdjointFactorization
.
LinearAlgebra.transpose!
— Functiontranspose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) donde {Tv,Ti}
Transpone la matriz A
y la almacena en la matriz X
. size(X)
debe ser igual a size(transpose(A))
. No se asigna memoria adicional más allá de redimensionar rowval
y nzval
de X
, si es necesario.
Consulta halfperm!
transpose!(dest,src)
Transponer el arreglo src
y almacenar el resultado en el arreglo preasignado dest
, que debe tener un tamaño correspondiente a (size(src,2),size(src,1))
. No se admite la transposición en el lugar y ocurrirán resultados inesperados si src
y dest
tienen regiones de memoria superpuestas.
Ejemplos
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
0+0im 0+0im
0+0im 0+0im
julia> transpose!(B, A);
julia> B
2×2 Matrix{Complex{Int64}}:
3+2im 8+7im
9+2im 4+6im
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
LinearAlgebra.Transpose
— TypeTransponer
Tipo de envoltura perezosa para una vista transpuesta del objeto de álgebra lineal subyacente, generalmente un AbstractVector
/AbstractMatrix
. Por lo general, el constructor Transpose
no debe ser llamado directamente, usa transpose
en su lugar. Para materializar la vista, usa copy
.
Este tipo está destinado para uso en álgebra lineal; para manipulación de datos general, consulta permutedims
.
Ejemplos
julia> A = [2 3; 0 0]
2×2 Matrix{Int64}:
2 3
0 0
julia> Transpose(A)
2×2 transpose(::Matrix{Int64}) with eltype Int64:
2 0
3 0
LinearAlgebra.TransposeFactorization
— TypeTransposeFactorization
Tipo de envoltura perezosa para la transposición del objeto Factorization
subyacente. Por lo general, el constructor TransposeFactorization
no debe ser llamado directamente, use transpose(:: Factorization)
en su lugar.
Base.adjoint
— FunctionA'
adjoint(A)
Adjunto perezoso (transposición conjugada). Tenga en cuenta que adjoint
se aplica recursivamente a los elementos.
Para los tipos numéricos, adjoint
devuelve el conjugado complejo y, por lo tanto, es equivalente a la función identidad para números reales.
Esta operación está destinada al uso en álgebra lineal; para manipulación de datos general, consulte permutedims
.
Ejemplos
julia> A = [3+2im 9+2im; 0 0]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
0+0im 0+0im
julia> B = A' # equivalentemente adjoint(A)
2×2 adjoint(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
3-2im 0+0im
9-2im 0+0im
julia> B isa Adjoint
true
julia> adjoint(B) === A # el adjunto de un adjunto desenvuelve el padre
true
julia> Adjoint(B) # sin embargo, el constructor siempre envuelve su argumento
2×2 adjoint(adjoint(::Matrix{Complex{Int64}})) with eltype Complex{Int64}:
3+2im 9+2im
0+0im 0+0im
julia> B[1,2] = 4 + 5im; # modificar B modificará A automáticamente
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
4-5im 0+0im
Para matrices reales, la operación adjoint
es equivalente a una transpose
.
julia> A = reshape([x for x in 1:4], 2, 2)
2×2 Matrix{Int64}:
1 3
2 4
julia> A'
2×2 adjoint(::Matrix{Int64}) with eltype Int64:
1 2
3 4
julia> adjoint(A) == transpose(A)
true
El adjunto de un AbstractVector
es un vector fila:
julia> x = [3, 4im]
2-element Vector{Complex{Int64}}:
3 + 0im
0 + 4im
julia> x'
1×2 adjoint(::Vector{Complex{Int64}}) with eltype Complex{Int64}:
3+0im 0-4im
julia> x'x # calcular el producto punto, equivalentemente x' * x
25 + 0im
Para una matriz de matrices, los bloques individuales se operan recursivamente:
julia> A = reshape([x + im*x for x in 1:4], 2, 2)
2×2 Matrix{Complex{Int64}}:
1+1im 3+3im
2+2im 4+4im
julia> C = reshape([A, 2A, 3A, 4A], 2, 2)
2×2 Matrix{Matrix{Complex{Int64}}}:
[1+1im 3+3im; 2+2im 4+4im] [3+3im 9+9im; 6+6im 12+12im]
[2+2im 6+6im; 4+4im 8+8im] [4+4im 12+12im; 8+8im 16+16im]
julia> C'
2×2 adjoint(::Matrix{Matrix{Complex{Int64}}}) with eltype Adjoint{Complex{Int64}, Matrix{Complex{Int64}}}:
[1-1im 2-2im; 3-3im 4-4im] [2-2im 4-4im; 6-6im 8-8im]
[3-3im 6-6im; 9-9im 12-12im] [4-4im 8-8im; 12-12im 16-16im]
adjunto(F::Factorización)
Adjunto perezoso de la factorización F
. Por defecto, devuelve un envoltorio AdjointFactorization
.
LinearAlgebra.adjoint!
— Functionadjoint!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
Transpone la matriz A
y almacena el adjunto de los elementos en la matriz X
. size(X)
debe ser igual a size(transpose(A))
. No se asigna memoria adicional más que el redimensionamiento de rowval
y nzval
de X
, si es necesario.
Consulta halfperm!
adjoint!(dest,src)
Transponer conjugado el arreglo src
y almacenar el resultado en el arreglo preasignado dest
, que debe tener un tamaño correspondiente a (size(src,2),size(src,1))
. No se admite la transposición en el lugar y ocurrirán resultados inesperados si src
y dest
tienen regiones de memoria superpuestas.
Ejemplos
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
0+0im 0+0im
0+0im 0+0im
julia> adjoint!(B, A);
julia> B
2×2 Matrix{Complex{Int64}}:
3-2im 8-7im
9-2im 4-6im
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
LinearAlgebra.Adjoint
— TypeAdjunto
Tipo de envoltura perezosa para una vista adjunta del objeto de álgebra lineal subyacente, generalmente un AbstractVector
/AbstractMatrix
. Por lo general, el constructor Adjoint
no debe ser llamado directamente, usa adjoint
en su lugar. Para materializar la vista, usa copy
.
Este tipo está destinado para uso en álgebra lineal; para manipulación de datos general, consulta permutedims
.
Ejemplos
julia> A = [3+2im 9+2im; 0 0]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
0+0im 0+0im
julia> Adjoint(A)
2×2 adjoint(::Matrix{Complex{Int64}}) con el tipo eltype Complex{Int64}:
3-2im 0+0im
9-2im 0+0im
LinearAlgebra.AdjointFactorization
— TypeAdjointFactorization
Tipo de envoltura perezosa para el adjunto del objeto Factorization
subyacente. Por lo general, el constructor AdjointFactorization
no debe ser llamado directamente, usa adjoint(:: Factorization)
en su lugar.
Base.copy
— Methodcopy(A::Transpose)
copy(A::Adjoint)
Evalúa de manera ansiosa la transposición/adjunto de matriz perezosa. Ten en cuenta que la transposición se aplica recursivamente a los elementos.
Esta operación está destinada para el uso en álgebra lineal; para la manipulación de datos general, consulta permutedims
, que no es recursiva.
Ejemplos
julia> A = [1 2im; -3im 4]
2×2 Matrix{Complex{Int64}}:
1+0im 0+2im
0-3im 4+0im
julia> T = transpose(A)
2×2 transpose(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
1+0im 0-3im
0+2im 4+0im
julia> copy(T)
2×2 Matrix{Complex{Int64}}:
1+0im 0-3im
0+2im 4+0im
LinearAlgebra.stride1
— Functionstride1(A) -> Int
Devuelve la distancia entre elementos sucesivos de la matriz en la dimensión 1 en unidades de tamaño de elemento.
Ejemplos
julia> A = [1,2,3,4]
4-element Vector{Int64}:
1
2
3
4
julia> LinearAlgebra.stride1(A)
1
julia> B = view(A, 2:2:4)
2-element view(::Vector{Int64}, 2:2:4) with eltype Int64:
2
4
julia> LinearAlgebra.stride1(B)
2
LinearAlgebra.checksquare
— FunctionLinearAlgebra.checksquare(A)
Verifica que una matriz sea cuadrada y luego devuelve su dimensión común. Para múltiples argumentos, devuelve un vector.
Ejemplos
julia> A = fill(1, (4,4)); B = fill(1, (5,5));
julia> LinearAlgebra.checksquare(A, B)
2-element Vector{Int64}:
4
5
LinearAlgebra.peakflops
— FunctionLinearAlgebra.peakflops(n::Integer=4096; eltype::DataType=Float64, ntrials::Integer=3, parallel::Bool=false)
peakflops
calcula la tasa máxima de flops de la computadora utilizando precisión doble gemm!
. Por defecto, si no se especifican argumentos, multiplica dos matrices Float64
de tamaño n x n
, donde n = 4096
. Si el BLAS subyacente utiliza múltiples hilos, se logran tasas de flops más altas. El número de hilos de BLAS se puede establecer con BLAS.set_num_threads(n)
.
Si se proporciona el argumento de palabra clave eltype
, peakflops
construirá matrices con elementos del tipo eltype
para calcular la tasa máxima de flops.
Por defecto, peakflops
utilizará el mejor tiempo de 3 pruebas. Si se proporciona el argumento de palabra clave ntrials
, peakflops
utilizará esa cantidad de pruebas para elegir el mejor tiempo.
Si el argumento de palabra clave parallel
se establece en true
, peakflops
se ejecuta en paralelo en todos los procesadores de trabajo. Se devuelve la tasa de flops de toda la computadora paralela. Al ejecutarse en paralelo, solo se utiliza 1 hilo de BLAS. El argumento n
sigue refiriéndose al tamaño del problema que se resuelve en cada procesador.
Esta función requiere al menos Julia 1.1. En Julia 1.0 está disponible en la biblioteca estándar InteractiveUtils
.
LinearAlgebra.hermitianpart
— Functionhermitianpart(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
Devuelve la parte hermitiana de la matriz cuadrada A
, definida como (A + A') / 2
, como una matriz Hermitian
. Para matrices reales A
, esto también se conoce como la parte simétrica de A
; a veces también se le llama la "parte real del operador". El argumento opcional uplo
controla el argumento correspondiente de la vista Hermitian
. Para matrices reales, esta última es equivalente a una vista Symmetric
.
Véase también hermitianpart!
para la operación correspondiente en su lugar.
Esta función requiere Julia 1.10 o posterior.
LinearAlgebra.hermitianpart!
— Functionhermitianpart!(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
Sobrescribe la matriz cuadrada A
en su lugar con su parte hermitiana (A + A') / 2
, y devuelve Hermitian(A, uplo)
. Para matrices reales A
, esto también se conoce como la parte simétrica de A
.
Consulta también hermitianpart
para la operación correspondiente fuera de lugar.
Esta función requiere Julia 1.10 o posterior.
LinearAlgebra.copy_adjoint!
— Functioncopy_adjoint!(B::AbstractVecOrMat, ir_dest::AbstractRange{Int}, jr_dest::AbstractRange{Int},
A::AbstractVecOrMat, ir_src::AbstractRange{Int}, jr_src::AbstractRange{Int}) -> B
Copia eficientemente los elementos de la matriz A
a B
con adjunción de la siguiente manera:
B[ir_dest, jr_dest] = adjoint(A)[jr_src, ir_src]
Los elementos B[ir_dest, jr_dest]
son sobrescritos. Además, los parámetros de rango de índice deben satisfacer length(ir_dest) == length(jr_src)
y length(jr_dest) == length(ir_src)
.
LinearAlgebra.copy_transpose!
— Functioncopy_transpose!(B::AbstractVecOrMat, ir_dest::AbstractRange{Int}, jr_dest::AbstractRange{Int},
A::AbstractVecOrMat, ir_src::AbstractRange{Int}, jr_src::AbstractRange{Int}) -> B
Copia eficientemente los elementos de la matriz A
a B
con transposición de la siguiente manera:
B[ir_dest, jr_dest] = transpose(A)[jr_src, ir_src]
Los elementos B[ir_dest, jr_dest]
son sobrescritos. Además, los parámetros de rango de índice deben satisfacer length(ir_dest) == length(jr_src)
y length(jr_dest) == length(ir_src)
.
copy_transpose!(B::AbstractMatrix, ir_dest::AbstractUnitRange, jr_dest::AbstractUnitRange,
tM::AbstractChar,
M::AbstractVecOrMat, ir_src::AbstractUnitRange, jr_src::AbstractUnitRange) -> B
Copia eficientemente los elementos de la matriz M
a B
condicionado al parámetro de carácter tM
de la siguiente manera:
tM | Destino | Fuente |
---|---|---|
'N' | B[ir_dest, jr_dest] | transpose(M)[jr_src, ir_src] |
'T' | B[ir_dest, jr_dest] | M[jr_src, ir_src] |
'C' | B[ir_dest, jr_dest] | conj(M)[jr_src, ir_src] |
Los elementos B[ir_dest, jr_dest]
son sobrescritos. Además, los parámetros de rango de índice deben satisfacer length(ir_dest) == length(jr_src)
y length(jr_dest) == length(ir_src)
.
Consulta también copyto!
y copy_adjoint!
.
Low-level matrix operations
En muchos casos, hay versiones in situ de las operaciones de matrices que te permiten proporcionar un vector o matriz de salida preasignado. Esto es útil al optimizar código crítico para evitar la sobrecarga de asignaciones repetidas. Estas operaciones in situ están sufijadas con !
a continuación (por ejemplo, mul!
) de acuerdo con la convención habitual de Julia.
LinearAlgebra.mul!
— Functionmul!(Y, A, B) -> Y
Calcula el producto de matriz-matriz o matriz-vector $A B$ y almacena el resultado en Y
, sobrescribiendo el valor existente de Y
. Ten en cuenta que Y
no debe estar aliasado con A
o B
.
Ejemplos
julia> A = [1.0 2.0; 3.0 4.0]; B = [1.0 1.0; 1.0 1.0]; Y = similar(B);
julia> mul!(Y, A, B) === Y
true
julia> Y
2×2 Matrix{Float64}:
3.0 3.0
7.0 7.0
julia> Y == A * B
true
Implementación
Para tipos de matriz y vector personalizados, se recomienda implementar mul!
de 5 argumentos en lugar de implementar directamente mul!
de 3 argumentos si es posible.
mul!(C, A, B, α, β) -> C
Multiplicación y suma de matrices o de matriz-vectores en su lugar combinada $A B α + C β$. El resultado se almacena en C
sobrescribiéndolo. Tenga en cuenta que C
no debe estar aliasado con A
o B
.
mul!
de cinco argumentos requiere al menos Julia 1.3.
Ejemplos
julia> A = [1.0 2.0; 3.0 4.0]; B = [1.0 1.0; 1.0 1.0]; C = [1.0 2.0; 3.0 4.0];
julia> α, β = 100.0, 10.0;
julia> mul!(C, A, B, α, β) === C
true
julia> C
2×2 Matrix{Float64}:
310.0 320.0
730.0 740.0
julia> C_original = [1.0 2.0; 3.0 4.0]; # Una copia del valor original de C
julia> C == A * B * α + C_original * β
true
LinearAlgebra.lmul!
— Functionlmul!(a::Number, B::AbstractArray)
Escala un array B
por un escalar a
sobrescribiendo B
en su lugar. Usa rmul!
para multiplicar el escalar desde la derecha. La operación de escalado respeta la semántica de la multiplicación *
entre a
y un elemento de B
. En particular, esto también se aplica a la multiplicación que involucra números no finitos como NaN
y ±Inf
.
Antes de Julia 1.1, las entradas NaN
y ±Inf
en B
se trataban de manera inconsistente.
Ejemplos
julia> B = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> lmul!(2, B)
2×2 Matrix{Int64}:
2 4
6 8
julia> lmul!(0.0, [Inf])
1-element Vector{Float64}:
NaN
lmul!(A, B)
Calcula el producto de matrices $AB$, sobrescribiendo B
, y devuelve el resultado. Aquí, A
debe ser de un tipo de matriz especial, como, por ejemplo, Diagonal
, UpperTriangular
o LowerTriangular
, o de algún tipo ortogonal, ver QR
.
Ejemplos
julia> B = [0 1; 1 0];
julia> A = UpperTriangular([1 2; 0 3]);
julia> lmul!(A, B);
julia> B
2×2 Matrix{Int64}:
2 1
3 0
julia> B = [1.0 2.0; 3.0 4.0];
julia> F = qr([0 1; -1 0]);
julia> lmul!(F.Q, B)
2×2 Matrix{Float64}:
3.0 4.0
1.0 2.0
LinearAlgebra.rmul!
— Functionrmul!(A::AbstractArray, b::Number)
Escala un arreglo A
por un escalar b
sobrescribiendo A
en su lugar. Usa lmul!
para multiplicar el escalar desde la izquierda. La operación de escalado respeta la semántica de la multiplicación *
entre un elemento de A
y b
. En particular, esto también se aplica a la multiplicación que involucra números no finitos como NaN
y ±Inf
.
Antes de Julia 1.1, las entradas NaN
y ±Inf
en A
se trataban de manera inconsistente.
Ejemplos
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> rmul!(A, 2)
2×2 Matrix{Int64}:
2 4
6 8
julia> rmul!([NaN], 0.0)
1-element Vector{Float64}:
NaN
rmul!(A, B)
Calcula el producto de matrices $AB$, sobrescribiendo A
, y devuelve el resultado. Aquí, B
debe ser de un tipo de matriz especial, como, por ejemplo, Diagonal
, UpperTriangular
o LowerTriangular
, o de algún tipo ortogonal, ver QR
.
Ejemplos
julia> A = [0 1; 1 0];
julia> B = UpperTriangular([1 2; 0 3]);
julia> rmul!(A, B);
julia> A
2×2 Matrix{Int64}:
0 3
1 2
julia> A = [1.0 2.0; 3.0 4.0];
julia> F = qr([0 1; -1 0]);
julia> rmul!(A, F.Q)
2×2 Matrix{Float64}:
2.0 1.0
4.0 3.0
LinearAlgebra.ldiv!
— Functionldiv!(Y, A, B) -> Y
Calcula A \ B
en su lugar y almacena el resultado en Y
, devolviendo el resultado.
El argumento A
no debe ser una matriz. En su lugar, debe ser un objeto de factorización (por ejemplo, producido por factorize
o cholesky
). La razón de esto es que la factorización en sí misma es costosa y típicamente asigna memoria (aunque también se puede hacer en su lugar a través de, por ejemplo, lu!
), y las situaciones críticas de rendimiento que requieren ldiv!
generalmente también requieren un control detallado sobre la factorización de A
.
Ciertos tipos de matrices estructuradas, como Diagonal
y UpperTriangular
, están permitidos, ya que ya están en una forma factorizada.
Ejemplos
julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2];
julia> X = [1; 2.5; 3];
julia> Y = zero(X);
julia> ldiv!(Y, qr(A), X);
julia> Y ≈ A\X
true
ldiv!(A, B)
Calcula A \ B
en su lugar y sobrescribiendo B
para almacenar el resultado.
El argumento A
no debe ser una matriz. En cambio, en lugar de matrices, debe ser un objeto de factorización (por ejemplo, producido por factorize
o cholesky
). La razón de esto es que la factorización en sí misma es costosa y típicamente asigna memoria (aunque también se puede hacer en su lugar a través de, por ejemplo, lu!
), y las situaciones críticas de rendimiento que requieren ldiv!
generalmente también requieren un control detallado sobre la factorización de A
.
Ciertos tipos de matrices estructuradas, como Diagonal
y UpperTriangular
, están permitidos, ya que ya están en una forma factorizada.
Ejemplos
julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2];
julia> X = [1; 2.5; 3];
julia> Y = copy(X);
julia> ldiv!(qr(A), X);
julia> X ≈ A\Y
true
ldiv!(a::Number, B::AbstractArray)
Divide cada entrada en un arreglo B
por un escalar a
sobrescribiendo B
en su lugar. Usa rdiv!
para dividir el escalar desde la derecha.
Ejemplos
julia> B = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> ldiv!(2.0, B)
2×2 Matrix{Float64}:
0.5 1.0
1.5 2.0
ldiv!(A::Tridiagonal, B::AbstractVecOrMat) -> B
Calcula A \ B
en su lugar mediante eliminación gaussiana con pivoteo parcial y almacena el resultado en B
, devolviendo el resultado. En el proceso, las diagonales de A
se sobrescriben también.
ldiv!
para lados izquierdos Tridiagonal
requiere al menos Julia 1.11.
LinearAlgebra.rdiv!
— Functionrdiv!(A, B)
Calcula A / B
en su lugar y sobrescribiendo A
para almacenar el resultado.
El argumento B
no debe ser una matriz. En su lugar, debe ser un objeto de factorización (por ejemplo, producido por factorize
o cholesky
). La razón de esto es que la factorización en sí misma es costosa y típicamente asigna memoria (aunque también se puede hacer en su lugar a través de, por ejemplo, lu!
), y las situaciones críticas de rendimiento que requieren rdiv!
generalmente también requieren un control detallado sobre la factorización de B
.
Ciertos tipos de matrices estructuradas, como Diagonal
y UpperTriangular
, están permitidos, ya que ya están en una forma factorizada.
rdiv!(A::AbstractArray, b::Number)
Divide cada entrada en un arreglo A
por un escalar b
sobrescribiendo A
en su lugar. Usa ldiv!
para dividir el escalar desde la izquierda.
Ejemplos
julia> A = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> rdiv!(A, 2.0)
2×2 Matrix{Float64}:
0.5 1.0
1.5 2.0
BLAS functions
En Julia (como en gran parte de la computación científica), las operaciones de álgebra lineal densa se basan en el LAPACK library, que a su vez se construye sobre bloques de construcción básicos de álgebra lineal conocidos como el BLAS. Hay implementaciones altamente optimizadas de BLAS disponibles para cada arquitectura de computadora, y a veces en rutinas de álgebra lineal de alto rendimiento es útil llamar a las funciones de BLAS directamente.
LinearAlgebra.BLAS
proporciona envolturas para algunas de las funciones BLAS. Aquellas funciones BLAS que sobrescriben uno de los arreglos de entrada tienen nombres que terminan en '!'
. Por lo general, una función BLAS tiene cuatro métodos definidos, para Float32
, Float64
, ComplexF32
, y ComplexF64
arreglos.
BLAS character arguments
Muchas funciones BLAS aceptan argumentos que determinan si se debe transponer un argumento (trans
), qué triángulo de una matriz se debe referenciar (uplo
o ul
), si se puede asumir que la diagonal de una matriz triangular es toda de unos (dA
) o en qué lado de una multiplicación de matrices pertenece el argumento de entrada (side
). Las posibilidades son:
Multiplication order
side | Meaning |
---|---|
'L' | The argument goes on the left side of a matrix-matrix operation. |
'R' | The argument goes on the right side of a matrix-matrix operation. |
Triangle referencing
uplo /ul | Meaning |
---|---|
'U' | Only the upper triangle of the matrix will be used. |
'L' | Only the lower triangle of the matrix will be used. |
Transposition operation
trans /tX | Meaning |
---|---|
'N' | The input matrix X is not transposed or conjugated. |
'T' | The input matrix X will be transposed. |
'C' | The input matrix X will be conjugated and transposed. |
Unit diagonal
diag /dX | Meaning |
---|---|
'N' | The diagonal values of the matrix X will be read. |
'U' | The diagonal of the matrix X is assumed to be all ones. |
LinearAlgebra.BLAS
— ModuleInterfaz a subrutinas BLAS.
LinearAlgebra.BLAS.set_num_threads
— Functionset_num_threads(n::Integer)
set_num_threads(::Nothing)
Establece el número de hilos que la biblioteca BLAS debe usar igual a n::Integer
.
También acepta nothing
, en cuyo caso julia intenta adivinar el número predeterminado de hilos. Pasar nothing
no se recomienda y existe principalmente por razones históricas.
LinearAlgebra.BLAS.get_num_threads
— Functionget_num_threads()
Obtiene el número de hilos que la biblioteca BLAS está utilizando.
get_num_threads
requiere al menos Julia 1.6.
Las funciones BLAS se pueden dividir en tres grupos, también llamados tres niveles, dependiendo de cuándo se propusieron por primera vez, el tipo de parámetros de entrada y la complejidad de la operación.
Level 1 BLAS functions
Las funciones BLAS de nivel 1 fueron propuestas por primera vez en [(Lawson, 1979)][Lawson-1979] y definen operaciones entre escalares y vectores.
[Lawson-1979]: https://dl.acm.org/doi/10.1145/355841.355847
LinearAlgebra.BLAS.rot!
— Functionrot!(n, X, incx, Y, incy, c, s)
Sobrescribe X
con c*X + s*Y
y Y
con -conj(s)*X + c*Y
para los primeros n
elementos del arreglo X
con paso incx
y los primeros n
elementos del arreglo Y
con paso incy
. Devuelve X
y Y
.
rot!
requiere al menos Julia 1.5.
LinearAlgebra.BLAS.scal!
— Functionscal!(n, a, X, incx)
scal!(a, X)
Sobrescribe X
con a*X
para los primeros n
elementos del arreglo X
con paso incx
. Devuelve X
.
Si n
y incx
no se proporcionan, se utilizan length(X)
y stride(X,1)
.
LinearAlgebra.BLAS.scal
— Functionscal(n, a, X, incx)
scal(a, X)
Devuelve X
escalado por a
para los primeros n
elementos del arreglo X
con un paso de incx
.
Si n
e incx
no se proporcionan, se utilizan length(X)
y stride(X,1)
.
LinearAlgebra.BLAS.blascopy!
— Functionblascopy!(n, X, incx, Y, incy)
Copia n
elementos del arreglo X
con paso incx
al arreglo Y
con paso incy
. Devuelve Y
.
LinearAlgebra.BLAS.dot
— Functiondot(n, X, incx, Y, incy)
Producto punto de dos vectores que consisten en n
elementos del arreglo X
con paso incx
y n
elementos del arreglo Y
con paso incy
.
Ejemplos
julia> BLAS.dot(10, fill(1.0, 10), 1, fill(1.0, 20), 2)
10.0
LinearAlgebra.BLAS.dotu
— Functiondotu(n, X, incx, Y, incy)
Función Dot para dos vectores complejos que constan de n
elementos del arreglo X
con paso incx
y n
elementos del arreglo Y
con paso incy
.
Ejemplos
julia> BLAS.dotu(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
-10.0 + 10.0im
LinearAlgebra.BLAS.dotc
— Functiondotc(n, X, incx, U, incy)
Función Dot para dos vectores complejos, que consiste en n
elementos del arreglo X
con paso incx
y n
elementos del arreglo U
con paso incy
, conjugando el primer vector.
Ejemplos
julia> BLAS.dotc(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
10.0 - 10.0im
LinearAlgebra.BLAS.nrm2
— Functionnrm2(n, X, incx)
2-norma de un vector que consiste en n
elementos del arreglo X
con paso incx
.
Ejemplos
julia> BLAS.nrm2(4, fill(1.0, 8), 2)
2.0
julia> BLAS.nrm2(1, fill(1.0, 8), 2)
1.0
LinearAlgebra.BLAS.asum
— Functionasum(n, X, incx)
Suma de las magnitudes de los primeros n
elementos del arreglo X
con paso incx
.
Para un arreglo real, la magnitud es el valor absoluto. Para un arreglo complejo, la magnitud es la suma del valor absoluto de la parte real y el valor absoluto de la parte imaginaria.
Ejemplos
julia> BLAS.asum(5, fill(1.0im, 10), 2)
5.0
julia> BLAS.asum(2, fill(1.0im, 10), 5)
2.0
LinearAlgebra.BLAS.iamax
— Functioniamax(n, dx, incx)
iamax(dx)
Encuentra el índice del elemento de dx
con el valor absoluto máximo. n
es la longitud de dx
, y incx
es el paso. Si n
y incx
no se proporcionan, se asumen valores predeterminados de n=length(dx)
y incx=stride1(dx)
.
Level 2 BLAS functions
Las funciones BLAS de nivel 2 se publicaron en [(Dongarra, 1988)][Dongarra-1988] y definen operaciones de matriz-vector.
[Dongarra-1988]: https://dl.acm.org/doi/10.1145/42288.42291
devolver un vector
LinearAlgebra.BLAS.gemv!
— Functiongemv!(tA, alpha, A, x, beta, y)
Actualiza el vector y
como alpha*A*x + beta*y
o alpha*A'x + beta*y
de acuerdo con tA
. alpha
y beta
son escalares. Devuelve el y
actualizado.
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, alpha, A, x)
Devuelve alpha*A*x
o alpha*A'x
según tA
. alpha
es un escalar.
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, A, x)
Devuelve A*x
o A'x
según tA
.
LinearAlgebra.BLAS.gbmv!
— Functiongbmv!(trans, m, kl, ku, alpha, A, x, beta, y)
Actualiza el vector y
como alpha*A*x + beta*y
o alpha*A'*x + beta*y
de acuerdo con trans
. La matriz A
es una matriz de banda general de dimensión m
por size(A,2)
con kl
sub-diagonales y ku
super-diagonales. alpha
y beta
son escalares. Devuelve el y
actualizado.
LinearAlgebra.BLAS.gbmv
— Functiongbmv(trans, m, kl, ku, alpha, A, x)
Devuelve alpha*A*x
o alpha*A'*x
según trans
. La matriz A
es una matriz de banda general de dimensión m
por size(A,2)
con kl
sub-diagonales y ku
super-diagonales, y alpha
es un escalar.
LinearAlgebra.BLAS.hemv!
— Functionhemv!(ul, alpha, A, x, beta, y)
Actualiza el vector y
como alpha*A*x + beta*y
. Se asume que A
es Hermitiana. Solo se utiliza el triángulo ul
de A
. alpha
y beta
son escalares. Devuelve el y
actualizado.
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, alpha, A, x)
Devuelve alpha*A*x
. Se asume que A
es Hermitiana. Solo se utiliza el triángulo ul
de A
. alpha
es un escalar.
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, A, x)
Devuelve A*x
. Se asume que A
es Hermitiana. Solo se utiliza el triángulo ul
de A
.
LinearAlgebra.BLAS.hpmv!
— Functionhpmv!(uplo, α, AP, x, β, y)
Actualiza el vector y
como α*A*x + β*y
, donde A
es una matriz Hermitiana proporcionada en formato empaquetado AP
.
Con uplo = 'U'
, el arreglo AP debe contener la parte triangular superior de la matriz Hermitiana empaquetada secuencialmente, columna por columna, de modo que AP[1]
contenga A[1, 1]
, AP[2]
y AP[3]
contengan A[1, 2]
y A[2, 2]
respectivamente, y así sucesivamente.
Con uplo = 'L'
, el arreglo AP debe contener la parte triangular inferior de la matriz Hermitiana empaquetada secuencialmente, columna por columna, de modo que AP[1]
contenga A[1, 1]
, AP[2]
y AP[3]
contengan A[2, 1]
y A[3, 1]
respectivamente, y así sucesivamente.
Las entradas escalares α
y β
deben ser números complejos o reales.
Las entradas de arreglo x
, y
y AP
deben ser todas del tipo ComplexF32
o ComplexF64
.
Devuelve el y
actualizado.
hpmv!
requiere al menos Julia 1.5.
LinearAlgebra.BLAS.symv!
— Functionsymv!(ul, alpha, A, x, beta, y)
Actualiza el vector y
como alpha*A*x + beta*y
. Se asume que A
es simétrica. Solo se utiliza el triángulo ul
de A
. alpha
y beta
son escalares. Devuelve el y
actualizado.
LinearAlgebra.BLAS.symv
— Methodsymv(ul, alpha, A, x)
Devuelve alpha*A*x
. Se asume que A
es simétrica. Solo se utiliza el triángulo ul
de A
. alpha
es un escalar.
LinearAlgebra.BLAS.symv
— Methodsymv(ul, A, x)
Devuelve A*x
. Se asume que A
es simétrica. Solo se utiliza el triángulo ul
de A
.
LinearAlgebra.BLAS.sbmv!
— Functionsbmv!(uplo, k, alpha, A, x, beta, y)
Actualiza el vector y
como alpha*A*x + beta*y
donde A
es una matriz simétrica en banda de orden size(A,2)
con k
superdiagonales almacenadas en el argumento A
. El diseño de almacenamiento para A
se describe en el módulo de referencia BLAS, BLAS de nivel 2 en https://www.netlib.org/lapack/explore-html/. Solo se utiliza el triángulo uplo
de A
.
Devuelve el y
actualizado.
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, alpha, A, x)
Devuelve alpha*A*x
donde A
es una matriz de banda simétrica de orden size(A,2)
con k
super-diagonales almacenadas en el argumento A
. Solo se utiliza el triángulo uplo
de A
.
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, A, x)
Devuelve A*x
donde A
es una matriz de banda simétrica de orden size(A,2)
con k
superdiagonales almacenadas en el argumento A
. Solo se utiliza el triángulo uplo
de A
.
LinearAlgebra.BLAS.spmv!
— Functionspmv!(uplo, α, AP, x, β, y)
Actualiza el vector y
como α*A*x + β*y
, donde A
es una matriz simétrica proporcionada en formato empaquetado AP
.
Con uplo = 'U'
, el arreglo AP debe contener la parte triangular superior de la matriz simétrica empaquetada secuencialmente, columna por columna, de modo que AP[1]
contenga A[1, 1]
, AP[2]
y AP[3]
contengan A[1, 2]
y A[2, 2]
respectivamente, y así sucesivamente.
Con uplo = 'L'
, el arreglo AP debe contener la parte triangular inferior de la matriz simétrica empaquetada secuencialmente, columna por columna, de modo que AP[1]
contenga A[1, 1]
, AP[2]
y AP[3]
contengan A[2, 1]
y A[3, 1]
respectivamente, y así sucesivamente.
Las entradas escalares α
y β
deben ser reales.
Las entradas de arreglo x
, y
y AP
deben ser todas de tipo Float32
o Float64
.
Devuelve el y
actualizado.
spmv!
requiere al menos Julia 1.5.
LinearAlgebra.BLAS.trmv!
— Functiontrmv!(ul, tA, dA, A, b)
Devuelve op(A)*b
, donde op
está determinado por tA
. Solo se utiliza el triángulo ul
de A
. dA
determina si los valores diagonales se leen o se asumen todos como uno. La multiplicación ocurre en su lugar en b
.
LinearAlgebra.BLAS.trmv
— Functiontrmv(ul, tA, dA, A, b)
Devuelve op(A)*b
, donde op
se determina por tA
. Solo se utiliza el triángulo ul
de A
. dA
determina si los valores diagonales se leen o se asumen todos como uno.
LinearAlgebra.BLAS.trsv!
— Functiontrsv!(ul, tA, dA, A, b)
Sobrescribe b
con la solución a A*x = b
o una de las otras dos variantes determinadas por tA
y ul
. dA
determina si los valores diagonales se leen o se asumen como todos unos. Devuelve el b
actualizado.
LinearAlgebra.BLAS.trsv
— Functiontrsv(ul, tA, dA, A, b)
Devuelve la solución a A*x = b
o una de las otras dos variantes determinadas por tA
y ul
. dA
determina si los valores diagonales se leen o se asumen todos como uno.
devolver una matriz
LinearAlgebra.BLAS.ger!
— Functionger!(alpha, x, y, A)
Actualización de rango-1 de la matriz A
con los vectores x
y y
como alpha*x*y' + A
.
LinearAlgebra.BLAS.her!
— Functionher!(uplo, alpha, x, A)
Métodos solo para arreglos complejos. Actualización de rango 1 de la matriz Hermitiana A
con el vector x
como alpha*x*x' + A
. uplo
controla qué triángulo de A
se actualiza. Devuelve A
.
LinearAlgebra.BLAS.syr!
— Functionsyr!(uplo, alpha, x, A)
Actualización de rango-1 de la matriz simétrica A
con el vector x
como alpha*x*transpose(x) + A
. uplo
controla qué triángulo de A
se actualiza. Devuelve A
.
LinearAlgebra.BLAS.spr!
— Functionspr!(uplo, α, x, AP)
Actualiza la matriz A
como A+α*x*x'
, donde A
es una matriz simétrica proporcionada en formato empaquetado AP
y x
es un vector.
Con uplo = 'U'
, el arreglo AP debe contener la parte triangular superior de la matriz simétrica empaquetada secuencialmente, columna por columna, de modo que AP[1]
contenga A[1, 1]
, AP[2]
y AP[3]
contengan A[1, 2]
y A[2, 2]
respectivamente, y así sucesivamente.
Con uplo = 'L'
, el arreglo AP debe contener la parte triangular inferior de la matriz simétrica empaquetada secuencialmente, columna por columna, de modo que AP[1]
contenga A[1, 1]
, AP[2]
y AP[3]
contengan A[2, 1]
y A[3, 1]
respectivamente, y así sucesivamente.
La entrada escalar α
debe ser real.
Las entradas de arreglo x
y AP
deben ser todas de tipo Float32
o Float64
. Devuelve el AP
actualizado.
spr!
requiere al menos Julia 1.8.
Level 3 BLAS functions
Las funciones BLAS de nivel 3 se publicaron en [(Dongarra, 1990)][Dongarra-1990] y definen operaciones de matriz-matriz.
[Dongarra-1990]: https://dl.acm.org/doi/10.1145/77626.79170
LinearAlgebra.BLAS.gemmt!
— Functiongemmt!(uplo, tA, tB, alpha, A, B, beta, C)
Actualiza la parte triangular inferior o superior especificada por uplo
de C
como alpha*A*B + beta*C
o las otras variantes según tA
y tB
. Devuelve el C
actualizado.
gemmt!
requiere al menos Julia 1.11.
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, alpha, A, B)
Devuelve la parte triangular inferior o superior especificada por uplo
de A*B
o las otras tres variantes según tA
y tB
.
gemmt
requiere al menos Julia 1.11.
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, A, B)
Devuelve la parte triangular inferior o superior especificada por uplo
de A*B
o las otras tres variantes según tA
y tB
.
gemmt
requiere al menos Julia 1.11.
LinearAlgebra.BLAS.gemm!
— Functiongemm!(tA, tB, alpha, A, B, beta, C)
Actualiza C
como alpha*A*B + beta*C
o las otras tres variantes según tA
y tB
. Devuelve el C
actualizado.
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, alpha, A, B)
Devuelve alpha*A*B
o las otras tres variantes según tA
y tB
.
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, A, B)
Devuelve A*B
o las otras tres variantes según tA
y tB
.
LinearAlgebra.BLAS.symm!
— Functionsymm!(lado, ul, alpha, A, B, beta, C)
Actualiza C
como alpha*A*B + beta*C
o alpha*B*A + beta*C
de acuerdo a lado
. Se asume que A
es simétrica. Solo se utiliza el triángulo ul
de A
. Devuelve el C
actualizado.
LinearAlgebra.BLAS.symm
— Methodsymm(side, ul, alpha, A, B)
Devuelve alpha*A*B
o alpha*B*A
según side
. Se asume que A
es simétrica. Solo se utiliza el triángulo ul
de A
.
LinearAlgebra.BLAS.symm
— Methodsymm(side, ul, A, B)
Devuelve A*B
o B*A
según side
. Se asume que A
es simétrica. Solo se utiliza el triángulo ul
de A
.
LinearAlgebra.BLAS.hemm!
— Functionhemm!(lado, ul, alpha, A, B, beta, C)
Actualiza C
como alpha*A*B + beta*C
o alpha*B*A + beta*C
de acuerdo a lado
. Se asume que A
es Hermitiana. Solo se utiliza el triángulo ul
de A
. Devuelve el C
actualizado.
LinearAlgebra.BLAS.hemm
— Methodhemm(side, ul, alpha, A, B)
Devuelve alpha*A*B
o alpha*B*A
según side
. Se asume que A
es Hermitiana. Solo se utiliza el triángulo ul
de A
.
LinearAlgebra.BLAS.hemm
— Methodhemm(side, ul, A, B)
Devuelve A*B
o B*A
según side
. Se asume que A
es Hermitiana. Solo se utiliza el triángulo ul
de A
.
LinearAlgebra.BLAS.syrk!
— Functionsyrk!(uplo, trans, alpha, A, beta, C)
Actualización de rango-k de la matriz simétrica C
como alpha*A*transpose(A) + beta*C
o alpha*transpose(A)*A + beta*C
de acuerdo con trans
. Solo se utiliza el triángulo uplo
de C
. Devuelve C
.
LinearAlgebra.BLAS.syrk
— Functionsyrk(uplo, trans, alpha, A)
Devuelve ya sea el triángulo superior o el triángulo inferior de A
, de acuerdo con uplo
, de alpha*A*transpose(A)
o alpha*transpose(A)*A
, de acuerdo con trans
.
LinearAlgebra.BLAS.herk!
— Functionherk!(uplo, trans, alpha, A, beta, C)
Métodos solo para arreglos complejos. Actualización de rango-k de la matriz Hermitiana C
como alpha*A*A' + beta*C
o alpha*A'*A + beta*C
de acuerdo con trans
. Solo se actualiza el triángulo uplo
de C
. Devuelve C
.
LinearAlgebra.BLAS.herk
— Functionherk(uplo, trans, alpha, A)
Métodos solo para arreglos complejos. Devuelve el triángulo uplo
de alpha*A*A'
o alpha*A'*A
, de acuerdo con trans
.
LinearAlgebra.BLAS.syr2k!
— Functionsyr2k!(uplo, trans, alpha, A, B, beta, C)
Actualización de rango-2k de la matriz simétrica C
como alpha*A*transpose(B) + alpha*B*transpose(A) + beta*C
o alpha*transpose(A)*B + alpha*transpose(B)*A + beta*C
de acuerdo con trans
. Solo se utiliza el triángulo uplo
de C
. Devuelve C
.
LinearAlgebra.BLAS.syr2k
— Functionsyr2k(uplo, trans, alpha, A, B)
Devuelve el triángulo uplo
de alpha*A*transpose(B) + alpha*B*transpose(A)
o alpha*transpose(A)*B + alpha*transpose(B)*A
, de acuerdo con trans
.
syr2k(uplo, trans, A, B)
Devuelve el triángulo uplo
de A*transpose(B) + B*transpose(A)
o transpose(A)*B + transpose(B)*A
, según trans
.
LinearAlgebra.BLAS.her2k!
— Functionher2k!(uplo, trans, alpha, A, B, beta, C)
Actualización de rango-2k de la matriz hermitiana C
como alpha*A*B' + alpha*B*A' + beta*C
o alpha*A'*B + alpha*B'*A + beta*C
de acuerdo con trans
. El escalar beta
debe ser real. Solo se utiliza el triángulo uplo
de C
. Devuelve C
.
LinearAlgebra.BLAS.her2k
— Functionher2k(uplo, trans, alpha, A, B)
Devuelve el triángulo uplo
de alpha*A*B' + alpha*B*A'
o alpha*A'*B + alpha*B'*A
, según trans
.
LinearAlgebra.BLAS.trmm!
— Functiontrmm!(lado, ul, tA, dA, alpha, A, B)
Actualiza B
como alpha*A*B
o una de las otras tres variantes determinadas por lado
y tA
. Solo se utiliza el triángulo ul
de A
. dA
determina si los valores diagonales se leen o se asumen como todos unos. Devuelve el B
actualizado.
LinearAlgebra.BLAS.trmm
— Functiontrmm(lado, ul, tA, dA, alpha, A, B)
Devuelve alpha*A*B
o una de las otras tres variantes determinadas por lado
y tA
. Solo se utiliza el triángulo ul
de A
. dA
determina si los valores diagonales se leen o se asumen como todos unos.
LinearAlgebra.BLAS.trsm!
— Functiontrsm!(lado, ul, tA, dA, alpha, A, B)
Sobrescribe B
con la solución a A*X = alpha*B
o una de las otras tres variantes determinadas por lado
y tA
. Solo se utiliza el triángulo ul
de A
. dA
determina si los valores diagonales se leen o se asumen todos como uno. Devuelve el B
actualizado.
LinearAlgebra.BLAS.trsm
— Functiontrsm(lado, ul, tA, dA, alpha, A, B)
Devuelve la solución a A*X = alpha*B
o una de las otras tres variantes determinadas por lado
y tA
. Solo se utiliza el triángulo ul
de A
. dA
determina si los valores diagonales se leen o se asumen todos como uno.
LAPACK functions
LinearAlgebra.LAPACK
proporciona envolturas para algunas de las funciones de LAPACK para álgebra lineal. Aquellas funciones que sobrescriben uno de los arreglos de entrada tienen nombres que terminan en '!'
.
Normalmente, una función tiene 4 métodos definidos, uno para cada uno de Float64
, Float32
, arreglos ComplexF64
y ComplexF32
.
Tenga en cuenta que la API de LAPACK proporcionada por Julia puede y cambiará en el futuro. Dado que esta API no está orientada al usuario, no hay un compromiso de soportar/depreciar este conjunto específico de funciones en futuras versiones.
LinearAlgebra.LAPACK
— ModuleInterfaces a subrutinas de LAPACK.
LinearAlgebra.LAPACK.gbtrf!
— Functiongbtrf!(kl, ku, m, AB) -> (AB, ipiv)
Calcula la factorización LU de una matriz en banda AB
. kl
es la primera subdiagonal que contiene una banda no nula, ku
es la última superdiagonal que contiene una, y m
es la primera dimensión de la matriz AB
. Devuelve la factorización LU en su lugar y ipiv
, el vector de pivotes utilizados.
LinearAlgebra.LAPACK.gbtrs!
— Functiongbtrs!(trans, kl, ku, m, AB, ipiv, B)
Resuelve la ecuación AB * X = B
. trans
determina la orientación de AB
. Puede ser N
(sin transponer), T
(transponer) o C
(transposición conjugada). kl
es la primera subdiagonal que contiene una banda no nula, ku
es la última superdiagonal que contiene una, y m
es la primera dimensión de la matriz AB
. ipiv
es el vector de pivotes devuelto por gbtrf!
. Devuelve el vector o matriz X
, sobrescribiendo B
en su lugar.
LinearAlgebra.LAPACK.gebal!
— Functiongebal!(job, A) -> (ilo, ihi, scale)
Balancea la matriz A
antes de calcular su sistema de eigenvalores o la factorización de Schur. job
puede ser uno de N
(A
no será permutada ni escalada), P
(A
solo será permutada), S
(A
solo será escalada) o B
(A
será tanto permutada como escalada). Modifica A
en su lugar y devuelve ilo
, ihi
y scale
. Si se activó la permutación, A[i,j] = 0
si j > i
y 1 < j < ilo
o j > ihi
. scale
contiene información sobre la escalación/permutaciones realizadas.
LinearAlgebra.LAPACK.gebak!
— Functiongebak!(job, side, ilo, ihi, scale, V)
Transforma los eigenvectores V
de una matriz equilibrada usando gebal!
a los eigenvectores no escalados/no permutados de la matriz original. Modifica V
en su lugar. side
puede ser L
(se transforman los eigenvectores izquierdos) o R
(se transforman los eigenvectores derechos).
LinearAlgebra.LAPACK.gebrd!
— Functiongebrd!(A) -> (A, d, e, tauq, taup)
Reduce A
in-place to bidiagonal form A = QBP'
. Returns A
, que contiene la matriz bidiagonal B
; d
, que contiene los elementos diagonales de B
; e
, que contiene los elementos fuera de la diagonal de B
; tauq
, que contiene los reflectores elementales que representan Q
; y taup
, que contiene los reflectores elementales que representan P
.
LinearAlgebra.LAPACK.gelqf!
— Functiongelqf!(A, tau)
Calcula la factorización LQ
de A
, A = LQ
. tau
contiene escalares que parametrizan los reflectores elementales de la factorización. tau
debe tener una longitud mayor o igual a la dimensión más pequeña de A
.
Devuelve A
y tau
modificados en su lugar.
gelqf!(A) -> (A, tau)
Calcula la factorización LQ
de A
, A = LQ
.
Devuelve A
, modificado en su lugar, y tau
, que contiene escalares que parametrizan los reflectores elementales de la factorización.
LinearAlgebra.LAPACK.geqlf!
— Functiongeqlf!(A, tau)
Calcula la factorización QL
de A
, A = QL
. tau
contiene escalares que parametrizan los reflectores elementales de la factorización. tau
debe tener una longitud mayor o igual a la dimensión más pequeña de A
.
Devuelve A
y tau
modificados en su lugar.
geqlf!(A) -> (A, tau)
Calcula la factorización QL
de A
, A = QL
.
Devuelve A
, modificado en su lugar, y tau
, que contiene escalares que parametrizan los reflectores elementales de la factorización.
LinearAlgebra.LAPACK.geqrf!
— Functiongeqrf!(A, tau)
Calcula la factorización QR
de A
, A = QR
. tau
contiene escalares que parametrizan los reflectores elementales de la factorización. tau
debe tener una longitud mayor o igual a la dimensión más pequeña de A
.
Devuelve A
y tau
modificados en su lugar.
geqrf!(A) -> (A, tau)
Calcula la factorización QR
de A
, A = QR
.
Devuelve A
, modificado en su lugar, y tau
, que contiene escalares que parametrizan los reflectores elementales de la factorización.
LinearAlgebra.LAPACK.geqp3!
— Functiongeqp3!(A, [jpvt, tau]) -> (A, tau, jpvt)
Calcula la factorización QR
con pivoteo de A
, AP = QR
utilizando BLAS de nivel 3. P
es una matriz de pivoteo, representada por jpvt
. tau
almacena los reflectores elementales. Los argumentos jpvt
y tau
son opcionales y permiten pasar arreglos preasignados. Cuando se pasan, jpvt
debe tener una longitud mayor o igual a n
si A
es una matriz de (m x n)
y tau
debe tener una longitud mayor o igual a la dimensión más pequeña de A
. Al entrar, si jpvt[j]
no es igual a cero, entonces la columna j
de A
se permuta al frente de AP
.
A
, jpvt
y tau
se modifican en su lugar.
LinearAlgebra.LAPACK.gerqf!
— Functiongerqf!(A, tau)
Calcula la factorización RQ
de A
, A = RQ
. tau
contiene escalares que parametrizan los reflectores elementales de la factorización. tau
debe tener una longitud mayor o igual a la dimensión más pequeña de A
.
Devuelve A
y tau
modificados en su lugar.
gerqf!(A) -> (A, tau)
Calcula la factorización RQ
de A
, A = RQ
.
Devuelve A
, modificado en su lugar, y tau
, que contiene escalares que parametrizan los reflectores elementales de la factorización.
LinearAlgebra.LAPACK.geqrt!
— Functiongeqrt!(A, T)
Calcula la factorización QR
bloqueada de A
, A = QR
. T
contiene reflectores de bloque triangulares superiores que parametrizan los reflectores elementales de la factorización. La primera dimensión de T
establece el tamaño del bloque y debe estar entre 1 y n
. La segunda dimensión de T
debe ser igual a la dimensión más pequeña de A
.
Devuelve A
y T
modificados en su lugar.
geqrt!(A, nb) -> (A, T)
Calcula la factorización QR
bloqueada de A
, A = QR
. nb
establece el tamaño del bloque y debe estar entre 1 y n
, la segunda dimensión de A
.
Devuelve A
, modificado en su lugar, y T
, que contiene reflectores de bloque triangulares superiores que parametrizan los reflectores elementales de la factorización.
LinearAlgebra.LAPACK.geqrt3!
— Functiongeqrt3!(A, T)
Calcula recursivamente la factorización QR
bloqueada de A
, A = QR
. T
contiene reflectores de bloque triangulares superiores que parametrizan los reflectores elementales de la factorización. La primera dimensión de T
establece el tamaño del bloque y debe estar entre 1 y n
. La segunda dimensión de T
debe ser igual a la dimensión más pequeña de A
.
Devuelve A
y T
modificados en su lugar.
geqrt3!(A) -> (A, T)
Calcula recursivamente la factorización QR
bloqueada de A
, A = QR
.
Devuelve A
, modificado en su lugar, y T
, que contiene reflectores de bloque triangulares superiores que parametrizan los reflectores elementales de la factorización.
LinearAlgebra.LAPACK.getrf!
— Functiongetrf!(A, ipiv) -> (A, ipiv, info)
Calcula la factorización LU
con pivoteo de A
, A = LU
. ipiv
contiene la información de pivoteo y info
un código que indica éxito (info = 0
), un valor singular en U
(info = i
, en cuyo caso U[i,i]
es singular), o un código de error (info < 0
).
getrf!(A) -> (A, ipiv, info)
Calcula la factorización LU
con pivoteo de A
, A = LU
.
Devuelve A
, modificado en su lugar, ipiv
, la información de pivoteo, y un código info
que indica éxito (info = 0
), un valor singular en U
(info = i
, en cuyo caso U[i,i]
es singular), o un código de error (info < 0
).
LinearAlgebra.LAPACK.tzrzf!
— Functiontzrzf!(A) -> (A, tau)
Transforma la matriz trapezoidal superior A
a forma triangular superior en su lugar. Devuelve A
y tau
, los parámetros escalares para los reflectores elementales de la transformación.
LinearAlgebra.LAPACK.ormrz!
— Functionormrz!(lado, trans, A, tau, C)
Multiplica la matriz C
por Q
de la transformación suministrada por tzrzf!
. Dependiendo de lado
o trans
, la multiplicación puede ser del lado izquierdo (lado = L, Q*C
) o del lado derecho (lado = R, C*Q
) y Q
puede estar sin modificar (trans = N
), transpuesta (trans = T
), o conjugadamente transpuesta (trans = C
). Devuelve la matriz C
que se modifica en su lugar con el resultado de la multiplicación.
LinearAlgebra.LAPACK.gels!
— Functiongels!(trans, A, B) -> (F, B, ssr)
Resuelve la ecuación lineal A * X = B
, transpose(A) * X = B
o adjoint(A) * X = B
utilizando una factorización QR o LQ. Modifica la matriz/vector B
en su lugar con la solución. A
se sobrescribe con su factorización QR
o LQ
. trans
puede ser uno de N
(sin modificación), T
(transpuesta) o C
(transpuesta conjugada). gels!
busca la solución de mínimo norma/mínimos cuadrados. A
puede estar subdeterminado o sobredeterminado. La solución se devuelve en B
.
LinearAlgebra.LAPACK.gesv!
— Functiongesv!(A, B) -> (B, A, ipiv)
Resuelve la ecuación lineal A * X = B
donde A
es una matriz cuadrada utilizando la factorización LU
de A
. A
se sobrescribe con su factorización LU
y B
se sobrescribe con la solución X
. ipiv
contiene la información de pivoteo para la factorización LU
de A
.
LinearAlgebra.LAPACK.getrs!
— Functiongetrs!(trans, A, ipiv, B)
Resuelve la ecuación lineal A * X = B
, transpose(A) * X = B
o adjoint(A) * X = B
para A
cuadrada. Modifica la matriz/vector B
en su lugar con la solución. A
es la factorización LU
de getrf!
, con ipiv
la información de pivoteo. trans
puede ser uno de N
(sin modificación), T
(transpuesta) o C
(transpuesta conjugada).
LinearAlgebra.LAPACK.getri!
— Functiongetri!(A, ipiv)
Calcula la inversa de A
, utilizando su factorización LU
encontrada por getrf!
. ipiv
es la información de pivoteo de salida y A
contiene la factorización LU
de getrf!
. A
se sobrescribe con su inversa.
LinearAlgebra.LAPACK.gesvx!
— Functiongesvx!(fact, trans, A, AF, ipiv, equed, R, C, B) -> (X, equed, R, C, B, rcond, ferr, berr, work)
Resuelve la ecuación lineal A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), o adjoint(A) * X = B
(trans = C
) utilizando la factorización LU
de A
. fact
puede ser E
, en cuyo caso A
será equilibrado y copiado a AF
; F
, en cuyo caso AF
e ipiv
de una factorización LU
previa son entradas; o N
, en cuyo caso A
será copiado a AF
y luego factorizado. Si fact = F
, equed
puede ser N
, lo que significa que A
no ha sido equilibrado; R
, lo que significa que A
fue multiplicado por Diagonal(R)
desde la izquierda; C
, lo que significa que A
fue multiplicado por Diagonal(C)
desde la derecha; o B
, lo que significa que A
fue multiplicado por Diagonal(R)
desde la izquierda y Diagonal(C)
desde la derecha. Si fact = F
y equed = R
o B
, los elementos de R
deben ser todos positivos. Si fact = F
y equed = C
o B
, los elementos de C
deben ser todos positivos.
Devuelve la solución X
; equed
, que es una salida si fact
no es N
, y describe el equilibrado que se realizó; R
, la diagonal de equilibrado de filas; C
, la diagonal de equilibrado de columnas; B
, que puede ser sobrescrito con su forma equilibrada Diagonal(R)*B
(si trans = N
y equed = R,B
) o Diagonal(C)*B
(si trans = T,C
y equed = C,B
); rcond
, el número de condición recíproco de A
después de equilibrar; ferr
, el límite de error hacia adelante para cada vector de solución en X
; berr
, el límite de error hacia adelante para cada vector de solución en X
; y work
, el factor de crecimiento de pivote recíproco.
gesvx!(A, B)
La simplificación sin equilibrar y sin transponer de gesvx!
.
LinearAlgebra.LAPACK.gelsd!
— Functiongelsd!(A, B, rcond) -> (B, rnk)
Calcula la solución de menor norma de A * X = B
encontrando la factorización SVD
de A
, luego dividiendo y conquistando el problema. B
se sobrescribe con la solución X
. Los valores singulares por debajo de rcond
se tratarán como cero. Devuelve la solución en B
y el rango efectivo de A
en rnk
.
LinearAlgebra.LAPACK.gelsy!
— Functiongelsy!(A, B, rcond) -> (B, rnk)
Calcula la solución de menor norma de A * X = B
encontrando la factorización completa QR
de A
, luego dividiendo y conquistando el problema. B
se sobrescribe con la solución X
. Los valores singulares por debajo de rcond
se tratarán como cero. Devuelve la solución en B
y el rango efectivo de A
en rnk
.
LinearAlgebra.LAPACK.gglse!
— Functiongglse!(A, c, B, d) -> (X,res)
Resuelve la ecuación A * x = c
donde x
está sujeto a la restricción de igualdad B * x = d
. Utiliza la fórmula ||c - A*x||^2 = 0
para resolver. Devuelve X
y la suma de cuadrados residuales.
LinearAlgebra.LAPACK.geev!
— Functiongeev!(jobvl, jobvr, A) -> (W, VL, VR)
Encuentra el sistema de eigenvalores de A
. Si jobvl = N
, los eigenvectores izquierdos de A
no se calculan. Si jobvr = N
, los eigenvectores derechos de A
no se calculan. Si jobvl = V
o jobvr = V
, se calculan los eigenvectores correspondientes. Devuelve los eigenvalores en W
, los eigenvectores derechos en VR
, y los eigenvectores izquierdos en VL
.
LinearAlgebra.LAPACK.gesdd!
— Functiongesdd!(job, A) -> (U, S, VT)
Encuentra la descomposición en valores singulares de A
, A = U * S * V'
, utilizando un enfoque de dividir y conquistar. Si job = A
, se computan todas las columnas de U
y las filas de V'
. Si job = N
, no se computan columnas de U
ni filas de V'
. Si job = O
, A
se sobrescribe con las columnas de (delgadas) U
y las filas de (delgadas) V'
. Si job = S
, se computan y devuelven por separado las columnas de (delgadas) U
y las filas de (delgadas) V'
.
LinearAlgebra.LAPACK.gesvd!
— Functiongesvd!(jobu, jobvt, A) -> (U, S, VT)
Encuentra la descomposición en valores singulares de A
, A = U * S * V'
. Si jobu = A
, se computan todas las columnas de U
. Si jobvt = A
, se computan todas las filas de V'
. Si jobu = N
, no se computan columnas de U
. Si jobvt = N
, no se computan filas de V'
. Si jobu = O
, A
se sobrescribe con las columnas de (delgada) U
. Si jobvt = O
, A
se sobrescribe con las filas de (delgada) V'
. Si jobu = S
, se computan y devuelven por separado las columnas de (delgada) U
. Si jobvt = S
, se computan y devuelven por separado las filas de (delgada) V'
. jobu
y jobvt
no pueden ser ambos O
.
Devuelve U
, S
y Vt
, donde S
son los valores singulares de A
.
LinearAlgebra.LAPACK.ggsvd!
— Functionggsvd!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
Encuentra la descomposición en valores singulares generalizada de A
y B
, U'*A*Q = D1*R
y V'*B*Q = D2*R
. D1
tiene alpha
en su diagonal y D2
tiene beta
en su diagonal. Si jobu = U
, se calcula la matriz ortogonal/unitaria U
. Si jobv = V
, se calcula la matriz ortogonal/unitaria V
. Si jobq = Q
, se calcula la matriz ortogonal/unitaria Q
. Si jobu
, jobv
o jobq
es N
, esa matriz no se calcula. Esta función solo está disponible en versiones de LAPACK anteriores a 3.6.0.
LinearAlgebra.LAPACK.ggsvd3!
— Functionggsvd3!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
Encuentra la descomposición en valores singulares generalizada de A
y B
, U'*A*Q = D1*R
y V'*B*Q = D2*R
. D1
tiene alpha
en su diagonal y D2
tiene beta
en su diagonal. Si jobu = U
, se calcula la matriz ortogonal/unitaria U
. Si jobv = V
, se calcula la matriz ortogonal/unitaria V
. Si jobq = Q
, se calcula la matriz ortogonal/unitaria Q
. Si jobu
, jobv
o jobq
es N
, esa matriz no se calcula. Esta función requiere LAPACK 3.6.0.
LinearAlgebra.LAPACK.geevx!
— Functiongeevx!(balanc, jobvl, jobvr, sense, A) -> (A, w, VL, VR, ilo, ihi, scale, abnrm, rconde, rcondv)
Encuentra el sistema de eigenvalores de A
con balanceo de matrices. Si jobvl = N
, los eigenvectores izquierdos de A
no se calculan. Si jobvr = N
, los eigenvectores derechos de A
no se calculan. Si jobvl = V
o jobvr = V
, se calculan los eigenvectores correspondientes. Si balanc = N
, no se realiza ningún balanceo. Si balanc = P
, A
se permuta pero no se escala. Si balanc = S
, A
se escala pero no se permuta. Si balanc = B
, A
se permuta y se escala. Si sense = N
, no se calculan números de condición recíprocos. Si sense = E
, se calculan números de condición recíprocos solo para los eigenvalores. Si sense = V
, se calculan números de condición recíprocos solo para los eigenvectores derechos. Si sense = B
, se calculan números de condición recíprocos para los eigenvectores derechos y los eigenvectores. Si sense = E,B
, se deben calcular los eigenvectores derechos e izquierdos.
LinearAlgebra.LAPACK.ggev!
— Functionggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
Encuentra la descomposición de eigen generalizada de A
y B
. Si jobvl = N
, los eigenvectores izquierdos no se calculan. Si jobvr = N
, los eigenvectores derechos no se calculan. Si jobvl = V
o jobvr = V
, se calculan los eigenvectores correspondientes.
LinearAlgebra.LAPACK.ggev3!
— Functionggev3!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
Encuentra la descomposición generalizada de eigen de A
y B
utilizando un algoritmo bloqueado. Si jobvl = N
, los eigenvectores izquierdos no se calculan. Si jobvr = N
, los eigenvectores derechos no se calculan. Si jobvl = V
o jobvr = V
, se calculan los eigenvectores correspondientes. Esta función requiere LAPACK 3.6.0.
LinearAlgebra.LAPACK.gtsv!
— Functiongtsv!(dl, d, du, B)
Resuelve la ecuación A * X = B
donde A
es una matriz tridiagonal con dl
en la subdiagonal, d
en la diagonal y du
en la superdiagonal.
Sobrescribe B
con la solución X
y la devuelve.
LinearAlgebra.LAPACK.gttrf!
— Functiongttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)
Encuentra la factorización LU
de una matriz tridiagonal con dl
en la subdiagonal, d
en la diagonal y du
en la superdiagonal.
Modifica dl
, d
y du
en su lugar y devuelve estos junto con la segunda superdiagonal du2
y el vector de pivoteo ipiv
.
LinearAlgebra.LAPACK.gttrs!
— Functiongttrs!(trans, dl, d, du, du2, ipiv, B)
Resuelve la ecuación A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), o adjoint(A) * X = B
(trans = C
) utilizando la factorización LU
calculada por gttrf!
. B
se sobrescribe con la solución X
.
LinearAlgebra.LAPACK.orglq!
— Functionorglq!(A, tau, k = length(tau))
Encuentra explícitamente la matriz Q
de una factorización LQ
después de llamar a gelqf!
en A
. Utiliza la salida de gelqf!
. A
es sobrescrito por Q
.
LinearAlgebra.LAPACK.orgqr!
— Functionorgqr!(A, tau, k = length(tau))
Encuentra explícitamente la matriz Q
de una factorización QR
después de llamar a geqrf!
en A
. Utiliza la salida de geqrf!
. A
se sobrescribe con Q
.
LinearAlgebra.LAPACK.orgql!
— Functionorgql!(A, tau, k = length(tau))
Encuentra explícitamente la matriz Q
de una factorización QL
después de llamar a geqlf!
en A
. Utiliza la salida de geqlf!
. A
se sobrescribe con Q
.
LinearAlgebra.LAPACK.orgrq!
— Functionorgrq!(A, tau, k = length(tau))
Encuentra explícitamente la matriz Q
de una factorización RQ
después de llamar a gerqf!
en A
. Utiliza la salida de gerqf!
. A
es sobrescrito por Q
.
LinearAlgebra.LAPACK.ormlq!
— Functionormlq!(lado, trans, A, tau, C)
Calcula Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) para lado = L
o la multiplicación equivalente por la derecha para lado = R
utilizando Q
de una factorización LQ
de A
calculada usando gelqf!
. C
es sobrescrito.
LinearAlgebra.LAPACK.ormqr!
— Functionormqr!(lado, trans, A, tau, C)
Calcula Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) para lado = L
o la multiplicación equivalente por la derecha para lado = R
utilizando Q
de una factorización QR
de A
calculada usando geqrf!
. C
es sobrescrito.
LinearAlgebra.LAPACK.ormql!
— Functionormql!(lado, trans, A, tau, C)
Calcula Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) para lado = L
o la multiplicación equivalente del lado derecho para lado = R
usando Q
de una factorización QL
de A
calculada usando geqlf!
. C
es sobrescrito.
LinearAlgebra.LAPACK.ormrq!
— Functionormrq!(lado, trans, A, tau, C)
Calcula Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) para lado = L
o la multiplicación equivalente por la derecha para lado = R
usando Q
de una factorización RQ
de A
calculada usando gerqf!
. C
es sobrescrito.
LinearAlgebra.LAPACK.gemqrt!
— Functiongemqrt!(lado, trans, V, T, C)
Calcula Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) para lado = L
o la multiplicación equivalente del lado derecho para lado = R
utilizando Q
de una factorización QR
de A
calculada usando geqrt!
. C
es sobrescrito.
LinearAlgebra.LAPACK.posv!
— Functionposv!(uplo, A, B) -> (A, B)
Encuentra la solución a A * X = B
donde A
es una matriz simétrica o hermítica definida positiva. Si uplo = U
, se calcula la descomposición de Cholesky superior de A
. Si uplo = L
, se calcula la descomposición de Cholesky inferior de A
. A
se sobrescribe con su descomposición de Cholesky. B
se sobrescribe con la solución X
.
LinearAlgebra.LAPACK.potrf!
— Functionpotrf!(uplo, A)
Calcula la descomposición de Cholesky (superior si uplo = U
, inferior si uplo = L
) de la matriz definida positiva A
. A
se sobrescribe y se devuelve con un código de información.
LinearAlgebra.LAPACK.potri!
— Functionpotri!(uplo, A)
Calcula la inversa de la matriz definida positiva A
después de llamar a potrf!
para encontrar su descomposición de Cholesky (superior si uplo = U
, inferior si uplo = L
).
A
se sobrescribe con su inversa y se devuelve.
LinearAlgebra.LAPACK.potrs!
— Functionpotrs!(uplo, A, B)
Encuentra la solución a A * X = B
donde A
es una matriz simétrica o hermítica definida positiva cuya descomposición de Cholesky fue calculada por potrf!
. Si uplo = U
, se calculó la descomposición de Cholesky superior de A
. Si uplo = L
, se calculó la descomposición de Cholesky inferior de A
. B
se sobrescribe con la solución X
.
LinearAlgebra.LAPACK.pstrf!
— Functionpstrf!(uplo, A, tol) -> (A, piv, rank, info)
Calcula la descomposición de Cholesky con pivoteo (superior si uplo = U
, inferior si uplo = L
) de la matriz definida positiva A
con una tolerancia establecida por el usuario tol
. A
se sobrescribe con su descomposición de Cholesky.
Devuelve A
, los pivotes piv
, el rango de A
y un código info
. Si info = 0
, la factorización tuvo éxito. Si info = i > 0
, entonces A
es indefinida o deficiente en rango.
LinearAlgebra.LAPACK.ptsv!
— Functionptsv!(D, E, B)
Resuelve A * X = B
para A
tridiagonal definida positiva. D
es la diagonal de A
y E
es la subdiagonal. B
se sobrescribe con la solución X
y se devuelve.
LinearAlgebra.LAPACK.pttrf!
— Functionpttrf!(D, E)
Calcula la factorización LDLt de una matriz tridiagonal definida positiva con D
como diagonal y E
como fuera de la diagonal. D
y E
son sobrescritos y devueltos.
LinearAlgebra.LAPACK.pttrs!
— Functionpttrs!(D, E, B)
Resuelve A * X = B
para A
tridiagonal definida positiva con diagonal D
y subdiagonal E
después de calcular la factorización LDLt de A
usando pttrf!
. B
se sobrescribe con la solución X
.
LinearAlgebra.LAPACK.trtri!
— Functiontrtri!(uplo, diag, A)
Encuentra la inversa de la matriz triangular (superior si uplo = U
, inferior si uplo = L
) A
. Si diag = N
, A
tiene elementos diagonales no unitarios. Si diag = U
, todos los elementos diagonales de A
son uno. A
se sobrescribe con su inversa.
LinearAlgebra.LAPACK.trtrs!
— Functiontrtrs!(uplo, trans, diag, A, B)
Resuelve A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), o adjoint(A) * X = B
(trans = C
) para la matriz triangular A
(superior si uplo = U
, inferior si uplo = L
). Si diag = N
, A
tiene elementos diagonales no unitarios. Si diag = U
, todos los elementos diagonales de A
son uno. B
se sobrescribe con la solución X
.
LinearAlgebra.LAPACK.trcon!
— Functiontrcon!(norm, uplo, diag, A)
Encuentra el número de condición recíproco de la matriz triangular A
(superior si uplo = U
, inferior si uplo = L
). Si diag = N
, A
tiene elementos diagonales no unitarios. Si diag = U
, todos los elementos diagonales de A
son uno. Si norm = I
, el número de condición se encuentra en la norma infinita. Si norm = O
o 1
, el número de condición se encuentra en la norma uno.
LinearAlgebra.LAPACK.trevc!
— Functiontrevc!(lado, cuántos, seleccionar, T, VL = similar(T), VR = similar(T))
Encuentra el sistema de eigenvalores de una matriz triangular superior T
. Si lado = R
, se calculan los eigenvectores derechos. Si lado = L
, se calculan los eigenvectores izquierdos. Si lado = B
, se calculan ambos conjuntos. Si cuántos = A
, se encuentran todos los eigenvectores. Si cuántos = B
, se encuentran todos los eigenvectores y se transforman de nuevo usando VL
y VR
. Si cuántos = S
, solo se calculan los eigenvectores correspondientes a los valores en seleccionar
.
LinearAlgebra.LAPACK.trrfs!
— Functiontrrfs!(uplo, trans, diag, A, B, X, Ferr, Berr) -> (Ferr, Berr)
Estima el error en la solución de A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), adjoint(A) * X = B
(trans = C
) para side = L
, o las ecuaciones equivalentes de un side = R
con X * A
después de calcular X
usando trtrs!
. Si uplo = U
, A
es triangular superior. Si uplo = L
, A
es triangular inferior. Si diag = N
, A
tiene elementos diagonales no unitarios. Si diag = U
, todos los elementos diagonales de A
son uno. Ferr
y Berr
son entradas opcionales. Ferr
es el error hacia adelante y Berr
es el error hacia atrás, cada uno componente por componente.
LinearAlgebra.LAPACK.stev!
— Functionstev!(job, dv, ev) -> (dv, Zmat)
Calcula el sistema de eigenvalores para una matriz tridiagonal simétrica con dv
como diagonal y ev
como subdiagonal. Si job = N
, solo se encuentran y devuelven los eigenvalores en dv
. Si job = V
, entonces también se encuentran y devuelven los eigenvectores en Zmat
.
LinearAlgebra.LAPACK.stebz!
— Functionstebz!(rango, orden, vl, vu, il, iu, abstol, dv, ev) -> (dv, iblock, isplit)
Calcula los valores propios para una matriz tridiagonal simétrica con dv
como diagonal y ev
como off-diagonal. Si rango = A
, se encuentran todos los valores propios. Si rango = V
, se encuentran los valores propios en el intervalo semiabierto (vl, vu]
. Si rango = I
, se encuentran los valores propios con índices entre il
y iu
. Si orden = B
, los valores propios se ordenan dentro de un bloque. Si orden = E
, se ordenan a través de todos los bloques. abstol
se puede establecer como una tolerancia para la convergencia.
LinearAlgebra.LAPACK.stegr!
— Functionstegr!(jobz, range, dv, ev, vl, vu, il, iu) -> (w, Z)
Calcula los valores propios (jobz = N
) o los valores propios y vectores propios (jobz = V
) para una matriz tridiagonal simétrica con dv
como diagonal y ev
como subdiagonal. Si range = A
, se encuentran todos los valores propios. Si range = V
, se encuentran los valores propios en el intervalo semiabierto (vl, vu]
. Si range = I
, se encuentran los valores propios con índices entre il
y iu
. Los valores propios se devuelven en w
y los vectores propios en Z
.
LinearAlgebra.LAPACK.stein!
— Functionstein!(dv, ev_in, w_in, iblock_in, isplit_in)
Calcula los eigenvectores para una matriz tridiagonal simétrica con dv
como diagonal y ev_in
como off-diagonal. w_in
especifica los eigenvalores de entrada para los cuales encontrar los eigenvectores correspondientes. iblock_in
especifica las submatrices correspondientes a los eigenvalores en w_in
. isplit_in
especifica los puntos de división entre los bloques de submatrices.
LinearAlgebra.LAPACK.syconv!
— Functionsyconv!(uplo, A, ipiv) -> (A, work)
Convierte una matriz simétrica A
(que ha sido factorizada en una matriz triangular) en dos matrices L
y D
. Si uplo = U
, A
es triangular superior. Si uplo = L
, es triangular inferior. ipiv
es el vector de pivote de la factorización triangular. A
se sobrescribe con L
y D
.
LinearAlgebra.LAPACK.sysv!
— Functionsysv!(uplo, A, B) -> (B, A, ipiv)
Encuentra la solución a A * X = B
para la matriz simétrica A
. Si uplo = U
, la mitad superior de A
se almacena. Si uplo = L
, la mitad inferior se almacena. B
se sobrescribe con la solución X
. A
se sobrescribe con su factorización de Bunch-Kaufman. ipiv
contiene información de pivoteo sobre la factorización.
LinearAlgebra.LAPACK.sytrf!
— Functionsytrf!(uplo, A) -> (A, ipiv, info)
Calcula la factorización de Bunch-Kaufman de una matriz simétrica A
. Si uplo = U
, se almacena la mitad superior de A
. Si uplo = L
, se almacena la mitad inferior.
Devuelve A
, sobrescrita por la factorización, un vector de pivote ipiv
, y el código de error info
, que es un entero no negativo. Si info
es positivo, la matriz es singular y la parte diagonal de la factorización es exactamente cero en la posición info
.
sytrf!(uplo, A, ipiv) -> (A, ipiv, info)
Calcula la factorización de Bunch-Kaufman de una matriz simétrica A
. Si uplo = U
, la mitad superior de A
se almacena. Si uplo = L
, la mitad inferior se almacena.
Devuelve A
, sobrescrita por la factorización, el vector de pivote ipiv
, y el código de error info
que es un entero no negativo. Si info
es positivo, la matriz es singular y la parte diagonal de la factorización es exactamente cero en la posición info
.
LinearAlgebra.LAPACK.sytri!
— Functionsytri!(uplo, A, ipiv)
Calcula la inversa de una matriz simétrica A
utilizando los resultados de sytrf!
. Si uplo = U
, se almacena la mitad superior de A
. Si uplo = L
, se almacena la mitad inferior. A
se sobrescribe con su inversa.
LinearAlgebra.LAPACK.sytrs!
— Functionsytrs!(uplo, A, ipiv, B)
Resuelve la ecuación A * X = B
para una matriz simétrica A
utilizando los resultados de sytrf!
. Si uplo = U
, se almacena la mitad superior de A
. Si uplo = L
, se almacena la mitad inferior. B
se sobrescribe con la solución X
.
LinearAlgebra.LAPACK.hesv!
— Functionhesv!(uplo, A, B) -> (B, A, ipiv)
Encuentra la solución a A * X = B
para la matriz hermítica A
. Si uplo = U
, se almacena la mitad superior de A
. Si uplo = L
, se almacena la mitad inferior. B
se sobrescribe con la solución X
. A
se sobrescribe con su factorización de Bunch-Kaufman. ipiv
contiene información de pivoteo sobre la factorización.
LinearAlgebra.LAPACK.hetrf!
— Functionhetrf!(uplo, A) -> (A, ipiv, info)
Calcula la factorización de Bunch-Kaufman de una matriz hermítica A
. Si uplo = U
, se almacena la mitad superior de A
. Si uplo = L
, se almacena la mitad inferior.
Devuelve A
, sobrescrita por la factorización, un vector de pivote ipiv
, y el código de error info
, que es un entero no negativo. Si info
es positivo, la matriz es singular y la parte diagonal de la factorización es exactamente cero en la posición info
.
hetrf!(uplo, A, ipiv) -> (A, ipiv, info)
Calcula la factorización de Bunch-Kaufman de una matriz hermitiana A
. Si uplo = U
, se almacena la mitad superior de A
. Si uplo = L
, se almacena la mitad inferior.
Devuelve A
, sobrescrita por la factorización, el vector de pivote ipiv
, y el código de error info
, que es un entero no negativo. Si info
es positivo, la matriz es singular y la parte diagonal de la factorización es exactamente cero en la posición info
.
LinearAlgebra.LAPACK.hetri!
— Functionhetri!(uplo, A, ipiv)
Calcula la inversa de una matriz hermitiana A
utilizando los resultados de sytrf!
. Si uplo = U
, se almacena la mitad superior de A
. Si uplo = L
, se almacena la mitad inferior. A
se sobrescribe con su inversa.
LinearAlgebra.LAPACK.hetrs!
— Functionhetrs!(uplo, A, ipiv, B)
Resuelve la ecuación A * X = B
para una matriz Hermitiana A
utilizando los resultados de sytrf!
. Si uplo = U
, se almacena la mitad superior de A
. Si uplo = L
, se almacena la mitad inferior. B
se sobrescribe con la solución X
.
LinearAlgebra.LAPACK.syev!
— Functionsyev!(jobz, uplo, A)
Encuentra los valores propios (jobz = N
) o los valores propios y vectores propios (jobz = V
) de una matriz simétrica A
. Si uplo = U
, se utiliza el triángulo superior de A
. Si uplo = L
, se utiliza el triángulo inferior de A
.
LinearAlgebra.LAPACK.syevr!
— Functionsyevr!(jobz, range, uplo, A, vl, vu, il, iu, abstol) -> (W, Z)
Encuentra los valores propios (jobz = N
) o los valores propios y vectores propios (jobz = V
) de una matriz simétrica A
. Si uplo = U
, se utiliza el triángulo superior de A
. Si uplo = L
, se utiliza el triángulo inferior de A
. Si range = A
, se encuentran todos los valores propios. Si range = V
, se encuentran los valores propios en el intervalo semiabierto (vl, vu]
. Si range = I
, se encuentran los valores propios con índices entre il
y iu
. abstol
se puede establecer como una tolerancia para la convergencia.
Los valores propios se devuelven en W
y los vectores propios en Z
.
LinearAlgebra.LAPACK.syevd!
— Functionsyevd!(jobz, uplo, A)
Encuentra los valores propios (jobz = N
) o los valores propios y vectores propios (jobz = V
) de una matriz simétrica A
. Si uplo = U
, se utiliza el triángulo superior de A
. Si uplo = L
, se utiliza el triángulo inferior de A
.
Utiliza el método de dividir y conquistar, en lugar de la iteración QR utilizada por syev!
o múltiples representaciones relativamente robustas utilizadas por syevr!
. Consulte a James W. Demmel et al, SIAM J. Sci. Comput. 30, 3, 1508 (2008) para una comparación de la precisión y el rendimiento de diferentes métodos.
LinearAlgebra.LAPACK.sygvd!
— Functionsygvd!(itype, jobz, uplo, A, B) -> (w, A, B)
Encuentra los valores propios generalizados (jobz = N
) o valores propios y vectores propios (jobz = V
) de una matriz simétrica A
y una matriz simétrica definida positiva B
. Si uplo = U
, se utilizan los triángulos superiores de A
y B
. Si uplo = L
, se utilizan los triángulos inferiores de A
y B
. Si itype = 1
, el problema a resolver es A * x = lambda * B * x
. Si itype = 2
, el problema a resolver es A * B * x = lambda * x
. Si itype = 3
, el problema a resolver es B * A * x = lambda * x
.
LinearAlgebra.LAPACK.bdsqr!
— Functionbdsqr!(uplo, d, e_, Vt, U, C) -> (d, Vt, U, C)
Calcula la descomposición en valores singulares de una matriz bidiagonal con d
en la diagonal y e_
en la subdiagonal. Si uplo = U
, e_
es la superdiagonal. Si uplo = L
, e_
es la subdiagonal. También se puede calcular opcionalmente el producto Q' * C
.
Devuelve los valores singulares en d
, y la matriz C
sobrescrita con Q' * C
.
LinearAlgebra.LAPACK.bdsdc!
— Functionbdsdc!(uplo, compq, d, e_) -> (d, e, u, vt, q, iq)
Calcula la descomposición en valores singulares de una matriz bidiagonal con d
en la diagonal y e_
en la subdiagonal utilizando un método de dividir y conquistar. Si uplo = U
, e_
es la superdiagonal. Si uplo = L
, e_
es la subdiagonal. Si compq = N
, solo se encuentran los valores singulares. Si compq = I
, se encuentran los valores y vectores singulares. Si compq = P
, se encuentran los valores y vectores singulares en forma compacta. Solo funciona para tipos reales.
Devuelve los valores singulares en d
, y si compq = P
, los vectores singulares compactos en iq
.
LinearAlgebra.LAPACK.gecon!
— Functiongecon!(normtype, A, anorm)
Encuentra el número de condición recíproco de la matriz A
. Si normtype = I
, el número de condición se encuentra en la norma infinita. Si normtype = O
o 1
, el número de condición se encuentra en la norma uno. A
debe ser el resultado de getrf!
y anorm
es la norma de A
en la norma relevante.
LinearAlgebra.LAPACK.gehrd!
— Functiongehrd!(ilo, ihi, A) -> (A, tau)
Convierte una matriz A
a la forma de Hessenberg. Si A
está equilibrada con gebal!
, entonces ilo
e ihi
son las salidas de gebal!
. De lo contrario, deberían ser ilo = 1
e ihi = size(A,2)
. tau
contiene los reflectores elementales de la factorización.
LinearAlgebra.LAPACK.orghr!
— Functionorghr!(ilo, ihi, A, tau)
Encuentra explícitamente Q
, la matriz ortogonal/unitaria de gehrd!
. ilo
, ihi
, A
y tau
deben corresponder a la entrada/salida de gehrd!
.
LinearAlgebra.LAPACK.gees!
— Functiongees!(jobvs, A) -> (A, vs, w)
Calcula los valores propios (jobvs = N
) o los valores propios y los vectores de Schur (jobvs = V
) de la matriz A
. A
se sobrescribe con su forma de Schur.
Devuelve A
, vs
que contiene los vectores de Schur, y w
, que contiene los valores propios.
LinearAlgebra.LAPACK.gges!
— Functiongges!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
Calcula los valores propios generalizados, la forma de Schur generalizada, los vectores de Schur izquierdos (jobsvl = V
), o los vectores de Schur derechos (jobvsr = V
) de A
y B
.
Los valores propios generalizados se devuelven en alpha
y beta
. Los vectores de Schur izquierdos se devuelven en vsl
y los vectores de Schur derechos se devuelven en vsr
.
LinearAlgebra.LAPACK.gges3!
— Functiongges3!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
Calcula los valores propios generalizados, la forma de Schur generalizada, los vectores de Schur izquierdos (jobsvl = V
), o los vectores de Schur derechos (jobvsr = V
) de A
y B
utilizando un algoritmo bloqueado. Esta función requiere LAPACK 3.6.0.
Los valores propios generalizados se devuelven en alpha
y beta
. Los vectores de Schur izquierdos se devuelven en vsl
y los vectores de Schur derechos se devuelven en vsr
.
LinearAlgebra.LAPACK.trexc!
— Functiontrexc!(compq, ifst, ilst, T, Q) -> (T, Q)
trexc!(ifst, ilst, T, Q) -> (T, Q)
Reordena la factorización de Schur T
de una matriz, de modo que el bloque diagonal de T
con índice de fila ifst
se mueva al índice de fila ilst
. Si compq = V
, los vectores de Schur Q
se reordenan. Si compq = N
, no se modifican. El método de 4 argumentos llama al método de 5 argumentos con compq = V
.
LinearAlgebra.LAPACK.trsen!
— Functiontrsen!(trabajo, compq, seleccionar, T, Q) -> (T, Q, w, s, sep)
trsen!(seleccionar, T, Q) -> (T, Q, w, s, sep)
Reordena la factorización de Schur de una matriz y opcionalmente encuentra números de condición recíprocos. Si trabajo = N
, no se encuentran números de condición. Si trabajo = E
, solo se encuentra el número de condición para este clúster de valores propios. Si trabajo = V
, solo se encuentra el número de condición para el subespacio invariante. Si trabajo = B
, entonces se encuentran los números de condición para el clúster y el subespacio. Si compq = V
, los vectores de Schur Q
se actualizan. Si compq = N
, los vectores de Schur no se modifican. seleccionar
determina qué valores propios están en el clúster. El método de 3 argumentos llama al método de 5 argumentos con trabajo = N
y compq = V
.
Devuelve T
, Q
, valores propios reordenados en w
, el número de condición del clúster de valores propios s
, y el número de condición del subespacio invariante sep
.
LinearAlgebra.LAPACK.tgsen!
— Functiontgsen!(select, S, T, Q, Z) -> (S, T, alpha, beta, Q, Z)
Reordena los vectores de una descomposición de Schur generalizada. select
especifica los valores propios en cada clúster.
LinearAlgebra.LAPACK.trsyl!
— Functiontrsyl!(transa, transb, A, B, C, isgn=1) -> (C, scale)
Resuelve la ecuación matricial de Sylvester A * X +/- X * B = scale*C
donde A
y B
son ambos cuasi-triangulares superiores. Si transa = N
, A
no se modifica. Si transa = T
, A
se transpone. Si transa = C
, A
se transpone conjugadamente. De manera similar para transb
y B
. Si isgn = 1
, se resuelve la ecuación A * X + X * B = scale * C
. Si isgn = -1
, se resuelve la ecuación A * X - X * B = scale * C
.
Devuelve X
(sobrescribiendo C
) y scale
.
LinearAlgebra.LAPACK.hseqr!
— Functionhseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)
Calcula todos los valores propios y (opcionalmente) la factorización de Schur de una matriz reducida a forma de Hessenberg. Si H
está balanceada con gebal!
, entonces ilo
e ihi
son las salidas de gebal!
. De lo contrario, deberían ser ilo = 1
y ihi = size(H,2)
. tau
contiene los reflectores elementales de la factorización.
- ACM832Davis, Timothy A. (2004b). Algorithm 832: UMFPACK V4.3–-an Unsymmetric-Pattern Multifrontal Method. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
- ACM887Chen, Y., Davis, T. A., Hager, W. W., & Rajamanickam, S. (2008). Algoritmo 887: CHOLMOD, Factorización de Cholesky dispersa supernodal y actualización/bajada. ACM Trans. Math. Softw., 35(3). doi:10.1145/1391989.1391995
- DavisHager2009Davis, Timothy A., & Hager, W. W. (2009). Supernodos dinámicos en la actualización/bajada de Cholesky dispersa y soluciones triangulares. ACM Trans. Math. Softw., 35(4). doi:10.1145/1462173.1462176
- Bischof1987C Bischof y C Van Loan, "La representación WY para productos de matrices de Householder", SIAM J Sci Stat Comput 8 (1987), s2-s13. doi:10.1137/0908009
- Schreiber1989R Schreiber y C Van Loan, "Una representación WY eficiente en almacenamiento para productos de transformaciones de Householder", SIAM J Sci Stat Comput 10 (1989), 53-57. doi:10.1137/0910005
- ACM933Foster, L. V., & Davis, T. A. (2013). Algoritmo 933: Cálculo confiable de rango numérico, bases de espacio nulo, soluciones de pseudoinversa y soluciones básicas utilizando SuitesparseQR. ACM Trans. Math. Softw., 40(1). doi:10.1145/2513109.2513116
- Bunch1977J R Bunch y L Kaufman, Algunos métodos estables para calcular inercia y resolver sistemas lineales simétricos, Mathematics of Computation 31:137 (1977), 163-179. url.
- issue8859Issue 8859, "Fix least squares", https://github.com/JuliaLang/julia/pull/8859
- B96Åke Björck, "Numerical Methods for Least Squares Problems", SIAM Press, Philadelphia, 1996, "Other Titles in Applied Mathematics", Vol. 51. doi:10.1137/1.9781611971484
- S84G. W. Stewart, "Rank Degeneracy", SIAM Journal on Scientific and Statistical Computing, 5(2), 1984, 403-413. doi:10.1137/0905030
- KY88Konstantinos Konstantinides y Kung Yao, "Statistical analysis of effective singular values in matrix rank determination", IEEE Transactions on Acoustics, Speech and Signal Processing, 36(5), 1988, 757-763. doi:10.1109/29.1585
- H05Nicholas J. Higham, "The squaring and scaling method for the matrix exponential revisited", SIAM Journal on Matrix Analysis and Applications, 26(4), 2005, 1179-1193. doi:10.1137/090768539
- AH12Awad H. Al-Mohy y Nicholas J. Higham, "Algoritmos mejorados de escalado inverso y cuadrado para el logaritmo matricial", SIAM Journal on Scientific Computing, 34(4), 2012, C153-C169. doi:10.1137/110852553
- AHR13Awad H. Al-Mohy, Nicholas J. Higham y Samuel D. Relton, "Computando la derivada de Fréchet del logaritmo matricial y estimando el número de condición", SIAM Journal on Scientific Computing, 35(4), 2013, C394-C410. doi:10.1137/120885991
- BH83Åke Björck y Sven Hammarling, "Un método de Schur para la raíz cuadrada de una matriz", Álgebra Lineal y sus Aplicaciones, 52-53, 1983, 127-140. doi:10.1016/0024-3795(83)80010-X
- H87Nicholas J. Higham, "Cálculo de raíces cuadradas reales de una matriz real", Álgebra Lineal y sus Aplicaciones, 88-89, 1987, 405-430. doi:10.1016/0024-3795(87)90118-2
- S03Matthew I. Smith, "A Schur Algorithm for Computing Matrix pth Roots", SIAM Journal on Matrix Analysis and Applications, vol. 24, 2003, pp. 971–989. doi:10.1137/S0895479801392697
- AH16_1Mary Aprahamian y Nicholas J. Higham, "Funciones Trigonométricas Inversas de Matrices y Funciones Hiperbólicas Inversas: Teoría y Algoritmos", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_2Mary Aprahamian y Nicholas J. Higham, "Funciones Trigonométricas Inversas de Matrices y Funciones Hiperbólicas Inversas: Teoría y Algoritmos", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_3Mary Aprahamian y Nicholas J. Higham, "Funciones Trigonométricas Inversas de Matrices y Funciones Hiperbólicas Inversas: Teoría y Algoritmos", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_4Mary Aprahamian y Nicholas J. Higham, "Funciones Trigonométricas Inversas de Matrices y Funciones Hiperbólicas Inversas: Teoría y Algoritmos", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_5Mary Aprahamian y Nicholas J. Higham, "Funciones Trigonométricas Inversas de Matrices y Funciones Hiperbólicas Inversas: Teoría y Algoritmos", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_6Mary Aprahamian y Nicholas J. Higham, "Funciones Trigonométricas Inversas de Matrices y Funciones Hiperbólicas Inversas: Teoría y Algoritmos", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577