Linear Algebra
В дополнение к (и как часть) своей поддержки многомерных массивов, Julia предоставляет нативные реализации многих общих и полезных операций линейной алгебры, которые можно загрузить с помощью using LinearAlgebra
. Основные операции, такие как tr
, det
и inv
, все поддерживаются:
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
А также другие полезные операции, такие как нахождение собственных значений или собственных векторов:
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
Кроме того, Julia предоставляет множество factorizations, которые могут быть использованы для ускорения задач, таких как линейное решение или возведение матрицы в степень, путем предварительной факторизации матрицы в форму, более удобную (по причинам производительности или памяти) для задачи. См. документацию по factorize
для получения дополнительной информации. В качестве примера:
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
Поскольку A
не является эрмитовой, симметричной, треугольной, тридиагональной или бидиагональной, факторизация LU может быть лучшим, что мы можем сделать. Сравните с:
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
Здесь Джулия смогла обнаружить, что B
на самом деле симметричен, и использовала более подходящую факторизацию. Часто возможно написать более эффективный код для матрицы, которая известна как обладающая определенными свойствами, например, она симметрична или тридиагональна. Джулия предоставляет некоторые специальные типы, чтобы вы могли "пометить" матрицы как обладающие этими свойствами. Например:
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
был помечен как матрица, которая является (действительно) симметричной, поэтому для последующих операций, которые мы можем выполнять с ней, таких как собственная факторизация или вычисление произведений матрица-вектор, можно найти эффективность, ссылаясь только на половину из нее. Например:
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
Операция \
здесь выполняет линейное решение. Оператор деления слева довольно мощный, и легко написать компактный, читаемый код, который достаточно гибок, чтобы решать всевозможные системы линейных уравнений.
Special matrices
Matrices with special symmetries and structures часто встречаются в линейной алгебре и часто ассоциируются с различными разложениями матриц. Julia предлагает богатую коллекцию специальных типов матриц, которые позволяют быстро выполнять вычисления с помощью специализированных процедур, разработанных специально для определенных типов матриц.
Следующие таблицы обобщают типы специальных матриц, которые были реализованы в Julia, а также наличие хуков для различных оптимизированных методов для них в 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 | / |
Легенда:
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 |
Легенда:
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
Оператор UniformScaling
представляет собой скаляр, умноженный на оператор единицы, λ*I
. Оператор единицы I
определяется как константа и является экземпляром UniformScaling
. Размеры этих операторов являются обобщенными и соответствуют другим матрицам в бинарных операциях +
, -
, *
и \
. Для A+I
и A-I
это означает, что A
должно быть квадратным. Умножение на оператор единицы I
является неоперацией (за исключением проверки, что коэффициент масштабирования равен одному) и, следовательно, почти без накладных расходов.
Чтобы увидеть оператор UniformScaling
в действии:
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:
[...]
Если вам нужно решить множество систем вида (A+μI)x = b
для одного и того же A
и разных μ
, может быть полезно сначала вычислить факторизацию Хессенберга F
для A
с помощью функции hessenberg
. Учитывая F
, Julia использует эффективный алгоритм для (F+μ*I) \ b
(эквивалентный (A+μ*I)x \ b
) и связанных операций, таких как определители.
Matrix factorizations
Matrix factorizations (a.k.a. matrix decompositions) вычисление факторизации матрицы в произведение матриц и является одной из центральных концепций в (численной) линейной алгебре.
Следующая таблица суммирует типы разложений матриц, которые были реализованы в Julia. Подробности о связанных с ними методах можно найти в разделе Standard functions документации по линейной алгебре.
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 |
Адъюнкты и транспонирования объектов Factorization
лениво оборачиваются в объекты AdjointFactorization
и TransposeFactorization
, соответственно. В общем случае, транспонирование действительных Factorization
оборачивается как AdjointFactorization
.
Orthogonal matrices (AbstractQ
)
Некоторые разложения матриц генерируют ортогональные/унитарные "факторы матрицы". Эти разложения включают разложения, связанные с QR, полученные из вызовов к qr
, т.е. QR
, QRCompactWY
и QRPivoted
, разложение Гессенберга, полученное из вызовов к hessenberg
, и разложение LQ, полученное из lq
. Хотя эти ортогональные/унитарные факторы допускают матричное представление, их внутреннее представление, по причинам производительности и памяти, отличается. Следовательно, их следует рассматривать скорее как линейные операторы на основе матриц, поддерживаемые функциями. В частности, чтение, например, столбца их матричного представления требует выполнения кода умножения "матрица"-вектор, а не простого считывания данных из памяти (возможно, заполняя части вектора структурными нулями). Еще одно четкое отличие от других, нетреугольных типов матриц заключается в том, что основной код умножения позволяет модификацию на месте во время умножения. Более того, объекты конкретных подтипов AbstractQ
, созданные через 4d61726b646f776e2e436f64652822222c202271722229_40726566
, 4d61726b646f776e2e436f64652822222c202268657373656e626572672229_40726566
и 4d61726b646f776e2e436f64652822222c20226c712229_40726566
, могут вести себя как квадратная или прямоугольная матрица в зависимости от контекста:
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
Из-за этого отличия от плотных или структурированных матриц абстрактный тип AbstractQ
не является подтипом AbstractMatrix
, а вместо этого имеет свою собственную иерархию типов. Пользовательские типы, которые являются подтипами AbstractQ
, могут полагаться на универсальные резервные варианты, если соблюдается следующий интерфейс. Например, для
struct MyQ{T} <: LinearAlgebra.AbstractQ{T}
# required fields
end
предоставить перегрузки для
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
Если продвижение eltype
не является интересным, метод convert
не нужен, так как по умолчанию convert(::Type{AbstractQ{T}}, Q::AbstractQ{T})
возвращает сам Q
. Сопряженные объекты типа AbstractQ
лениво оборачиваются в тип-обертку AdjointQ
, который требует своих собственных методов LinearAlgebra.lmul!
и LinearAlgebra.rmul!
. Учитывая этот набор методов, любой Q::MyQ
может использоваться как матрица, предпочтительно в контексте умножения: умножение через *
со скалярами, векторами и матрицами слева и справа, получение матричного представления Q
через Matrix(Q)
(или Q*I
) и индексация в матричном представлении работают. В отличие от этого, сложение и вычитание, а также более общее широковещательное применение к элементам в матричном представлении не работают, так как это было бы крайне неэффективно. Для таких случаев рассмотрите возможность вычисления матричного представления заранее и кэширования его для будущего использования.
Pivoting Strategies
Несколько из matrix factorizations поддерживают pivoting, что может быть использовано для улучшения их численной устойчивости. На самом деле, некоторые разложения матриц, такие как разложение LU, могут потерпеть неудачу без пивотирования.
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.
Следовательно, помимо обычных матричных факторов, выходы схем поворотной факторизации также включают матрицы перестановок.
В следующем кратко описаны стратегии поворота, реализованные в Julia. Обратите внимание, что не все разложения матриц могут их поддерживать. Обратитесь к документации соответствующего matrix factorization для получения подробной информации о поддерживаемых стратегиях поворота.
См. также LinearAlgebra.ZeroPivotException
.
LinearAlgebra.NoPivot
— TypeNoPivot
Пивотирование не выполняется. Факторизации матриц, такие как LU-факторизация, могут потерпеть неудачу без пивотирования и также могут быть численно нестабильными для матриц с плавающей запятой в условиях округления. Эта стратегия пивотирования в основном полезна в учебных целях.
LinearAlgebra.RowNonZero
— TypeRowNonZero
Первый ненулевой элемент в оставшихся строках выбирается в качестве опорного элемента.
Имейте в виду, что для матриц с плавающей запятой полученный алгоритм LU численно нестабилен — эта стратегия в основном полезна для сравнения с ручными расчетами (которые обычно используют эту стратегию) или для других алгебраических типов (например, рациональных чисел), не подверженных ошибкам округления. В противном случае следует предпочесть стратегию опорного элемента RowMaximum
в методе Гаусса.
Обратите внимание, что тип элемента матрицы должен допускать метод iszero
.
LinearAlgebra.RowMaximum
— TypeRowMaximum
Максимальный по модулю элемент в оставшихся строках выбирается в качестве опорного элемента. Это стратегия по умолчанию для LU-разложения матриц с плавающей запятой и иногда называется алгоритмом "частичного выбора опорного элемента".
Обратите внимание, что тип элемента матрицы должен поддерживать метод abs
, результат которого должен поддерживать метод <
.
LinearAlgebra.ColumnNorm
— TypeColumnNorm
Столбец с максимальной нормой используется для последующих вычислений. Это используется для поворотной QR-факторизации.
Обратите внимание, что тип элемента матрицы должен поддерживать методы norm
и abs
, типы результатов которых должны поддерживать метод <
.
Standard functions
Линейная алгебра в Julia в основном реализована с помощью вызова функций из LAPACK. Факторизации разреженных матриц вызывают функции из SuiteSparse. Другие разреженные решатели доступны в виде пакетов Julia.
Base.:*
— Method*(A::AbstractMatrix, B::AbstractMatrix)
Умножение матриц.
Примеры
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
Цепное умножение 3 или 4 матриц выполняется в наиболее эффективной последовательности, основываясь на размерах массивов. То есть, количество скалярных умножений, необходимых для (A * B) * C
(с 3 плотными матрицами), сравнивается с количеством для A * (B * C)
, чтобы выбрать, какое из этих выражений выполнять.
Если последний множитель — это вектор, или первый — транспонированный вектор, то эффективно сначала обрабатывать эти случаи. В частности, x' * B * y
означает (x' * B) * y
для обычной матрицы столбцового порядка B::Matrix
. В отличие от dot(x, B, y)
, это выделяет промежуточный массив.
Если первый или последний множитель — это число, это будет объединено с умножением матриц, используя 5-аргументный mul!
.
Эти оптимизации требуют как минимум Julia 1.7.
Base.:\
— Method\(A, B)
Деление матриц с использованием полиалгоритма. Для входных матриц A
и B
результат X
таков, что A*X == B
, когда A
является квадратной. Используемый решатель зависит от структуры A
. Если A
является верхней или нижней треугольной (или диагональной), факторизация A
не требуется, и система решается с помощью прямой или обратной подстановки. Для неквадратных квадратных матриц используется LU-факторизация.
Для прямоугольной A
результатом является решение наименьших квадратов с минимальной нормой, вычисленное с помощью пивотированной QR-факторизации A
и оценки ранга A
на основе фактора R.
Когда A
разреженная, используется аналогичный полиалгоритм. Для неопределенных матриц факторизация LDLt
не использует пивотирование во время численной факторизации, и, следовательно, процедура может завершиться неудачей даже для обратимых матриц.
Примеры
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
Правостороннее деление матриц: A / B
эквивалентно (B' \ A')'
, где \
является оператором левостороннего деления. Для квадратных матриц результат X
таков, что A == X*B
.
Смотрите также: rdiv!
.
Примеры
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
Исключение, выбрасываемое, когда входная матрица имеет одно или несколько собственных значений, равных нулю, и не является обратимой. Линейное решение, связанное с такой матрицей, не может быть вычислено. Поле info
указывает на местоположение (одного из) сингулярных значений.
LinearAlgebra.PosDefException
— TypePosDefException
Исключение, выбрасываемое, когда входная матрица не является положительно определенной. Некоторые функции линейной алгебры и факторизации применимы только к положительно определенным матрицам. Поле info
указывает на местоположение (одного из) собственных значений, которые меньше или равны 0.
LinearAlgebra.ZeroPivotException
— TypeZeroPivotException <: Exception
Исключение, выбрасываемое, когда факторизация/решение матрицы сталкивается с нулем в позиции пивота (диагонали) и не может продолжить. Это не обязательно означает, что матрица сингулярна: может быть полезно переключиться на другую факторизацию, такую как пивотированная LU, которая может переупорядочить переменные, чтобы устранить ложные нулевые пивоты. Поле info
указывает на местоположение (одного из) нулевых пивотов.
LinearAlgebra.RankDeficientException
— TypeRankDeficientException
Исключение, выбрасываемое, когда входная матрица является рангово недостаточной. Некоторые функции линейной алгебры, такие как разложение Холецкого, применимы только к матрицам, которые не являются рангово недостаточными. Поле info
указывает вычисленный ранг матрицы.
LinearAlgebra.LAPACKException
— TypeLAPACKException
Общее исключение LAPACK, выбрасываемое либо во время прямых вызовов к функциям LAPACK, либо во время вызовов других функций, которые используют функции LAPACK внутри, но не имеют специализированной обработки ошибок. Поле info
содержит дополнительную информацию о возникшей ошибке и зависит от вызванной функции LAPACK.
LinearAlgebra.dot
— Functiondot(x, y)
x ⋅ y
Вычислите скалярное произведение между двумя векторами. Для комплексных векторов первый вектор конъюгирован.
dot
также работает с произвольными итерируемыми объектами, включая массивы любой размерности, при условии, что dot
определен для элементов.
dot
семантически эквивалентен sum(dot(vx,vy) for (vx,vy) in zip(x, y))
, с добавленным ограничением, что аргументы должны иметь равные длины.
x ⋅ y
(где ⋅
можно ввести, используя автозаполнение \cdot
в REPL) является синонимом для dot(x, y)
.
Примеры
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)
Вычисляет обобщенное скалярное произведение dot(x, A*y)
между двумя векторами x
и y
, не сохраняя промежуточный результат A*y
. Как и в случае с двухаргументным dot(_,_)
, это действует рекурсивно. Более того, для комплексных векторов первый вектор сопряжен.
Трехаргументный dot
требует как минимум Julia 1.4.
Примеры
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)
Вычислите векторное произведение двух 3-векторов.
Примеры
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)
Перезапишите y
как x * α + y
и верните y
. Если x
и y
имеют одинаковые оси, это эквивалентно y .+= x .* a
.
Примеры
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)
Перезаписывает y
значением x * α + y * β
и возвращает y
. Если x
и y
имеют одинаковые оси, это эквивалентно y .= x .* a .+ y .* β
.
Примеры
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)
Перезаписывает x
как c*x + s*y
и y
как -conj(s)*x + c*y
. Возвращает x
и y
.
rotate!
требует как минимум Julia 1.5.
LinearAlgebra.reflect!
— Functionreflect!(x, y, c, s)
Перезаписывает x
значением c*x + s*y
и y
значением conj(s)*x - c*y
. Возвращает x
и y
.
reflect!
требует как минимум Julia 1.5.
LinearAlgebra.factorize
— Functionfactorize(A)
Вычисляет удобную факторизацию A
, основываясь на типе входной матрицы. factorize
проверяет A
, чтобы определить, является ли она симметричной/треугольной и т.д., если A
передана как общая матрица. factorize
проверяет каждый элемент A
, чтобы подтвердить/исключить каждое свойство. Он завершит выполнение, как только сможет исключить симметрию/треугольную структуру. Возвращаемое значение можно повторно использовать для эффективного решения нескольких систем. Например: A=factorize(A); x=A\b; y=A\C
.
Свойства A | тип факторизации |
---|---|
Положительно определенная | Холева (см. cholesky ) |
Плотная симметричная/эрмитова | Банч-Кауфман (см. bunchkaufman ) |
Разреженная симметричная/эрмитова | LDLt (см. ldlt ) |
Треугольная | Треугольная |
Диагональная | Диагональная |
Бидіагональная | Бидіагональная |
Тридіагональная | LU (см. lu ) |
Симметричная реальная тридіагональная | LDLt (см. ldlt ) |
Общая квадратная | LU (см. lu ) |
Общая неквадратная | QR (см. qr ) |
Если factorize
вызывается для эрмитовой положительно определенной матрицы, например, то factorize
вернет факторизацию Холева.
Примеры
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> factorize(A) # factorize проверит, что A уже факторизована
5×5 Bidiagonal{Float64, Vector{Float64}}:
1.0 1.0 ⋅ ⋅ ⋅
⋅ 1.0 1.0 ⋅ ⋅
⋅ ⋅ 1.0 1.0 ⋅
⋅ ⋅ ⋅ 1.0 1.0
⋅ ⋅ ⋅ ⋅ 1.0
Это возвращает 5×5 Bidiagonal{Float64}
, который теперь можно передать другим функциям линейной алгебры (например, решателям собственных значений), которые будут использовать специализированные методы для типов Bidiagonal
.
LinearAlgebra.Diagonal
— TypeDiagonal(V::AbstractVector)
Создает ленивую матрицу с V
в качестве диагонали.
Смотрите также UniformScaling
для ленивой единичной матрицы I
, diagm
для создания плотной матрицы и diag
для извлечения диагональных элементов.
Примеры
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
Матрица с одной колонкой не рассматривается как вектор, а вместо этого вызывает метод Diagonal(A::AbstractMatrix)
, который извлекает 1-элементный diag(A)
:
julia> A = transpose([7.0 13.0])
2×1 transpose(::Matrix{Float64}) with eltype Float64:
7.0
13.0
julia> Diagonal(A)
1×1 Diagonal{Float64, Vector{Float64}}:
7.0
Diagonal(A::AbstractMatrix)
Построить матрицу из главной диагонали A
. Входная матрица A
может быть прямоугольной, но выходная будет квадратной.
Примеры
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)
Создает неинициализированный Diagonal{T}
длины n
. См. undef
.
LinearAlgebra.Bidiagonal
— TypeBidiagonal(dv::V, ev::V, uplo::Symbol) where V <: AbstractVector
Создает верхнюю (uplo=:U
) или нижнюю (uplo=:L
) би-диагональную матрицу, используя заданные векторы диагонали (dv
) и побочной диагонали (ev
). Результат имеет тип Bidiagonal
и предоставляет эффективные специализированные линейные решатели, но может быть преобразован в обычную матрицу с помощью convert(Array, _)
(или Array(_)
для краткости). Длина ev
должна быть на единицу меньше длины dv
.
Примеры
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 находится на первой супердиагонали
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 7 ⋅ ⋅
⋅ 2 8 ⋅
⋅ ⋅ 3 9
⋅ ⋅ ⋅ 4
julia> Bl = Bidiagonal(dv, ev, :L) # ev находится на первой поддиагонали
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
7 2 ⋅ ⋅
⋅ 8 3 ⋅
⋅ ⋅ 9 4
Bidiagonal(A, uplo::Symbol)
Создает матрицу Bidiagonal
из главной диагонали A
и ее первой супер- (если uplo=:U
) или поддиагонали (если uplo=:L
).
Примеры
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) # содержит главную диагональ и первую супердиагональ A
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 1 ⋅ ⋅
⋅ 2 2 ⋅
⋅ ⋅ 3 3
⋅ ⋅ ⋅ 4
julia> Bidiagonal(A, :L) # содержит главную диагональ и первую поддиагональ A
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
2 2 ⋅ ⋅
⋅ 3 3 ⋅
⋅ ⋅ 4 4
LinearAlgebra.SymTridiagonal
— TypeSymTridiagonal(dv::V, ev::V) where V <: AbstractVector
Создает симметричную тридиагональную матрицу из диагонали (dv
) и первой под/супердиагонали (ev
), соответственно. Результат имеет тип SymTridiagonal
и предоставляет эффективные специализированные решатели собственных значений, но может быть преобразован в обычную матрицу с помощью convert(Array, _)
(или Array(_)
для краткости).
Для блочных матриц SymTridiagonal
элементы dv
симметризуются. Аргумент ev
интерпретируется как супердиагональ. Блоки из поддиагонали являются (материализованными) транспонированными соответствующими блоками супердиагонали.
Примеры
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)
Создает симметричную тридиагональную матрицу из диагонали и первой наддиагонали симметричной матрицы A
.
Примеры
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) where V <: AbstractVector
Построить тридиагональную матрицу из первого поддиагонального, диагонального и первого наддиагонального элементов соответственно. Результат имеет тип Tridiagonal
и предоставляет эффективные специализированные линейные решатели, но может быть преобразован в обычную матрицу с помощью convert(Array, _)
(или Array(_)
для краткости). Длины dl
и du
должны быть на единицу меньше длины d
.
Поддиагональный элемент dl
и наддиагональный элемент du
не должны ссылаться друг на друга. Если будет обнаружено, что они ссылаются друг на друга, конструктор использует копию du
в качестве своего аргумента.
Примеры
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)
Построить тридиагональную матрицу из первой поддиагонали, диагонали и первой наддиагонали матрицы A
.
Примеры
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
— TypeSymmetric(A::AbstractMatrix, uplo::Symbol=:U)
Создает представление Symmetric
верхнего (если uplo = :U
) или нижнего (если uplo = :L
) треугольника матрицы A
.
Представления Symmetric
в основном полезны для вещественно-симметричных матриц, для которых специализированные алгоритмы (например, для задач собственных значений) доступны для типов Symmetric
. Более общим образом, см. также Hermitian(A)
для эрмитовых матриц A == A'
, которые фактически эквивалентны Symmetric
для вещественных матриц, но также полезны для комплексных матриц. (В то время как комплексные матрицы Symmetric
поддерживаются, но имеют мало, если вообще имеют, специализированных алгоритмов.)
Чтобы вычислить симметричную часть вещественной матрицы или, более общим образом, эрмитову часть (A + A') / 2
вещественной или комплексной матрицы A
, используйте hermitianpart
.
Примеры
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 = Symmetric(A)
3×3 Symmetric{Int64, Matrix{Int64}}:
1 2 3
2 5 6
3 6 9
julia> Slower = Symmetric(A, :L)
3×3 Symmetric{Int64, Matrix{Int64}}:
1 4 7
4 5 8
7 8 9
julia> hermitianpart(A)
3×3 Hermitian{Float64, Matrix{Float64}}:
1.0 3.0 5.0
3.0 5.0 7.0
5.0 7.0 9.0
Обратите внимание, что Supper
не будет равен Slower
, если только A
сама по себе не является симметричной (например, если A == transpose(A)
).
LinearAlgebra.Hermitian
— TypeГермицианская(A::AbstractMatrix, uplo::Symbol=:U)
Создает представление Гермицианская
верхнего (если uplo = :U
) или нижнего (если uplo = :L
) треугольника матрицы A
.
Чтобы вычислить гермицианскую часть A
, используйте hermitianpart
.
Примеры
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 = Hermitian(A)
3×3 Hermitian{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 = Hermitian(A, :L)
3×3 Hermitian{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 Hermitian{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
Обратите внимание, что Hupper
не будет равен Hlower
, если только A
не является гермицианской (например, если A == adjoint(A)
).
Все невещественные части диагонали будут проигнорированы.
Hermitian(fill(complex(1,1), 1, 1)) == fill(1, 1, 1)
LinearAlgebra.LowerTriangular
— TypeLowerTriangular(A::AbstractMatrix)
Создает представление LowerTriangular
матрицы A
.
Примеры
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)
Создает представление UpperTriangular
матрицы A
.
Примеры
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)
Создает представление UnitLowerTriangular
матрицы A
. Такое представление имеет oneunit
типа eltype
матрицы A
на своей диагонали.
Примеры
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)
Создает представление UnitUpperTriangular
матрицы A
. Такое представление имеет oneunit
типа eltype
матрицы A
на своей диагонали.
Примеры
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)
Создает представление UpperHessenberg
матрицы A
. Элементы A
, находящиеся ниже первой поддиагонали, игнорируются.
Этот тип был добавлен в Julia 1.3.
Эффективные алгоритмы реализованы для H \ b
, det(H)
и подобных.
Смотрите также функцию hessenberg
, чтобы разложить любую матрицу на подобную верхнюю матрицу Хессенберга.
Если F::Hessenberg
является объектом разложения, унитарная матрица может быть доступна через F.Q
, а матрица Хессенберга — через F.H
. Когда Q
извлекается, получаемый тип — это объект HessenbergQ
, и его можно преобразовать в обычную матрицу с помощью convert(Array, _)
(или Array(_)
для краткости).
Итерация разложения производит факторы F.Q
и F.H
.
Примеры
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}
Генерически размерный оператор равномерного масштабирования, определяемый как скаляр, умноженный на оператор единичной матрицы, λ*I
. Хотя у него нет явного size
, он действует аналогично матрице во многих случаях и поддерживает некоторую индексацию. См. также I
.
Индексация с использованием диапазонов доступна начиная с Julia 1.6.
Примеры
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
Объект типа UniformScaling
, представляющий единичную матрицу любого размера.
Примеры
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)
Создает матрицу Diagonal
из UniformScaling
.
Этот метод доступен начиная с Julia 1.2.
Примеры
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
Абстрактный тип для факторизаций матриц, также известных как разложения матриц. См. онлайн-документацию для списка доступных факторизаций матриц.
LinearAlgebra.LU
— TypeLU <: Factorization
Тип разложения матрицы для разложения LU
квадратной матрицы A
. Это тип возвращаемого значения функции lu
, соответствующей функции разложения матрицы.
Индивидуальные компоненты разложения F::LU
можно получить с помощью getproperty
:
Компонент | Описание |
---|---|
F.L | L (единичная нижняя треугольная) часть LU |
F.U | U (верхняя треугольная) часть LU |
F.p | (правое) перестановочное Vector |
F.P | (правое) перестановочное Matrix |
Итерация по разложению производит компоненты F.L
, F.U
и F.p
.
Примеры
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); # деструктуризация через итерацию
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
Вычисляет LU-разложение разреженной матрицы A
.
Для разреженной A
с элементами типа real или complex, возвращаемый тип F
— это UmfpackLU{Tv, Ti}
, где Tv
= Float64
или ComplexF64
соответственно, а Ti
— это целочисленный тип (Int32
или Int64
).
Когда check = true
, возникает ошибка, если разложение не удалось. Когда check = false
, ответственность за проверку корректности разложения (через issuccess
) лежит на пользователе.
Перестановка q
может быть либо вектором перестановки, либо nothing
. Если вектор перестановки не предоставлен или q
равно nothing
, используется значение по умолчанию UMFPACK. Если перестановка не основана на нуле, создается копия, основанная на нуле.
Вектор control
по умолчанию соответствует конфигурации по умолчанию пакета Julia SparseArrays для UMFPACK (NB: это изменено из значений по умолчанию UMFPACK для отключения итеративной доработки), но может быть изменен путем передачи вектора длиной UMFPACK_CONTROL
, см. руководство UMFPACK для возможных конфигураций. Например, чтобы повторно включить итеративную доработку:
umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # прочитать конфигурацию по умолчанию Julia для разреженной матрицы Float64
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # необязательно - отобразить значения
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # повторно включить итеративную доработку (2 - это максимальное количество итеративных шагов по умолчанию UMFPACK)
Alu = lu(A; control = umfpack_control)
x = Alu \ b # решить Ax = b, включая итеративную доработку UMFPACK
Индивидуальные компоненты разложения F
могут быть доступны через индексацию:
Компонент | Описание |
---|---|
L | L (нижняя треугольная) часть LU |
U | U (верхняя треугольная) часть LU |
p | правая перестановка Vector |
q | левая перестановка Vector |
Rs | Vector коэффициентов масштабирования |
: | компоненты (L,U,p,q,Rs) |
Связь между F
и A
следующая:
F.L*F.U == (F.Rs .* A)[F.p, F.q]
F
также поддерживает следующие функции:
См. также lu!
lu(A::AbstractSparseMatrixCSC)
использует библиотеку UMFPACK[ACM832], которая является частью SuiteSparse. Поскольку эта библиотека поддерживает только разреженные матрицы с элементами Float64
или ComplexF64
, lu
преобразует A
в копию, которая имеет тип SparseMatrixCSC{Float64}
или SparseMatrixCSC{ComplexF64}
в зависимости от ситуации.
lu(A, pivot = RowMaximum(); check = true, allowsingular = false) -> F::LU
Вычисляет LU-разложение A
.
Когда check = true
, возникает ошибка, если разложение не удалось. Когда check = false
, ответственность за проверку действительности разложения (через issuccess
) лежит на пользователе.
По умолчанию, при check = true
, также возникает ошибка, когда разложение дает действительные факторы, но верхняя треугольная матрица U
имеет недостаточный ранг. Это можно изменить, передав allowsingular = true
.
В большинстве случаев, если A
является подтипом S
от AbstractMatrix{T}
с типом элемента T
, поддерживающим +
, -
, *
и /
, возвращаемый тип будет LU{T,S{T}}
.
В общем, LU-разложение включает перестановку строк матрицы (соответствующую выходу F.p
, описанному ниже), известную как "пивотирование" (потому что это соответствует выбору, какая строка содержит "пивот", диагональный элемент F.U
). Одна из следующих стратегий пивотирования может быть выбрана через необязательный аргумент pivot
:
RowMaximum()
(по умолчанию): стандартная стратегия пивотирования; пивот соответствует элементу с максимальным абсолютным значением среди оставшихся строк, которые нужно разложить. Эта стратегия пивотирования требует, чтобы тип элемента также поддерживалabs
и<
. (Это, как правило, единственный численно стабильный вариант для матриц с плавающей запятой.)RowNonZero()
: пивот соответствует первому ненулевому элементу среди оставшихся строк, которые нужно разложить. (Это соответствует типичному выбору в ручных расчетах и также полезно для более общих алгебраических типов чисел, которые поддерживаютiszero
, но неabs
или<
.)NoPivot()
: пивотирование отключено (не удастся, если в позиции пивота встретится нулевой элемент, даже когдаallowsingular = true
).
Индивидуальные компоненты разложения F
можно получить через getproperty
:
Компонент | Описание |
---|---|
F.L | L (нижняя треугольная) часть LU |
F.U | U (верхняя треугольная) часть LU |
F.p | (правое) перестановка Vector |
F.P | (правое) перестановка Matrix |
Итерация по разложению производит компоненты F.L
, F.U
и F.p
.
Связь между F
и A
такова:
F.L*F.U == A[F.p, :]
F
дополнительно поддерживает следующие функции:
Поддерживаемая функция | LU | LU{T,Tridiagonal{T}} |
---|---|---|
/ | ✓ | |
\ | ✓ | ✓ |
inv | ✓ | ✓ |
det | ✓ | ✓ |
logdet | ✓ | ✓ |
logabsdet | ✓ | ✓ |
size | ✓ | ✓ |
Аргумент ключевого слова allowsingular
был добавлен в Julia 1.11.
Примеры
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 фактор:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U фактор:
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); # деструктуризация через итерацию
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 фактор:
2×2 Matrix{Float64}:
1.0 0.0
1.0 1.0
U фактор (с недостаточным рангом):
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
Вычисляет LU-разложение разреженной матрицы A
, повторно используя символическое разложение уже существующего LU-разложения, хранящегося в F
. Если reuse_symbolic
не установлен в false, разреженная матрица A
должна иметь идентичный ненулевой шаблон, как матрица, использованная для создания LU-разложения F
, в противном случае будет выброшена ошибка. Если размеры A
и F
различаются, все векторы будут изменены соответственно.
Когда check = true
, будет выброшена ошибка, если разложение не удалось. Когда check = false
, ответственность за проверку действительности разложения (через issuccess
) лежит на пользователе.
Перестановка q
может быть либо вектором перестановки, либо nothing
. Если вектор перестановки не предоставлен или q
равно nothing
, используется значение по умолчанию UMFPACK. Если перестановка не основана на нуле, создается копия, основанная на нуле.
См. также lu
lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC)
использует библиотеку UMFPACK, которая является частью SuiteSparse. Поскольку эта библиотека поддерживает только разреженные матрицы с элементами Float64
или ComplexF64
, lu!
автоматически преобразует типы в те, которые установлены LU-разложением или SparseMatrixCSC{ComplexF64}
по мере необходимости.
lu!
для UmfpackLU
требует как минимум Julia 1.5.
Примеры
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!
такой же, как lu
, но экономит место, перезаписывая входные данные A
, вместо создания копии. Исключение InexactError
выбрасывается, если факторизация производит число, которое не может быть представлено типом элемента A
, например, для целочисленных типов.
Аргумент ключевого слова allowsingular
был добавлен в Julia 1.11.
Примеры
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 фактор:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U фактор:
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 <: Factorization
Тип разложения матрицы для разложения Холецького плотной симметричной/эрмитовой положительно определенной матрицы A
. Это тип возвращаемого значения функции cholesky
, соответствующей функции разложения матрицы.
Треугольный фактор Холецького можно получить из разложения F::Cholesky
с помощью F.L
и F.U
, где A ≈ F.U' * F.U ≈ F.L * F.L'
.
Доступны следующие функции для объектов Cholesky
: size
, \
, inv
, det
, logdet
и isposdef
.
Итерация разложения производит компоненты L
и U
.
Примеры
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; # деструктуризация через итерацию
julia> l == C.L && u == C.U
true
LinearAlgebra.CholeskyPivoted
— TypeCholeskyPivoted
Тип разложения матрицы для разложения Холецького с учетом перестановок для плотной симметричной/эрмитовой положительно полупределенной матрицы A
. Это тип возвращаемого значения функции cholesky(_, ::RowMaximum)
, соответствующей функции разложения матрицы.
Треугольный фактор Холецького можно получить из разложения F::CholeskyPivoted
через F.L
и F.U
, а перестановку через F.p
, где A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'
с Ur = F.U[1:F.rank, :]
и Lr = F.L[:, 1:F.rank]
, или альтернативно A ≈ Up' * Up ≈ Lp * Lp'
с Up = F.U[1:F.rank, invperm(F.p)]
и Lp = F.L[invperm(F.p), 1:F.rank]
.
Следующие функции доступны для объектов CholeskyPivoted
: size
, \
, inv
, det
и rank
.
Итерация разложения производит компоненты L
и U
.
Примеры
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 фактор с рангом 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
перестановка:
4-элементный вектор{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; # деструктуризация через итерацию
julia> l == C.L && u == C.U
true
LinearAlgebra.cholesky
— Functioncholesky(A, NoPivot(); check = true) -> Cholesky
Вычисляет разложение Холецкого плотной симметричной положительно определенной матрицы A
и возвращает Cholesky
разложение. Матрица A
может быть либо Symmetric
, либо Hermitian
AbstractMatrix
или совершенно симметричной или эрмитовой AbstractMatrix
.
Треугольный фактор Холецкого можно получить из разложения F
с помощью F.L
и F.U
, где A ≈ F.U' * F.U ≈ F.L * F.L'
.
Следующие функции доступны для объектов Cholesky
: size
, \
, inv
, det
, logdet
и isposdef
.
Если у вас есть матрица A
, которая немного не является эрмитовой из-за ошибок округления при ее построении, оберните ее в Hermitian(A)
перед передачей в cholesky
, чтобы рассматривать ее как совершенно эрмитовую.
Когда check = true
, возникает ошибка, если разложение не удалось. Когда check = false
, ответственность за проверку действительности разложения (с помощью issuccess
) лежит на пользователе.
Примеры
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 фактор:
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
Вычисляет разложение по методу Холецкого с учетом перестановок для плотной симметричной положительно полупределенной матрицы A
и возвращает разложение CholeskyPivoted
. Матрица A
может быть либо Symmetric
, либо Hermitian
AbstractMatrix
или совершенно симметричной или эрмитовой AbstractMatrix
.
Треугольный фактор Холецкого можно получить из разложения F
с помощью F.L
и F.U
, а перестановку — с помощью F.p
, где A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'
с Ur = F.U[1:F.rank, :]
и Lr = F.L[:, 1:F.rank]
, или альтернативно A ≈ Up' * Up ≈ Lp * Lp'
с Up = F.U[1:F.rank, invperm(F.p)]
и Lp = F.L[invperm(F.p), 1:F.rank]
.
Следующие функции доступны для объектов CholeskyPivoted
: size
, \
, inv
, det
и rank
.
Аргумент tol
определяет допустимую погрешность для определения ранга. Для отрицательных значений допустимая погрешность равна машинной точности.
Если у вас есть матрица A
, которая слегка не является эрмитовой из-за ошибок округления при ее построении, оберните ее в Hermitian(A)
перед передачей в cholesky
, чтобы рассматривать ее как совершенно эрмитовую.
Когда check = true
, возникает ошибка, если разложение не удалось. Когда check = false
, ответственность за проверку корректности разложения (с помощью issuccess
) лежит на пользователе.
Примеры
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 фактор с рангом 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
перестановка:
4-элементный вектор 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; # деструктуризация через итерацию
julia> l == C.L && u == C.U
true
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor
Вычисляет разложение Холецкого разреженной положительно определенной матрицы A
. A
должна быть SparseMatrixCSC
или Symmetric
/Hermitian
представлением SparseMatrixCSC
. Обратите внимание, что даже если у A
нет типа, она все равно должна быть симметричной или эрмитовой. Если perm
не задан, используется перестановка, уменьшающая заполнение. F = cholesky(A)
чаще всего используется для решения систем уравнений с F\b
, но также методы diag
, det
и logdet
определены для F
. Вы также можете извлечь отдельные факторы из F
, используя F.L
. Однако, поскольку поворот включен по умолчанию, разложение внутренне представлено как A == P'*L*L'*P
с матрицей перестановки P
; использование только L
без учета P
даст неправильные ответы. Чтобы учесть эффекты перестановки, обычно предпочтительно извлекать "комбинированные" факторы, такие как PtL = F.PtL
(эквивалент P'*L
) и LtP = F.UP
(эквивалент L'*P
).
Когда check = true
, возникает ошибка, если разложение не удалось. Когда check = false
, ответственность за проверку действительности разложения (через issuccess
) лежит на пользователе.
Установка необязательного аргумента ключевого слова shift
вычисляет разложение A+shift*I
вместо A
. Если аргумент perm
предоставлен, он должен быть перестановкой 1:size(A,1)
, задающей порядок, который следует использовать (вместо стандартного порядка AMD от CHOLMOD).
Примеры
В следующем примере используемая перестановка, уменьшающая заполнение, равна [3, 2, 1]
. Если perm
установлен на 1:3
, чтобы не применять перестановку, количество ненулевых элементов в факторе равно 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} with 3 stored entries:
⋅ ⋅ 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
Этот метод использует библиотеку CHOLMOD[ACM887][DavisHager2009] из SuiteSparse. CHOLMOD поддерживает только действительные или комплексные типы в одинарной или двойной точности. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в эти типы по мере необходимости.
Многие другие функции из CHOLMOD обернуты, но не экспортированы из модуля Base.SparseArrays.CHOLMOD
.
LinearAlgebra.cholesky!
— Functioncholesky!(A::AbstractMatrix, NoPivot(); check = true) -> Cholesky
То же самое, что и cholesky
, но экономит место, перезаписывая входной A
, вместо создания копии. Исключение InexactError
выбрасывается, если факторизация производит число, которое не может быть представлено типом элемента A
, например, для целочисленных типов.
Примеры
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
То же самое, что и cholesky
, но экономит место, перезаписывая входной A
, вместо создания копии. Исключение InexactError
выбрасывается, если факторизация производит число, которое не может быть представлено типом элемента A
, например, для целочисленных типов.
cholesky!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor
Вычисляет разложение Холецкого ($LL'$) матрицы A
, повторно используя символическое разложение F
. A
должна быть SparseMatrixCSC
или Symmetric
/ Hermitian
представлением SparseMatrixCSC
. Обратите внимание, что даже если у A
нет типа, она все равно должна быть симметричной или эрмитовой.
Смотрите также cholesky
.
Этот метод использует библиотеку CHOLMOD из SuiteSparse, которая поддерживает только вещественные или комплексные типы в одинарной или двойной точности. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в эти типы по мере необходимости.
LinearAlgebra.lowrankupdate
— Functionlowrankupdate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Обновите разложение Холецкого C
с вектором v
. Если A = C.U'C.U
, то CC = cholesky(C.U'C.U + v*v')
, но вычисление CC
использует только O(n^2)
операций.
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
Получите LDLt
факторизацию A + C*C'
, учитывая LDLt
или LLt
факторизацию F
для A
.
Возвращаемый фактор всегда является LDLt
факторизацией.
Смотрите также lowrankupdate!
, lowrankdowndate
, lowrankdowndate!
.
LinearAlgebra.lowrankdowndate
— Functionlowrankdowndate(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Снизить ранг разложения Холецкого C
с вектором v
. Если A = C.U'C.U
, то CC = cholesky(C.U'C.U - v*v')
, но вычисление CC
использует только O(n^2)
операций.
lowrankdowndate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor
Получите LDLt
факторизацию A + C*C'
, учитывая LDLt
или LLt
факторизацию F
от A
.
Возвращаемый фактор всегда является LDLt
факторизацией.
Смотрите также lowrankdowndate!
, lowrankupdate
, lowrankupdate!
.
LinearAlgebra.lowrankupdate!
— Functionlowrankupdate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Обновите разложение Холецкого C
с вектором v
. Если A = C.U'C.U
, то CC = cholesky(C.U'C.U + v*v')
, но вычисление CC
использует только O(n^2)
операций. Входное разложение C
обновляется на месте так, что при выходе C == CC
. Вектор v
уничтожается во время вычисления.
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)
Обновляет LDLt
или LLt
факторизацию F
матрицы A
до факторизации матрицы A + C*C'
.
Факторизации LLt
преобразуются в LDLt
.
Смотрите также lowrankupdate
, lowrankdowndate
, lowrankdowndate!
.
LinearAlgebra.lowrankdowndate!
— Functionlowrankdowndate!(C::Cholesky, v::AbstractVector) -> CC::Cholesky
Обновление разложения Холецкого C
с вектором v
. Если A = C.U'C.U
, то CC = cholesky(C.U'C.U - v*v')
, но вычисление CC
использует только O(n^2)
операций. Входное разложение C
обновляется на месте, так что при выходе C == CC
. Вектор v
уничтожается во время вычисления.
lowrankdowndate!(F::CHOLMOD.Factor, C::AbstractArray)
Обновляет разложение LDLt
или LLt
F
матрицы A
до разложения матрицы A - C*C'
.
Разложения LLt
преобразуются в LDLt
.
Смотрите также lowrankdowndate
, lowrankupdate
, lowrankupdate!
.
LinearAlgebra.LDLt
— TypeLDLt <: Factorization
Тип разложения матрицы LDLt
для вещественной SymTridiagonal
матрицы S
, такая что S = L*Diagonal(d)*L'
, где L
— это матрица UnitLowerTriangular
, а d
— вектор. Основное применение разложения LDLt
F = ldlt(S)
— решение системы линейных уравнений Sx = b
с помощью F\b
. Это тип возвращаемого значения функции ldlt
, соответствующей функции разложения матрицы.
Индивидуальные компоненты разложения F::LDLt
можно получить с помощью getproperty
:
Компонент | Описание |
---|---|
F.L | L (единичная нижняя треугольная) часть LDLt |
F.D | D (диагональная) часть LDLt |
F.Lt | Lt (единичная верхняя треугольная) часть LDLt |
F.d | диагональные значения D в виде Vector |
Примеры
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}}}
L фактор:
3×3 UnitLowerTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}:
1.0 ⋅ ⋅
0.333333 1.0 ⋅
0.0 0.545455 1.0
D фактор:
3×3 Diagonal{Float64, Vector{Float64}}:
3.0 ⋅ ⋅
⋅ 3.66667 ⋅
⋅ ⋅ 3.90909
LinearAlgebra.ldlt
— Functionldlt(S::SymTridiagonal) -> LDLt
Вычисляет разложение LDLt
(т.е. $LDL^T$) для действительной симметричной тридиагональной матрицы S
, такое что S = L*Diagonal(d)*L'
, где L
— это единичная нижняя треугольная матрица, а d
— вектор. Основное применение разложения LDLt
F = ldlt(S)
заключается в решении системы линейных уравнений Sx = b
с помощью F\b
.
Смотрите также bunchkaufman
для аналогичного, но с поворотом, разложения произвольных симметричных или эрмитовых матриц.
Примеры
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
Вычисляет факторизацию $LDL'$ разреженной матрицы A
. A
должна быть SparseMatrixCSC
или Symmetric
/Hermitian
представлением SparseMatrixCSC
. Обратите внимание, что даже если у A
нет типа, она все равно должна быть симметричной или эрмитовой. Используется перестановка, уменьшающая заполнение. F = ldlt(A)
чаще всего используется для решения систем уравнений A*x = b
с помощью F\b
. Возвращаемый объект факторизации F
также поддерживает методы diag
, det
, logdet
и inv
. Вы можете извлечь отдельные факторы из F
, используя F.L
. Однако, поскольку поворот включен по умолчанию, факторизация внутренне представлена как A == P'*L*D*L'*P
с матрицей перестановки P
; использование только L
без учета P
даст неправильные ответы. Чтобы учесть эффекты перестановки, обычно предпочтительно извлекать "комбинированные" факторы, такие как PtL = F.PtL
(эквивалент P'*L
) и LtP = F.UP
(эквивалент L'*P
). Полный список поддерживаемых факторов: :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP
.
Когда check = true
, возникает ошибка, если разложение не удалось. Когда check = false
, ответственность за проверку действительности разложения (через issuccess
) лежит на пользователе.
Установка необязательного аргумента shift
вычисляет факторизацию A+shift*I
вместо A
. Если аргумент perm
предоставлен, он должен быть перестановкой 1:size(A,1)
, задающей порядок, который следует использовать (вместо стандартного порядка AMD от CHOLMOD).
Этот метод использует библиотеку CHOLMOD[ACM887][DavisHager2009] из SuiteSparse. CHOLMOD поддерживает только действительные или комплексные типы в одинарной или двойной точности. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в эти типы по мере необходимости.
Многие другие функции из CHOLMOD обернуты, но не экспортированы из модуля Base.SparseArrays.CHOLMOD
.
LinearAlgebra.ldlt!
— Functionldlt!(S::SymTridiagonal) -> LDLt
То же самое, что и ldlt
, но экономит место, перезаписывая входной S
, вместо создания копии.
Примеры
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
Вычисляет разложение $LDL'$ матрицы A
, повторно используя символическое разложение F
. A
должна быть SparseMatrixCSC
или Symmetric
/Hermitian
представлением SparseMatrixCSC
. Обратите внимание, что даже если у A
нет типа, она все равно должна быть симметричной или эрмитовой.
См. также ldlt
.
Этот метод использует библиотеку CHOLMOD из SuiteSparse, которая поддерживает только вещественные или комплексные типы в одинарной или двойной точности. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в эти типы по мере необходимости.
LinearAlgebra.QR
— TypeQR <: Factorization
QR-разложение матрицы, хранящееся в упакованном формате, обычно получаемое из qr
. Если $A$ — это матрица размером m
×n
, то
\[A = Q R\]
где $Q$ — это ортогональная/унитарная матрица, а $R$ — верхняя треугольная матрица. Матрица $Q$ хранится как последовательность отражателей Хаусхолдера $v_i$ и коэффициентов $\tau_i$, где:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
Итерация разложения производит компоненты Q
и R
.
Объект имеет два поля:
factors
— это матрица размеромm
×n
.- Верхняя треугольная часть содержит элементы $R$, то есть
R = triu(F.factors)
для объектаQR
F
. - Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, где $v_i$ — это $i$-й столбец матрицы
V = I + tril(F.factors, -1)
.
- Верхняя треугольная часть содержит элементы $R$, то есть
τ
— это вектор длиныmin(m,n)
, содержащий коэффициенты $au_i$.
LinearAlgebra.QRCompactWY
— TypeQRCompactWY <: Factorization
QR-матричная факторизация, хранящаяся в компактном блочном формате, обычно получаемая из qr
. Если $A$ — это матрица размером m
×n
, то
\[A = Q R\]
где $Q$ — это ортогональная/унитарная матрица, а $R$ — верхняя треугольная матрица. Это похоже на формат QR
, за исключением того, что ортогональная/унитарная матрица $Q$ хранится в формате Compact WY [Schreiber1989]. Для размера блока $n_b$ он хранится как матрица $V$ размером m
×n
в нижнем трапециевидном формате и матрица $T = (T_1 \; T_2 \; ... \; T_{b-1} \; T_b')$, состоящая из $b = \lceil \min(m,n) / n_b \rceil$ верхних треугольных матриц $T_j$ размером $n_b$×$n_b$ ($j = 1, ..., b-1$) и верхней трапециевидной матрицы $T_b'$ размером $n_b$×$\min(m,n) - (b-1) n_b$ ($j=b$), верхняя квадратная часть которой обозначается как $T_b$, удовлетворяющая
\[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)\]
так что $v_i$ — это $i$-й столбец матрицы $V$, $\tau_i$ — это $i$-й элемент из [diag(T_1); diag(T_2); …; diag(T_b)]
, а $(V_1 \; V_2 \; ... \; V_b)$ — это левый блок размером m
×min(m, n)
матрицы $V$. При построении с использованием qr
размер блока задается как $n_b = \min(m, n, 36)$.
Итерация разложения производит компоненты Q
и R
.
Объект имеет два поля:
factors
, как в типеQR
, является матрицей размеромm
×n
.- Верхняя треугольная часть содержит элементы $R$, то есть
R = triu(F.factors)
для объектаQR
F
. - Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, так что
V = I + tril(F.factors, -1)
.
- Верхняя треугольная часть содержит элементы $R$, то есть
T
— это матрица размером $n_b$ на $\min(m,n)$, как описано выше. Поддиагональные элементы для каждой треугольной матрицы $T_j$ игнорируются.
Этот формат не следует путать с более старым представлением WY [Bischof1987].
LinearAlgebra.QRPivoted
— TypeQRPivoted <: Factorization
QR-разложение матрицы с перестановкой столбцов в упакованном формате, обычно получаемое из qr
. Если $A$ — это матрица размером m
×n
, то
\[A P = Q R\]
где $P$ — это матрица перестановки, $Q$ — ортогональная/унитарная матрица, а $R$ — верхняя треугольная матрица. Матрица $Q$ хранится в виде последовательности отражателей Хаусхолдера:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
Итерация разложения производит компоненты Q
, R
и p
.
Объект имеет три поля:
factors
— это матрица размеромm
×n
.- Верхняя треугольная часть содержит элементы $R$, то есть
R = triu(F.factors)
для объектаQR
F
. - Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, где $v_i$ — это $i$-й столбец матрицы
V = I + tril(F.factors, -1)
.
- Верхняя треугольная часть содержит элементы $R$, то есть
τ
— это вектор длиныmin(m,n)
, содержащий коэффициенты $au_i$.jpvt
— это целочисленный вектор длиныn
, соответствующий перестановке $P$.
LinearAlgebra.qr
— Functionqr(A::SparseMatrixCSC; tol=_default_tol(A), ordering=ORDERING_DEFAULT) -> QRSparse
Вычисляет QR
разложение разреженной матрицы A
. Используются перестановки строк и столбцов, уменьшающие заполнение, так что F.R = F.Q'*A[F.prow,F.pcol]
. Основное применение этого типа заключается в решении задач наименьших квадратов или недоопределенных задач с помощью \
. Функция вызывает библиотеку C SPQR[ACM933].
qr(A::SparseMatrixCSC)
использует библиотеку SPQR, которая является частью SuiteSparse. Поскольку эта библиотека поддерживает только разреженные матрицы с элементами Float64
или ComplexF64
, начиная с Julia v1.4 qr
преобразует A
в копию, которая имеет тип SparseMatrixCSC{Float64}
или SparseMatrixCSC{ComplexF64}
в зависимости от ситуации.
Примеры
julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} с 4 сохраненными элементами:
1.0 ⋅
1.0 ⋅
⋅ 1.0
⋅ 1.0
julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q фактор:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R фактор:
2×2 SparseMatrixCSC{Float64, Int64} с 2 сохраненными элементами:
-1.41421 ⋅
⋅ -1.41421
Перестановка строк:
4-элементный вектор{Int64}:
1
3
4
2
Перестановка столбцов:
2-элементный вектор{Int64}:
1
2
qr(A, pivot = NoPivot(); blocksize) -> F
Вычисляет QR-разложение матрицы A
: ортогональная (или унитарная, если A
имеет комплексные значения) матрица Q
и верхняя треугольная матрица R
, такая что
\[A = Q R\]
Возвращаемый объект F
хранит разложение в упакованном формате:
- если
pivot == ColumnNorm()
, тоF
является объектомQRPivoted
, - в противном случае, если элемент типа
A
является типом BLAS (Float32
,Float64
,ComplexF32
илиComplexF64
), тоF
является объектомQRCompactWY
, - в противном случае
F
является объектомQR
.
Индивидуальные компоненты разложения F
могут быть получены через доступ к свойствам:
F.Q
: ортогональная/унитарная матрицаQ
F.R
: верхняя треугольная матрицаR
F.p
: вектор перестановки пивота (QRPivoted
только)F.P
: матрица перестановки пивота (QRPivoted
только)
Каждая ссылка на верхнюю треугольную фактор через F.R
выделяет новый массив. Поэтому рекомендуется кэшировать этот массив, например, с помощью R = F.R
и продолжать работать с R
.
Итерация разложения производит компоненты Q
, R
, и если существует, p
.
Следующие функции доступны для объектов QR
: inv
, size
, и \
. Когда A
является прямоугольной, \
вернет решение наименьших квадратов, и если решение не уникально, будет возвращено решение с наименьшей нормой. Когда A
не полного ранга, требуется разложение с (колонным) пивотом для получения решения с минимальной нормой.
Умножение относительно полной/квадратной или неполной/квадратной Q
разрешено, т.е. поддерживаются как F.Q*F.R
, так и F.Q*A
. Матрицу Q
можно преобразовать в обычную матрицу с помощью Matrix
. Эта операция возвращает "тонкий" Q-фактор, т.е. если A
имеет размер m
×n
с m>=n
, то Matrix(F.Q)
дает матрицу размером m
×n
с ортонормированными столбцами. Чтобы получить "полный" Q-фактор, ортогональную матрицу размером m
×m
, используйте F.Q*I
или collect(F.Q)
. Если m<=n
, то Matrix(F.Q)
дает ортогональную матрицу размером m
×m
.
Размер блока для QR-разложения можно указать с помощью аргумента blocksize :: Integer
, когда pivot == NoPivot()
и A isa StridedMatrix{<:BlasFloat}
. Он игнорируется, когда blocksize > minimum(size(A))
. См. QRCompactWY
.
Аргумент ключевого слова blocksize
требует Julia 1.4 или более поздней версии.
Примеры
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}}
Q фактор: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R фактор:
2×2 Matrix{Float64}:
-5.0 10.0
0.0 -1.0
julia> F.Q * F.R == A
true
qr
возвращает несколько типов, потому что LAPACK использует несколько представлений, которые минимизируют требования к памяти для хранения произведений элементарных отражателей Хаусхолдера, так что матрицы Q
и R
могут храниться компактно, а не как две отдельные плотные матрицы.
LinearAlgebra.qr!
— Functionqr!(A, pivot = NoPivot(); blocksize)
qr!
такое же, как qr
, когда A
является подтипом AbstractMatrix
, но экономит место, перезаписывая входной A
, вместо создания копии. Исключение InexactError
выбрасывается, если факторизация производит число, которое не может быть представлено типом элемента A
, например, для целочисленных типов.
Аргумент ключевого слова blocksize
требует Julia 1.4 или более поздней версии.
Примеры
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 фактор: 2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R фактор:
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 <: Factorization
Тип матричной факторизации LQ
факторизации матрицы A
. Разложение LQ
является разложением QR
матрицы transpose(A)
. Это тип возвращаемого значения функции lq
, соответствующей функции матричной факторизации.
Если S::LQ
является объектом факторизации, то нижнюю треугольную компоненту можно получить через S.L
, а ортогональную/унитарную компоненту через S.Q
, так что A ≈ S.L*S.Q
.
Итерация разложения производит компоненты S.L
и S.Q
.
Примеры
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 фактор:
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
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; # деструктуризация через итерацию
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq
— Functionlq(A) -> S::LQ
Вычислите разложение LQ для A
. Нижнюю треугольную компоненту разложения можно получить из объекта LQ
S
с помощью S.L
, а ортогональную/унитарную компоненту через S.Q
, так что A ≈ S.L*S.Q
.
Итерация разложения производит компоненты S.L
и S.Q
.
Разложение LQ является разложением QR для transpose(A)
, и оно полезно для вычисления решения с минимальной нормой lq(A) \ b
для недоопределенной системы уравнений (A
имеет больше столбцов, чем строк, но имеет полный ранг строк).
Примеры
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 фактор:
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
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; # деструктуризация через итерацию
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq!
— Functionlq!(A) -> LQ
Вычислите LQ
факторизацию A
, используя входную матрицу в качестве рабочего пространства. См. также lq
.
LinearAlgebra.BunchKaufman
— TypeBunchKaufman <: Factorization
Тип матричной факторизации Bunch-Kaufman для симметричной или эрмитовой матрицы A
в виде P'UDU'P
или P'LDL'P
, в зависимости от того, хранится ли верхний (по умолчанию) или нижний треугольник в A
. Если A
является комплексно симметричной, то U'
и L'
обозначают неконъюгированные транспонированные матрицы, т.е. transpose(U)
и transpose(L)
соответственно. Это тип возвращаемого значения функции bunchkaufman
, соответствующей функции матричной факторизации.
Если S::BunchKaufman
является объектом факторизации, компоненты можно получить через S.D
, S.U
или S.L
в зависимости от значения S.uplo
, и S.p
.
Итерация по разложению производит компоненты S.D
, S.U
или S.L
в зависимости от значения S.uplo
, и S.p
.
Примеры
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A оборачивается внутренне в Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D фактор:
2×2 Тридиагональная{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U фактор:
2×2 ЕдиничнаяВерхняяТреугольная{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
перестановка:
2-элементный Vector{Int64}:
1
2
julia> d, u, p = S; # деструктуризация через итерацию
julia> d == S.D && u == S.U && p == S.p
true
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D фактор:
2×2 Тридиагональная{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L фактор:
2×2 ЕдиничнаяНижняяТреугольная{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
перестановка:
2-элементный Vector{Int64}:
2
1
LinearAlgebra.bunchkaufman
— Functionbunchkaufman(A, rook::Bool=false; check = true) -> S::BunchKaufman
Вычисляет факторизацию Банч-Кауфмана [Bunch1977] симметричной или эрмитовой матрицы A
в виде P'*U*D*U'*P
или P'*L*D*L'*P
, в зависимости от того, какой треугольник хранится в A
, и возвращает объект BunchKaufman
. Обратите внимание, что если A
является комплексно симметричной, то U'
и L'
обозначают неконъюгированные транспонированные матрицы, т.е. transpose(U)
и transpose(L)
.
Итерация по разложению производит компоненты S.D
, S.U
или S.L
в зависимости от значения S.uplo
, и S.p
.
Если rook
равно true
, используется ротационное приведение. Если rook
равно false, ротационное приведение не используется.
Когда check = true
, возникает ошибка, если разложение не удалось. Когда check = false
, ответственность за проверку действительности разложения (через issuccess
) лежит на пользователе.
Следующие функции доступны для объектов BunchKaufman
: size
, \
, inv
, issymmetric
, ishermitian
, getindex
.
Примеры
julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
1.0 2.0
2.0 3.0
julia> S = bunchkaufman(A) # A оборачивается внутренне в Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D фактор:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U фактор:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
перестановка:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # деструктуризация через итерацию
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 фактор:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L фактор:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
перестановка:
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!
то же самое, что и bunchkaufman
, но экономит место, перезаписывая входные данные A
, вместо создания копии.
LinearAlgebra.Eigen
— TypeEigen <: Factorization
Тип разложения матрицы для собственных значений/спектрального разложения квадратной матрицы A
. Это тип возвращаемого значения функции eigen
, соответствующей функции разложения матрицы.
Если F::Eigen
является объектом разложения, собственные значения можно получить через F.values
, а собственные векторы — как столбцы матрицы F.vectors
. (k-й собственный вектор можно получить из среза F.vectors[:, k]
.)
Итерация по разложению производит компоненты F.values
и F.vectors
.
Примеры
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; # деструктуризация через итерацию
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.GeneralizedEigen
— TypeGeneralizedEigen <: Factorization
Тип матричной факторизации обобщенного собственного значения/спектрального разложения A
и B
. Это тип возвращаемого значения функции eigen
, соответствующей функции матричной факторизации, когда она вызывается с двумя матричными аргументами.
Если F::GeneralizedEigen
является объектом факторизации, собственные значения можно получить через F.values
, а собственные векторы — как столбцы матрицы F.vectors
. (k-й собственный вектор можно получить из среза F.vectors[:, k]
.)
Итерация по разложению производит компоненты F.values
и F.vectors
.
Примеры
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; # деструктуризация через итерацию
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.eigvals
— Functioneigvals(A; permute::Bool=true, scale::Bool=true, sortby) -> values
Возвращает собственные значения A
.
Для общих нессимметричных матриц возможно указать, как матрица будет сбалансирована перед расчетом собственных значений. Ключевые слова permute
, scale
и sortby
такие же, как для eigen
.
Примеры
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
Для скалярного входа eigvals
вернет скаляр.
Примеры
julia> eigvals(-2)
-2
eigvals(A, B) -> значения
Вычислите обобщенные собственные значения A
и B
.
Примеры
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
Возвращает собственные значения A
. Возможно вычислить только подмножество собственных значений, указав UnitRange
irange
, охватывающее индексы отсортированных собственных значений, например, от 2-го до 8-го собственных значений.
Примеры
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
Возвращает собственные значения A
. Возможно вычислить только подмножество собственных значений, указав пару vl
и vu
для нижней и верхней границ собственных значений.
Примеры
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
То же самое, что и eigvals
, но экономит место, перезаписывая входной A
, вместо создания копии. Ключевые слова permute
, scale
и sortby
такие же, как для eigen
.
Входная матрица A
не будет содержать свои собственные собственные значения после вызова eigvals!
- A
используется как рабочее пространство.
Примеры
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
То же самое, что и eigvals
, но экономит место, перезаписывая входные данные A
(и B
), вместо создания копий.
Входные матрицы A
и B
не будут содержать свои собственные собственные значения после вызова eigvals!
. Они используются как рабочие пространства.
Примеры
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
То же самое, что и eigvals
, но экономит место, перезаписывая входные данные A
, вместо создания копии. irange
- это диапазон индексов собственных значений для поиска - например, от 2-го до 8-го собственных значений.
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values
То же самое, что и eigvals
, но экономит место, перезаписывая входные данные A
, вместо создания копии. vl
— это нижняя граница интервала для поиска собственных значений, а vu
— верхняя граница.
LinearAlgebra.eigmax
— Functioneigmax(A; permute::Bool=true, scale::Bool=true)
Возвращает наибольшее собственное значение матрицы A
. Опция permute=true
переставляет матрицу, чтобы она стала ближе к верхнетреугольной, а scale=true
масштабирует матрицу по её диагональным элементам, чтобы строки и столбцы были более равны по норме. Обратите внимание, что если собственные значения A
являются комплексными, этот метод не сработает, так как комплексные числа не могут быть отсортированы.
Примеры
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` не может иметь комплексные собственные значения.
Stacktrace:
[...]
LinearAlgebra.eigmin
— Functioneigmin(A; permute::Bool=true, scale::Bool=true)
Возвращает наименьшее собственное значение матрицы A
. Опция permute=true
переставляет матрицу, чтобы она стала ближе к верхней треугольной, а scale=true
масштабирует матрицу по её диагональным элементам, чтобы строки и столбцы были более равны по норме. Обратите внимание, что если собственные значения A
являются комплексными, этот метод не сработает, так как комплексные числа не могут быть отсортированы.
Примеры
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` не может иметь комплексные собственные значения.
Stacktrace:
[...]
LinearAlgebra.eigvecs
— Functioneigvecs(A::SymTridiagonal[, eigvals]) -> Matrix
Возвращает матрицу M
, столбцы которой являются собственными векторами A
. (k-й собственный вектор можно получить из среза M[:, k]
.)
Если указанный необязательный вектор собственных значений eigvals
, eigvecs
возвращает соответствующие собственные векторы.
Примеры
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
Возвращает матрицу M
, столбцы которой являются собственными векторами A
. (k-й собственный вектор можно получить из среза M[:, k]
.) Ключевые слова permute
, scale
и sortby
такие же, как для eigen
.
Примеры
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
Возвращает матрицу M
, столбцы которой являются обобщенными собственными векторами A
и B
. (k-й собственный вектор можно получить из среза M[:, k]
.)
Примеры
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
Вычисляет разложение собственных значений матрицы A
, возвращая объект факторизации Eigen
F
, который содержит собственные значения в F.values
и собственные векторы в столбцах матрицы F.vectors
. Это соответствует решению задачи собственных значений вида Ax = λx
, где A
— матрица, x
— собственный вектор, а λ
— собственное значение. (k-й собственный вектор можно получить из среза F.vectors[:, k]
.)
Итерация по разложению производит компоненты F.values
и F.vectors
.
Следующие функции доступны для объектов Eigen
: inv
, det
и isposdef
.
Для общих нессимметричных матриц возможно указать, как матрица будет сбалансирована перед вычислением собственных векторов. Опция permute=true
переставляет матрицу, чтобы она стала ближе к верхней треугольной, а scale=true
масштабирует матрицу по её диагональным элементам, чтобы строки и столбцы стали более равными по норме. По умолчанию оба параметра равны true
.
По умолчанию собственные значения и векторы сортируются лексикографически по (real(λ),imag(λ))
. Можно передать другую функцию сравнения by(λ)
в sortby
, или можно передать sortby=nothing
, чтобы оставить собственные значения в произвольном порядке. Некоторые специальные типы матриц (например, Diagonal
или SymTridiagonal
) могут реализовать свою собственную сортировку и не принимать ключевое слово sortby
.
Примеры
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; # деструктуризация через итерацию
julia> vals == F.values && vecs == F.vectors
true
eigen(A, B; sortby) -> GeneralizedEigen
Вычисляет обобщенное разложение собственных значений для A
и B
, возвращая объект факторизации GeneralizedEigen
F
, который содержит обобщенные собственные значения в F.values
и обобщенные собственные векторы в столбцах матрицы F.vectors
. Это соответствует решению задачи обобщенного собственного значения вида Ax = λBx
, где A, B
— матрицы, x
— собственный вектор, а λ
— собственное значение. (k-й обобщенный собственный вектор можно получить из среза F.vectors[:, k]
.)
Итерация разложения производит компоненты F.values
и F.vectors
.
По умолчанию собственные значения и векторы сортируются лексикографически по (real(λ),imag(λ))
. Можно передать другую функцию сравнения by(λ)
в sortby
, или можно передать sortby=nothing
, чтобы оставить собственные значения в произвольном порядке.
Примеры
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; # деструктуризация через итерацию
julia> vals == F.values && vecs == F.vectors
true
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> Eigen
Вычисляет разложение собственных значений матрицы A
, возвращая объект факторизации Eigen
F
, который содержит собственные значения в F.values
и собственные векторы в столбцах матрицы F.vectors
. (k-й собственный вектор можно получить из среза F.vectors[:, k]
.)
Итерация по разложению производит компоненты F.values
и F.vectors
.
Следующие функции доступны для объектов Eigen
: inv
, det
и isposdef
.
UnitRange
irange
указывает индексы отсортированных собственных значений, которые нужно искать.
Если irange
не равен 1:n
, где n
— это размерность A
, то возвращаемая факторизация будет усеченной факторизацией.
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> Eigen
Вычисляет разложение собственных значений матрицы A
, возвращая объект факторизации Eigen
F
, который содержит собственные значения в F.values
и собственные векторы в столбцах матрицы F.vectors
. (k-й собственный вектор можно получить из среза F.vectors[:, k]
.)
Итерация по разложению производит компоненты F.values
и F.vectors
.
Следующие функции доступны для объектов Eigen
: inv
, det
и isposdef
.
vl
— это нижняя граница окна собственных значений для поиска, а vu
— верхняя граница.
Если [vl
, vu
] не содержит всех собственных значений матрицы A
, то возвращаемая факторизация будет усеченной факторизацией.
LinearAlgebra.eigen!
— Functioneigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)
То же самое, что и eigen
, но экономит место, перезаписывая входные данные A
(и B
), вместо создания копии.
LinearAlgebra.Hessenberg
— TypeHessenberg <: Факторизация
Объект Hessenberg
представляет собой факторизацию Хессенберга QHQ'
квадратной матрицы или сдвиг Q(H+μI)Q'
от нее, который создается функцией hessenberg
.
LinearAlgebra.hessenberg
— Functionhessenberg(A) -> Hessenberg
Вычислите разложение Хессенберга для A
и верните объект Hessenberg
. Если F
— это объект факторизации, то унитарная матрица может быть доступна через F.Q
(типа LinearAlgebra.HessenbergQ
), а матрица Хессенберга — через F.H
(типа UpperHessenberg
), каждая из которых может быть преобразована в обычную матрицу с помощью Matrix(F.H)
или Matrix(F.Q)
.
Если A
является Hermitian
или вещественно-Symmetric
, то разложение Хессенберга дает вещественно-симметричную тридиагональную матрицу, и F.H
имеет тип SymTridiagonal
.
Обратите внимание, что сдвинутое разложение A+μI = Q (H+μI) Q'
может быть эффективно построено с помощью F + μ*I
, используя объект UniformScaling
I
, который создает новый объект Hessenberg
с общим хранилищем и измененным сдвигом. Сдвиг данного F
получается с помощью F.μ
. Это полезно, потому что несколько сдвинутых решений (F + μ*I) \ b
(для различных μ
и/или b
) могут быть выполнены эффективно после создания F
.
Итерация разложения дает факторы F.Q, F.H, F.μ
.
Примеры
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 фактор: 3×3 LinearAlgebra.HessenbergQ{Float64, Matrix{Float64}, Vector{Float64}, false}
H фактор:
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; # деструктуризация через итерацию
julia> q == F.Q && h == F.H
true
LinearAlgebra.hessenberg!
— Functionhessenberg!(A) -> Гессенберг
hessenberg!
то же самое, что и hessenberg
, но экономит место, перезаписывая входные данные A
, вместо создания копии.
LinearAlgebra.Schur
— TypeSchur <: Factorization
Тип разложения матрицы Шура для матрицы A
. Это тип возвращаемого значения функции schur(_)
, соответствующей функции разложения матрицы.
Если F::Schur
является объектом разложения, (квази)треугольный фактор Шура можно получить через F.Schur
или F.T
, а ортогональные/унитарные векторы Шура через F.vectors
или F.Z
, так что A = F.vectors * F.Schur * F.vectors'
. Собственные значения A
можно получить с помощью F.values
.
Итерация по разложению производит компоненты F.T
, F.Z
и F.values
.
Примеры
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 фактор:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z фактор:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
собственные значения:
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; # деструктуризация через итерацию
julia> t == F.T && z == F.Z && vals == F.values
true
LinearAlgebra.GeneralizedSchur
— TypeGeneralizedSchur <: Factorization
Тип матричной факторизации обобщенной факторизации Шура для двух матриц A
и B
. Это тип возвращаемого значения функции schur(_, _)
, соответствующей функции матричной факторизации.
Если F::GeneralizedSchur
является объектом факторизации, (квази)треугольные факторы Шура можно получить через F.S
и F.T
, левые унитарные/ортогональные векторы Шура через F.left
или F.Q
, а правые унитарные/ортогональные векторы можно получить с помощью F.right
или F.Z
, так что A=F.left*F.S*F.right'
и B=F.left*F.T*F.right'
. Обобщенные собственные значения A
и B
можно получить с помощью F.α./F.β
.
Итерация разложения производит компоненты F.S
, F.T
, F.Q
, F.Z
, F.α
и F.β
.
LinearAlgebra.schur
— Functionschur(A) -> F::Schur
Вычисляет факторизацию Шура матрицы A
. (Квази)треугольный фактор Шура можно получить из объекта Schur
F
с помощью F.Schur
или F.T
, а ортогональные/унитарные векторы Шура можно получить с помощью F.vectors
или F.Z
, так что A = F.vectors * F.Schur * F.vectors'
. Собственные значения A
можно получить с помощью F.values
.
Для действительной A
факторизация Шура является "квази-треугольной", что означает, что она верхнетреугольная, за исключением 2×2 диагональных блоков для любой сопряженной пары комплексных собственных значений; это позволяет факторизации быть чисто действительной, даже когда есть комплексные собственные значения. Чтобы получить (комплексную) чисто верхнетреугольную факторизацию Шура из действительной квази-треугольной факторизации, вы можете использовать Schur{Complex}(schur(A))
.
Итерация разложения производит компоненты F.T
, F.Z
и F.values
.
Примеры
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
eigenvalues:
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; # деструктуризация через итерацию
julia> t == F.T && z == F.Z && vals == F.values
true
schur(A, B) -> F::GeneralizedSchur
Вычисляет обобщенную факторизацию Шура (или QZ) матриц A
и B
. (квази) треугольные факторы Шура можно получить из объекта Schur
F
с помощью F.S
и F.T
, левые унитарные/ортогональные векторы Шура можно получить с помощью F.left
или F.Q
, а правые унитарные/ортогональные векторы Шура можно получить с помощью F.right
или F.Z
, так что A=F.left*F.S*F.right'
и B=F.left*F.T*F.right'
. Обобщенные собственные значения A
и B
можно получить с помощью F.α./F.β
.
Итерация разложения производит компоненты F.S
, F.T
, F.Q
, F.Z
, F.α
и F.β
.
LinearAlgebra.schur!
— Functionschur!(A) -> F::Schur
То же самое, что и schur
, но использует входной аргумент A
в качестве рабочего пространства.
Примеры
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 фактор:
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0
Z фактор:
2×2 Matrix{Float64}:
0.961524 0.274721
-0.274721 0.961524
собственные значения:
2-элементный 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
То же самое, что и schur
, но использует входные матрицы A
и B
в качестве рабочего пространства.
LinearAlgebra.ordschur
— Functionordschur(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
Переставляет факторизацию Шура F
матрицы A = Z*T*Z'
в соответствии с логическим массивом select
, возвращая переупорядоченную факторизацию объекта F
. Выбранные собственные значения появляются на главной диагонали F.Schur
, а соответствующие ведущие столбцы F.vectors
образуют ортогональное/унитарное основание соответствующего правого инвариантного подпространства. В реальном случае пара комплексно-сопряженных собственных значений должна быть либо полностью включена, либо полностью исключена через select
.
ordschur(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
Переставляет обобщенную Шур-факторизацию F
пары матриц (A, B) = (Q*S*Z', Q*T*Z')
в соответствии с логическим массивом select
и возвращает объект GeneralizedSchur F
. Выбранные собственные значения появляются на главной диагонали как F.S
, так и F.T
, а левые и правые ортогональные/унитарные векторы Шура также переставляются так, что (A, B) = F.Q*(F.S, F.T)*F.Z'
по-прежнему выполняется, и обобщенные собственные значения A
и B
все еще могут быть получены с помощью F.α./F.β
.
LinearAlgebra.ordschur!
— Functionordschur!(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur
То же самое, что и ordschur
, но перезаписывает факторизацию F
.
ordschur!(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur
То же самое, что и ordschur
, но перезаписывает факторизацию F
.
LinearAlgebra.SVD
— TypeSVD <: Factorization
Тип разложения матрицы сингулярного значения (SVD) матрицы A
. Это тип возвращаемого значения функции svd(_)
, соответствующей функции разложения матрицы.
Если F::SVD
— это объект разложения, то U
, S
, V
и Vt
можно получить через F.U
, F.S
, F.V
и F.Vt
, так что A = U * Diagonal(S) * Vt
. Сингулярные значения в S
отсортированы в порядке убывания.
Итерация разложения производит компоненты U
, S
и V
.
Примеры
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
сингулярные значения:
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; # деструктуризация через итерацию
julia> u == F.U && s == F.S && v == F.V
true
LinearAlgebra.GeneralizedSVD
— TypeGeneralizedSVD <: Factorization
Тип матричной факторизации обобщенного сингулярного разложения (SVD) двух матриц A
и B
, так что A = F.U*F.D1*F.R0*F.Q'
и B = F.V*F.D2*F.R0*F.Q'
. Это тип возвращаемого значения функции svd(_, _)
, соответствующей функции матричной факторизации.
Для матрицы A
размером M на N и матрицы B
размером P на N,
U
— это ортогональная матрица размером M на M,V
— это ортогональная матрица размером P на P,Q
— это ортогональная матрица размером N на N,D1
— это диагональная матрица размером M на (K+L) с единицами в первых K элементах,D2
— это матрица размером P на (K+L), у которой верхний правый блок размером L на L является диагональным,R0
— это матрица размером (K+L) на N, у которой правый блок размером (K+L) на (K+L) является невырожденной верхней блочной треугольной матрицей,
K+L
— это эффективный числовой ранг матрицы [A; B]
.
Итерация разложения производит компоненты U
, V
, Q
, D1
, D2
и R0
.
Элементы F.D1
и F.D2
взаимосвязаны, как объясняется в документации LAPACK для обобщенного SVD и процедуры xGGSVD3, которая вызывается под капотом (в LAPACK 3.6.0 и новее).
Примеры
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
Вычисляет сингулярное разложение (SVD) матрицы A
и возвращает объект SVD
.
U
, S
, V
и Vt
можно получить из разложения F
с помощью F.U
, F.S
, F.V
и F.Vt
, так что A = U * Diagonal(S) * Vt
. Алгоритм производит Vt
, и, следовательно, Vt
более эффективно извлекать, чем V
. Сингулярные значения в S
отсортированы в порядке убывания.
Итерация разложения производит компоненты U
, S
и V
.
Если full = false
(по умолчанию), возвращается "тонкое" SVD. Для матрицы размером $M \times N$ A
в полном разложении U
имеет размер $M \times M$, а V
имеет размер $N \times N$, в то время как в тонком разложении U
имеет размер $M \times K$, а V
имеет размер $N \times K$, где $K = \min(M,N)$ — это количество сингулярных значений.
Если alg = DivideAndConquer()
, используется алгоритм деления и завоевания для вычисления SVD. Другой (обычно более медленный, но более точный) вариант — alg = QRIteration()
.
Аргумент ключевого слова alg
требует Julia 1.3 или более поздней версии.
Примеры
julia> A = rand(4,3);
julia> F = svd(A); # Сохранить объект разложения
julia> A ≈ F.U * Diagonal(F.S) * F.Vt
true
julia> U, S, V = F; # деструктуризация через итерацию
julia> A ≈ U * Diagonal(S) * V'
true
julia> Uonly, = svd(A); # Сохранить только U
julia> Uonly == U
true
svd(A, B) -> GeneralizedSVD
Вычисляет обобщенное SVD матриц A
и B
, возвращая объект факторизации GeneralizedSVD
F
, такой что [A;B] = [F.U * F.D1; F.V * F.D2] * F.R0 * F.Q'
U
— ортогональная матрица размером M на M,V
— ортогональная матрица размером P на P,Q
— ортогональная матрица размером N на N,D1
— диагональная матрица размером M на (K+L) с единицами в первых K элементах,D2
— матрица размером P на (K+L), верхний правый блок которой размером L на L является диагональным,R0
— матрица размером (K+L) на N, правый блок размером (K+L) на (K+L) которой является невырожденной верхней блочной треугольной матрицей,
K+L
— эффективный числовой ранг матрицы [A; B]
.
Итерация разложения производит компоненты U
, V
, Q
, D1
, D2
и R0
.
Обобщенное SVD используется в приложениях, таких как сравнение того, сколько принадлежит A
, а сколько принадлежит B
, например, в сравнении генома человека и дрожжей, или сигнала и шума, или между кластерами и внутри кластеров. (См. обсуждение Эдельмана и Вана: https://arxiv.org/abs/1901.00485)
Оно разлагает [A; B]
на [UC; VS]H
, где [UC; VS]
является естественным ортогональным базисом для столбцового пространства [A; B]
, а H = RQ'
— естественным неортогональным базисом для строкового пространства [A;B]
, где верхние строки в наибольшей степени относятся к матрице A
, а нижние — к матрице B
. Матрцы многоугольного косинуса/синуса C
и S
предоставляют многомерную меру того, сколько A
по сравнению с тем, сколько B
, а U
и V
предоставляют направления, в которых это измеряется.
Примеры
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!
такой же, как svd
, но экономит место, перезаписывая входные данные A
, вместо создания копии. См. документацию по svd
для получения подробной информации.
svd!(A, B) -> ОбобщённоеSVD
svd!
то же самое, что и svd
, но изменяет аргументы A
и B
на месте, вместо того чтобы создавать их копии. См. документацию по svd
для получения подробной информации.
LinearAlgebra.svdvals
— Functionsvdvals(A)
Возвращает сингулярные значения A
в порядке убывания.
Примеры
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)
Возвращает обобщенные сингулярные значения из обобщенного сингулярного разложения A
и B
. См. также svd
.
Примеры
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)
Возвращает сингулярные значения A
, экономя место, перезаписывая входные данные. См. также svdvals
и svd
.
svdvals!(A, B)
Возвращает обобщенные сингулярные значения из обобщенного сингулярного разложения A
и B
, экономя место, перезаписывая A
и B
. См. также svd
и svdvals
.
LinearAlgebra.Givens
— TypeLinearAlgebra.Givens(i1,i2,c,s) -> G
Оператор линейного вращения Гивенса. Поля c
и s
представляют собой косинус и синус угла вращения соответственно. Тип Givens
поддерживает левое умножение G*A
и сопряженное транспонирование правого умножения A*G'
. Этот тип не имеет size
и, следовательно, может умножаться на матрицы произвольного размера, при условии что i2<=size(A,2)
для G*A
или i2<=size(A,1)
для A*G'
.
См. также givens
.
LinearAlgebra.givens
— Functiongivens(f::T, g::T, i1::Integer, i2::Integer) where {T} -> (G::Givens, r::T)
Вычисляет вращение Гивенса G
и скаляр r
так, что для любого вектора x
, где
x[i1] = f
x[i2] = g
результат умножения
y = G*x
имеет свойство, что
y[i1] = r
y[i2] = 0
См. также LinearAlgebra.Givens
.
givens(A::AbstractArray, i1::Integer, i2::Integer, j::Integer) -> (G::Givens, r)
Вычисляет вращение Гивенса G
и скаляр r
, так что результат умножения
B = G*A
имеет свойство, что
B[i1,j] = r
B[i2,j] = 0
Смотрите также LinearAlgebra.Givens
.
givens(x::AbstractVector, i1::Integer, i2::Integer) -> (G::Givens, r)
Вычисляет вращение Гивенса G
и скаляр r
, так что результат умножения
B = G*x
имеет свойство, что
B[i1] = r
B[i2] = 0
См. также LinearAlgebra.Givens
.
LinearAlgebra.triu
— Functiontriu(M)
Верхний треугольник матрицы.
Примеры
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)
Возвращает верхний треугольник M
, начиная с k
-й наддиагонали.
Примеры
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)
Верхний треугольник матрицы, перезаписывая M
в процессе. См. также triu
.
triu!(M, k::Integer)
Возвращает верхний треугольник M
, начиная с k
-й супердиагонали, перезаписывая M
в процессе.
Примеры
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)
Нижний треугольник матрицы.
Примеры
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)
Возвращает нижний треугольник M
, начиная с k
-й наддиагонали.
Примеры
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)
Нижний треугольник матрицы, перезаписывая M
в процессе. См. также tril
.
tril!(M, k::Integer)
Возвращает нижний треугольник M
, начиная с k
-й наддиагонали, перезаписывая M
в процессе.
Примеры
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())
AbstractRange
, дающий индексы k
-й диагонали матрицы M
. При желании можно указать стиль индексации, который определяет тип возвращаемого диапазона. Если indstyle isa IndexLinear
(по умолчанию), это возвращает AbstractRange{Integer}
. С другой стороны, если indstyle isa IndexCartesian
, это возвращает AbstractRange{CartesianIndex{2}}
.
Если k
не указан, предполагается, что он равен 0
(соответствует главной диагонали).
См. также: diag
, diagm
, Diagonal
.
Примеры
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)
Указание IndexStyle
требует как минимум Julia 1.11.
LinearAlgebra.diag
— Functiondiag(M, k::Integer=0)
k
-я диагональ матрицы, в виде вектора.
См. также diagm
, diagind
, Diagonal
, isdiag
.
Примеры
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}...)
Создает матрицу из Pair
диагоналей и векторов. Вектор kv.second
будет размещен на диагонали kv.first
. По умолчанию матрица квадратная, и ее размер определяется из kv
, но можно указать прямоугольный размер m
×n
(дополняя нулями по мере необходимости), передав m,n
в качестве первых аргументов. Для повторяющихся индексов диагоналей kv.first
значения в соответствующих векторах kv.second
будут складываться.
diagm
создает полную матрицу; если вам нужны версии с эффективным хранением и быстрой арифметикой, смотрите Diagonal
, Bidiagonal
Tridiagonal
и SymTridiagonal
.
Примеры
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)
Создает матрицу с элементами вектора в качестве диагональных элементов. По умолчанию матрица квадратная, и ее размер задается length(v)
, но можно указать прямоугольный размер m
×n
, передав m,n
в качестве первых аргументов.
Примеры
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
Возвращает ранг QR-разложения
rank(S::SparseMatrixCSC{Tv,Ti}; [tol::Real]) -> Ti
Вычисляет ранг S
, вычисляя его QR-факторизацию. Значения меньше tol
считаются нулевыми. См. руководство SPQR.
rank(A::AbstractMatrix; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
rank(A::AbstractMatrix, rtol::Real)
Вычисляет численный ранг матрицы, подсчитывая, сколько значений из svdvals(A)
больше max(atol, rtol*σ₁)
, где σ₁
— это наибольшее вычисленное сингулярное значение матрицы A
. atol
и rtol
— это абсолютные и относительные допуски соответственно. Значение относительного допуска по умолчанию равно n*ϵ
, где n
— это размер наименьшего измерения A
, а ϵ
— это eps
типа элементов A
.
Численный ранг может быть чувствительной и неточной характеристикой плохо обусловленных матриц с сингулярными значениями, близкими к предельному допуску max(atol, rtol*σ₁)
. В таких случаях небольшие изменения в вычислении сингулярных значений или в самой матрице могут изменить результат rank
, переместив одно или несколько сингулярных значений через порог. Эти вариации могут даже происходить из-за изменений в ошибках с плавающей запятой между различными версиями Julia, архитектурами, компиляторами или операционными системами.
Аргументы ключевых слов atol
и rtol
требуют как минимум Julia 1.1. В Julia 1.0 rtol
доступен как позиционный аргумент, но это будет устаревать в Julia 2.0.
Примеры
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)
Для любого итерируемого контейнера A
(включая массивы любой размерности) чисел (или любого типа элементов, для которого определена norm
), вычисляется p
-норма (по умолчанию p=2
), как если бы A
был вектором соответствующей длины.
p
-норма определяется как
\[\|A\|_p = \left( \sum_{i=1}^n | a_i | ^p \right)^{1/p}\]
где $a_i$ — это элементы A
, $| a_i |$ — это norm
для $a_i$, и $n$ — длина A
. Поскольку p
-норма вычисляется с использованием norm
элементов A
, p
-норма вектора векторов не совместима с интерпретацией его как блочного вектора в общем случае, если p != 2
.
p
может принимать любое числовое значение (хотя не все значения дают математически корректную векторную норму). В частности, norm(A, Inf)
возвращает наибольшее значение в abs.(A)
, в то время как norm(A, -Inf)
возвращает наименьшее. Если A
— это матрица и p=2
, то это эквивалентно норме Фробениуса.
Второй аргумент p
не обязательно является частью интерфейса для norm
, т.е. пользовательский тип может реализовать только norm(A)
без второго аргумента.
Используйте opnorm
для вычисления операторной нормы матрицы.
Примеры
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)
Для чисел верните $\left( |x|^p \right)^{1/p}$.
Примеры
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)
Вычисляет операторную норму (или норму матрицы), индуцированную векторной p
-нормой, где допустимые значения p
равны 1
, 2
или Inf
. (Обратите внимание, что для разреженных матриц p=2
в настоящее время не реализован.) Используйте norm
для вычисления нормы Фробениуса.
Когда p=1
, операторная норма равна максимальной абсолютной сумме столбцов матрицы A
:
\[\|A\|_1 = \max_{1 ≤ j ≤ n} \sum_{i=1}^m | a_{ij} |\]
где $a_{ij}$ — это элементы матрицы A
, а $m$ и $n$ — её размеры.
Когда p=2
, операторная норма равна спектральной норме, равной наибольшему сингулярному значению матрицы A
.
Когда p=Inf
, операторная норма равна максимальной абсолютной сумме строк матрицы A
:
\[\|A\|_\infty = \max_{1 ≤ i ≤ m} \sum _{j=1}^n | a_{ij} |\]
Примеры
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)
Для чисел вернуть $\left( |x|^p \right)^{1/p}$. Это эквивалентно norm
.
opnorm(A::Adjoint{<:Any,<:AbstractVector}, q::Real=2)
opnorm(A::Transpose{<:Any,<:AbstractVector}, q::Real=2)
Для векторов, обернутых в Adjoint/Transpose, возвращает операторную $q$-норму A
, которая эквивалентна p
-норме со значением p = q/(q-1)
. Они совпадают при p = q = 2
. Используйте norm
, чтобы вычислить p
норму A
как вектора.
Разница в норме между векторным пространством и его двойственным возникает для сохранения взаимосвязи между двойственностью и скалярным произведением, и результат согласуется с операторной p
-нормой матрицы 1 × n
.
Примеры
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)
Нормализуйте массив a
на месте так, чтобы его p
-норма равнялась единице, т.е. norm(a, p) == 1
. См. также normalize
и norm
.
LinearAlgebra.normalize
— Functionnormalize(a, p::Real=2)
Нормализует a
так, чтобы его p
-норма равнялась единице, т.е. norm(a, p) == 1
. Для скалярных значений это похоже на sign(a), за исключением того, что normalize(0) = NaN. См. также normalize!
, norm
и sign
.
Примеры
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)
Число обусловленности матрицы M
, вычисляемое с использованием оператора p
-нормы. Допустимые значения для p
— 1
, 2
(по умолчанию) или 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}\]
Число обусловленности Скела $\kappa_S$ матрицы M
, опционально относительно вектора x
, вычисляемое с использованием оператора p
-нормы. $\left\vert M \right\vert$ обозначает матрицу (поэлементных) абсолютных значений $M$; $\left\vert M \right\vert_{ij} = \left\vert M_{ij} \right\vert$. Допустимые значения для p
— 1
, 2
и Inf
(по умолчанию).
Эта величина также известна в литературе как число обусловленности Бауэра, относительное число обусловленности или компонентное относительное число обусловленности.
LinearAlgebra.tr
— Functiontr(M)
След матрицы. Суммирует диагональные элементы M
.
Примеры
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> tr(A)
5
LinearAlgebra.det
— Functiondet(M)
Определитель матрицы.
Смотрите также: logdet
и logabsdet
.
Примеры
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> det(M)
2.0
LinearAlgebra.logdet
— Functionlogdet(M)
Логарифм детерминанта матрицы. Эквивалентно log(det(M))
, но может обеспечить повышенную точность и избежать переполнения/недополнения.
Примеры
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)
Логарифм абсолютного значения определителя матрицы. Эквивалентно (log(abs(det(M))), sign(det(M)))
, но может обеспечить повышенную точность и/или скорость.
Примеры
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)
Обратная матрица. Вычисляет матрицу N
, такую что M * N = I
, где I
— это единичная матрица. Вычисляется путем решения левой деления N = M \ I
.
Примеры
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) # будет устаревшим в Julia 2.0
Вычисляет псдониверс Мура-Пенроуза.
Для матриц M
с элементами с плавающей точкой удобно вычислять псдониверс, инвертируя только сингулярные значения, превышающие max(atol, rtol*σ₁)
, где σ₁
— это наибольшее сингулярное значение M
.
Оптимальный выбор абсолютной (atol
) и относительной точности (rtol
) варьируется как в зависимости от значения M
, так и от предполагаемого применения псдониверса. Значение относительной точности по умолчанию равно n*ϵ
, где n
— это размер наименьшего измерения M
, а ϵ
— это eps
типа элементов M
.
Для инверсии плотных плохо обусловленных матриц в смысле наименьших квадратов рекомендуется использовать rtol = sqrt(eps(real(float(oneunit(eltype(M))))))
.
Для получения дополнительной информации см. [issue8859], [B96], [S84], [KY88].
Примеры
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) # будет устаревшим в Julia 2.0
Вычисляет базис для нулевого пространства `M`, включая сингулярные векторы `M`, чьи сингулярные значения имеют величину меньше, чем `max(atol, rtol*σ₁)`, где `σ₁` — это наибольшее сингулярное значение `M`.
По умолчанию относительная точность `rtol` равна `n*ϵ`, где `n` — это размер наименьшего измерения `M`, а `ϵ` — это [`eps`](@ref) типа элементов `M`.
# Примеры
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)
Вычисляет произведение Кронекера двух векторов, матриц или чисел.
Для вещественных векторов v
и w
произведение Кронекера связано с внешним произведением через kron(v,w) == vec(w * transpose(v))
или w * transpose(v) == reshape(kron(v,w), (length(w), length(v)))
. Обратите внимание, как порядок v
и w
отличается слева и справа от этих выражений (из-за хранения по столбцам). Для комплексных векторов внешнее произведение w * v'
также отличается конъюгацией v
.
Примеры
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)
Вычисляет произведение Кронекера A
и B
и сохраняет результат в C
, перезаписывая существующее содержимое C
. Это версия с изменением на месте для kron
.
Эта функция требует Julia 1.6 или более поздней версии.
Base.exp
— Methodexp(A::AbstractMatrix)
Вычисляет матричную экспоненту A
, определяемую
\[e^A = \sum_{n=0}^{\infty} \frac{A^n}{n!}.\]
Для симметричной или эрмитовой A
используется собственное разложение (eigen
), в противном случае выбирается алгоритм масштабирования и возведения в квадрат (см. [H05]).
Примеры
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)
Более эффективный метод для exp(im*A)
квадратной матрицы A
(особенно если A
является Гермицианской
или вещественной Симметричной
).
Поддержка использования cis
с матрицами была добавлена в Julia 1.7.
Примеры
julia> cis([π 0; 0 π]) ≈ -I
true
Base.:^
— Method^(A::AbstractMatrix, p::Number)
Степень матрицы, эквивалентная $\exp(p\log(A))$
Примеры
julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
1 26
0 27
Base.:^
— Method^(b::Number, A::AbstractMatrix)
Матрица экспонента, эквивалентная $\exp(\log(b)A)$.
Поддержка возведения Irrational
чисел (таких как ℯ
) в матрицу была добавлена в Julia 1.1.
Примеры
julia> 2^[1 2; 0 3]
2×2 Matrix{Float64}:
2.0 6.0
0.0 8.0
julia> ℯ^[1 2; 0 3]
2×2 Matrix{Float64}:
2.71828 17.3673
0.0 20.0855
Base.log
— Methodlog(A::AbstractMatrix)
Если A
не имеет отрицательных действительных собственных значений, вычисляется главный матричный логарифм A
, т.е. уникальная матрица $X$, такая что $e^X = A$ и $-\pi < Im(\lambda) < \pi$ для всех собственных значений $\lambda$ матрицы $X$. Если A
имеет неположительные собственные значения, возвращается неприоритетная матричная функция, когда это возможно.
Если A
симметрична или эрмитова, используется ее собственное разложение (eigen
), если A
треугольная, применяется улучшенная версия метода обратного масштабирования и квадратирования (см. [AH12] и [AHR13]). Если A
действительная и не имеет отрицательных собственных значений, то вычисляется действительная форма Шура. В противном случае вычисляется комплексная форма Шура. Затем используется верхний (квази-)треугольный алгоритм из [AHR13] на верхнем (квази-)треугольном факторе.
Примеры
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)
Возвращает $\sqrt{x}$.
Вызывает DomainError
для отрицательных Real
аргументов. Вместо этого используйте комплексные отрицательные аргументы. Обратите внимание, что sqrt
имеет разрыв вдоль отрицательной действительной оси.
Префиксный оператор √
эквивалентен sqrt
.
Смотрите также: hypot
.
Примеры
julia> sqrt(big(81))
9.0
julia> sqrt(big(-81))
ERROR: DomainError with -81.0:
NaN result for non-NaN input.
Stacktrace:
[1] sqrt(::BigFloat) at ./mpfr.jl:501
[...]
julia> sqrt(big(complex(-81)))
0.0 + 9.0im
julia> sqrt(-81 - 0.0im) # -0.0im находится ниже разрыва
0.0 - 9.0im
julia> .√(1:4)
4-element Vector{Float64}:
1.0
1.4142135623730951
1.7320508075688772
2.0
sqrt(A::AbstractMatrix)
Если A
не имеет отрицательных действительных собственных значений, вычисляется главная матричная квадратный корень из A
, то есть уникальная матрица $X$ с собственными значениями, имеющими положительную действительную часть, такая что $X^2 = A$. В противном случае возвращается неглавный квадратный корень.
Если A
является действительно-симметричной или эрмитовой, то для вычисления квадратного корня используется её собственное разложение (eigen
). Для таких матриц собственные значения λ, которые кажутся слегка отрицательными из-за ошибок округления, рассматриваются как нулевые. Более точно, матрицы со всеми собственными значениями ≥ -rtol*(max |λ|)
рассматриваются как полуположительные (что приводит к эрмитовому квадратному корню), при этом отрицательные собственные значения принимаются за ноль. rtol
— это именованный аргумент для sqrt
(только в случае эрмитовых/действительно-симметричных матриц), который по умолчанию равен машинной точности, масштабированной по size(A,1)
.
В противном случае квадратный корень определяется с помощью метода Бьёрка-Хаммарлинга [BH83], который вычисляет комплексную форму Шура (schur
) и затем комплексный квадратный корень треугольного фактора. Если существует действительный квадратный корень, то вместо этого используется расширение этого метода [H87], которое вычисляет действительную форму Шура и затем действительный квадратный корень квази-треугольного фактора.
Примеры
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})
Вычисляет кубический корень действительной матрицы A
. Если T = cbrt(A)
, то мы имеем T*T*T ≈ A
, см. пример ниже.
Если A
симметрична, т.е. имеет тип HermOrSym{<:Real}
, то для нахождения кубического корня используется (eigen
). В противном случае используется специализированная версия алгоритма p-го корня [S03], которая использует действительное разложение Шура (schur
) для вычисления кубического корня.
Примеры
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)
Вычисляет косинус матрицы квадратной матрицы A
.
Если A
симметрична или эрмитова, ее собственное разложение (eigen
) используется для вычисления косинуса. В противном случае косинус определяется вызовом exp
.
Примеры
julia> cos(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.sin
— Methodsin(A::AbstractMatrix)
Вычисляет синус матрицы квадратной матрицы A
.
Если A
симметрична или эрмитова, ее собственное разложение (eigen
) используется для вычисления синуса. В противном случае синус определяется вызовом exp
.
Примеры
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)
Вычисляет синус и косинус матрицы квадратной матрицы A
.
Примеры
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)
Вычисляет матричную тангенс квадратной матрицы A
.
Если A
симметрична или эрмитова, ее собственное разложение (eigen
) используется для вычисления тангенса. В противном случае тангенс определяется вызовом exp
.
Примеры
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)
Вычисляет секанту матрицы для квадратной матрицы A
.
Base.Math.csc
— Methodcsc(A::AbstractMatrix)
Вычисляет косекант матрицы для квадратной матрицы A
.
Base.Math.cot
— Methodcot(A::AbstractMatrix)
Вычисляет матричный котангенс квадратной матрицы A
.
Base.cosh
— Methodcosh(A::AbstractMatrix)
Вычисляет гиперболический косинус матрицы для квадратной матрицы A
.
Base.sinh
— Methodsinh(A::AbstractMatrix)
Вычисляет гиперболический синус матрицы для квадратной матрицы A
.
Base.tanh
— Methodtanh(A::AbstractMatrix)
Вычисляет гиперболический тангенс матрицы для квадратной матрицы A
.
Base.Math.sech
— Methodsech(A::AbstractMatrix)
Вычисляет гиперболический секанс матрицы квадратной матрицы A
.
Base.Math.csch
— Methodcsch(A::AbstractMatrix)
Вычисляет гиперболический косекант матрицы квадратной матрицы A
.
Base.Math.coth
— Methodcoth(A::AbstractMatrix)
Вычисляет гиперболический котангенс матрицы квадратной матрицы A
.
Base.acos
— Methodacos(A::AbstractMatrix)
Вычисляет обратный косинус матрицы A
.
Если A
симметрична или эрмитова, то для вычисления обратного косинуса используется её собственное разложение (eigen
). В противном случае обратный косинус определяется с использованием log
и sqrt
. Для теории и логарифмических формул, используемых для вычисления этой функции, см. [AH16_1].
Примеры
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)
Вычисляет обратный синус матрицы A
.
Если A
симметрична или эрмитова, ее собственное разложение (eigen
) используется для вычисления обратного синуса. В противном случае обратный синус определяется с использованием log
и sqrt
. Для теории и логарифмических формул, используемых для вычисления этой функции, см. [AH16_2].
Примеры
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)
Вычисляет обратную тангенс матрицы для квадратной матрицы A
.
Если A
симметрична или эрмитова, ее собственное разложение (eigen
) используется для вычисления обратного тангенса. В противном случае обратный тангенс определяется с использованием log
. Для теории и логарифмических формул, используемых для вычисления этой функции, см. [AH16_3].
Примеры
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)
Вычисляет обратную матрицу секанта A
.
Base.Math.acsc
— Methodacsc(A::AbstractMatrix)
Вычисляет обратную матрицу косеканта A
.
Base.Math.acot
— Methodacot(A::AbstractMatrix)
Вычисляет обратную матрицу котангенса A
.
Base.acosh
— Methodacosh(A::AbstractMatrix)
Вычисляет обратный гиперболический косинус матрицы A
. Для теории и логарифмических формул, используемых для вычисления этой функции, см. [AH16_4].
Base.asinh
— Methodasinh(A::AbstractMatrix)
Вычисляет обратную гиперболическую матричную синус квадратной матрицы A
. Для теории и логарифмических формул, используемых для вычисления этой функции, см. [AH16_5].
Base.atanh
— Methodatanh(A::AbstractMatrix)
Вычисляет обратную гиперболическую матричную тангенс квадратной матрицы A
. Для теории и логарифмических формул, используемых для вычисления этой функции, см. [AH16_6].
Base.Math.asech
— Methodasech(A::AbstractMatrix)
Вычисляет гиперболический секанс обратной матрицы A
.
Base.Math.acsch
— Methodacsch(A::AbstractMatrix)
Вычисляет обратную матричную гиперболическую коскосеканту A
.
Base.Math.acoth
— Methodacoth(A::AbstractMatrix)
Вычисляет обратную матричную гиперболическую котангенсу A
.
LinearAlgebra.lyap
— Functionlyap(A, C)
Вычисляет решение X
для уравнения Ляпунова в непрерывном времени AX + XA' + C = 0
, где ни одно собственное значение A
не имеет нулевую действительную часть, и ни два собственных значения не являются отрицательными комплексно-сопряженными.
Примеры
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)
Вычисляет решение X
для уравнения Сильвестра AX + XB + C = 0
, где A
, B
и C
имеют совместимые размеры, а A
и -B
не имеют собственных значений с равной действительной частью.
Примеры
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)
Проверьте, что факторизация матрицы удалась.
issuccess(::CholeskyPivoted)
требует Julia 1.6 или новее.
Примеры
julia> F = cholesky([1 0; 0 1]);
julia> issuccess(F)
true
issuccess(F::LU; allowsingular = false)
Проверьте, что LU-разложение матрицы прошло успешно. По умолчанию разложение, которое производит действительное, но недостаточно ранговое U, считается неудачным. Это можно изменить, передав allowsingular = true
.
Аргумент ключевого слова allowsingular
был добавлен в Julia 1.11.
Примеры
julia> F = lu([1 2; 1 2], check = false);
julia> issuccess(F)
false
julia> issuccess(F, allowsingular = true)
true
LinearAlgebra.issymmetric
— Functionissymmetric(A) -> Bool
Проверьте, является ли матрица симметричной.
Примеры
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
Проверьте, является ли матрица положительно определенной (и эрмитовой), пытаясь выполнить разложение Холецкого для A
.
Смотрите также isposdef!
, cholesky
.
Примеры
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> isposdef(A)
true
LinearAlgebra.isposdef!
— Functionisposdef!(A) -> Bool
Проверьте, является ли матрица положительно определенной (и эрмитовой), пытаясь выполнить разложение Холецкого для A
, перезаписывая A
в процессе. См. также isposdef
.
Примеры
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
Проверьте, является ли A
нижней треугольной матрицей, начиная с k
-й наддиагонали.
Примеры
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
Проверьте, является ли A
верхней треугольной матрицей, начиная с k
-й супердиагонали.
Примеры
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
Проверьте, является ли матрица диагональной в том смысле, что iszero(A[i,j])
истинно, если i != j
. Обратите внимание, что не обязательно, чтобы A
была квадратной; если вы также хотите это проверить, вам нужно убедиться, что size(A, 1) == size(A, 2)
.
Примеры
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
Проверьте, является ли матрица эрмитовой.
Примеры
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)
Ленивая транспозиция. Мутация возвращаемого объекта должна соответствующим образом мутировать A
. Часто, но не всегда, возвращает Transpose(A)
, где Transpose
является оберткой для ленивой транспозиции. Обратите внимание, что эта операция рекурсивна.
Эта операция предназначена для использования в линейной алгебре - для общей манипуляции данными смотрите permutedims
, которая не является рекурсивной.
Примеры
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 # транспозиция транспозиции разворачивает родителя
true
julia> Transpose(B) # однако, конструктор всегда оборачивает свой аргумент
2×2 transpose(transpose(::Matrix{Int64})) with eltype Int64:
3 2
0 0
julia> B[1,2] = 4; # изменение B автоматически изменит A
julia> A
2×2 Matrix{Int64}:
3 2
4 0
Для комплексных матриц операция adjoint
эквивалентна сопряженной транспозиции.
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
Транспозиция AbstractVector
является строковым вектором:
julia> v = [1,2,3]
3-element Vector{Int64}:
1
2
3
julia> transpose(v) # возвращает строковый вектор
1×3 transpose(::Vector{Int64}) with eltype Int64:
1 2 3
julia> transpose(v) * v # вычисление скалярного произведения
14
Для матрицы матриц отдельные блоки обрабатываются рекурсивно:
julia> C = [1 3; 2 4]
2×2 Matrix{Int64}:
1 3
2 4
julia> D = reshape([C, 2C, 3C, 4C], 2, 2) # построение блочной матрицы
2×2 Matrix{Matrix{Int64}}:
[1 3; 2 4] [3 9; 6 12]
[2 6; 4 8] [4 12; 8 16]
julia> transpose(D) # блоки рекурсивно транспонируются
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)
Ленивая транспонирование факторизации F
. По умолчанию возвращает TransposeFactorization
, за исключением Factorization
с действительным eltype
, в этом случае возвращает AdjointFactorization
.
LinearAlgebra.transpose!
— Functiontranspose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
Транспонирует матрицу A
и сохраняет её в матрице X
. size(X)
должен быть равен size(transpose(A))
. Дополнительная память не выделяется, кроме изменения размера rowval и nzval X
, если это необходимо.
См. halfperm!
transpose!(dest,src)
Транспонируйте массив src
и сохраните результат в предварительно выделенном массиве dest
, который должен иметь размер, соответствующий (size(src,2),size(src,1))
. Прямое транспонирование не поддерживается, и могут возникнуть неожиданные результаты, если src
и dest
имеют перекрывающиеся области памяти.
Примеры
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
— TypeТранспонирование
Ленивая обертка для представления транспонированного вида основного объекта линейной алгебры, обычно AbstractVector
/AbstractMatrix
. Обычно конструктор Transpose
не следует вызывать напрямую, вместо этого используйте transpose
. Чтобы материализовать вид, используйте copy
.
Этот тип предназначен для использования в линейной алгебре - для общей манипуляции данными смотрите permutedims
.
Примеры
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
Ленивая обертка для транспонированного объекта Factorization
. Обычно конструктор TransposeFactorization
не следует вызывать напрямую, вместо этого используйте transpose(:: Factorization)
.
Base.adjoint
— FunctionA'
adjoint(A)
Ленивая сопряженная (конъюгированная транспозиция). Обратите внимание, что adjoint
применяется рекурсивно к элементам.
Для числовых типов adjoint
возвращает комплексно-сопряженное значение, и, следовательно, эквивалентен функции идентичности для вещественных чисел.
Эта операция предназначена для использования в линейной алгебре - для общей манипуляции данными смотрите permutedims
.
Примеры
julia> A = [3+2im 9+2im; 0 0]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
0+0im 0+0im
julia> B = A' # эквивалентно 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 # сопряженное значение от сопряженного значения разворачивает родителя
true
julia> Adjoint(B) # однако, конструктор всегда оборачивает свой аргумент
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; # изменение B автоматически изменит A
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
4-5im 0+0im
Для вещественных матриц операция adjoint
эквивалентна 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
Сопряженное значение AbstractVector
- это строковый вектор:
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 # вычислить скалярное произведение, эквивалентно x' * x
25 + 0im
Для матрицы матриц отдельные блоки обрабатываются рекурсивно:
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]
adjoint(F::Factorization)
Ленивая адъюнктная функция факторизации F
. По умолчанию возвращает обертку AdjointFactorization
.
LinearAlgebra.adjoint!
— Functionadjoint!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
Транспонирует матрицу A
и сохраняет адъюнкт элементов в матрице X
. size(X)
должен быть равен size(transpose(A))
. Дополнительная память не выделяется, кроме изменения размера rowval и nzval матрицы X
, если это необходимо.
См. halfperm!
adjoint!(dest,src)
Сопряжённая транспонированная матрица src
и сохраните результат в заранее выделенном массиве dest
, который должен иметь размер, соответствующий (size(src,2),size(src,1))
. Прямое транспонирование не поддерживается, и неожиданные результаты могут возникнуть, если src
и dest
имеют перекрывающиеся области памяти.
Примеры
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
— TypeСопряженный
Ленивая обертка для сопряженного представления основного объекта линейной алгебры, обычно это AbstractVector
/AbstractMatrix
. Обычно конструктор Adjoint
не следует вызывать напрямую, вместо этого используйте adjoint
. Чтобы материализовать представление, используйте copy
.
Этот тип предназначен для использования в линейной алгебре - для общей манипуляции данными смотрите permutedims
.
Примеры
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}}) with eltype Complex{Int64}:
3-2im 0+0im
9-2im 0+0im
LinearAlgebra.AdjointFactorization
— TypeAdjointFactorization
Ленивая обертка для адъюнкта основного объекта Factorization
. Обычно конструктор AdjointFactorization
не следует вызывать напрямую, вместо этого используйте adjoint(:: Factorization)
.
Base.copy
— Methodcopy(A::Transpose)
copy(A::Adjoint)
С нетерпением оценивайте ленивую транспонированную/сопряженную матрицу. Обратите внимание, что транспонирование применяется рекурсивно к элементам.
Эта операция предназначена для использования в линейной алгебре - для общей манипуляции данными смотрите permutedims
, которая не является рекурсивной.
Примеры
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
Вернуть расстояние между последовательными элементами массива в размерности 1 в единицах размера элемента.
Примеры
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)
Проверьте, что матрица является квадратной, затем верните ее общую размерность. Для нескольких аргументов верните вектор.
Примеры
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
вычисляет пиковую скорость операций с плавающей запятой (flop) компьютера, используя двойную точность gemm!
. По умолчанию, если не указаны аргументы, он умножает две матрицы Float64
размером n x n
, где n = 4096
. Если используемая BLAS поддерживает многопоточность, достигаются более высокие скорости flop. Количество потоков BLAS можно установить с помощью BLAS.set_num_threads(n)
.
Если указан аргумент ключевого слова eltype
, peakflops
создаст матрицы с элементами типа eltype
для вычисления пикового значения flop.
По умолчанию peakflops
будет использовать лучшее время из 3 испытаний. Если указан аргумент ключевого слова ntrials
, peakflops
будет использовать указанное количество испытаний для выбора лучшего времени.
Если аргумент ключевого слова parallel
установлен в true
, peakflops
выполняется параллельно на всех рабочих процессорах. Возвращается скорость flop всего параллельного компьютера. При выполнении в параллельном режиме используется только 1 поток BLAS. Аргумент n
по-прежнему относится к размеру задачи, которая решается на каждом процессоре.
Эта функция требует как минимум Julia 1.1. В Julia 1.0 она доступна из стандартной библиотеки InteractiveUtils
.
LinearAlgebra.hermitianpart
— Functionhermitianpart(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
Возвращает гермитову часть квадратной матрицы A
, определяемую как (A + A') / 2
, в виде матрицы Hermitian
. Для вещественных матриц A
это также известно как симметрическая часть A
; это также иногда называют "действительной частью оператора". Необязательный аргумент uplo
управляет соответствующим аргументом представления Hermitian
. Для вещественных матриц последнее эквивалентно представлению Symmetric
.
Смотрите также hermitianpart!
для соответствующей операции на месте.
Эта функция требует Julia 1.10 или более поздней версии.
LinearAlgebra.hermitianpart!
— Functionhermitianpart!(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
Перезапишите квадратную матрицу A
на месте с её гермитовой частью (A + A') / 2
и верните Hermitian(A, uplo)
. Для вещественных матриц A
это также известно как симметричная часть A
.
Смотрите также hermitianpart
для соответствующей операции вне места.
Эта функция требует Julia 1.10 или более поздней версии.
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
Эффективно копирует элементы матрицы A
в B
с адъюнкцией следующим образом:
B[ir_dest, jr_dest] = adjoint(A)[jr_src, ir_src]
Элементы B[ir_dest, jr_dest]
перезаписываются. Более того, параметры диапазона индексов должны удовлетворять length(ir_dest) == length(jr_src)
и 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
Эффективно копирует элементы матрицы A
в B
с транспонированием следующим образом:
B[ir_dest, jr_dest] = transpose(A)[jr_src, ir_src]
Элементы B[ir_dest, jr_dest]
перезаписываются. Более того, параметры диапазона индексов должны удовлетворять length(ir_dest) == length(jr_src)
и 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
Эффективно копирует элементы матрицы M
в B
, в зависимости от параметра символа tM
, следующим образом:
tM | Назначение | Источник |
---|---|---|
'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] |
Элементы B[ir_dest, jr_dest]
перезаписываются. Кроме того, параметры диапазона индексов должны удовлетворять length(ir_dest) == length(jr_src)
и length(jr_dest) == length(ir_src)
.
Смотрите также copyto!
и copy_adjoint!
.
Low-level matrix operations
Во многих случаях существуют версии операций с матрицами, которые выполняются на месте и позволяют вам предоставить заранее выделенный вектор или матрицу для вывода. Это полезно при оптимизации критически важного кода, чтобы избежать накладных расходов на повторные выделения. Эти операции на месте имеют суффикс !
ниже (например, mul!
) в соответствии с обычной конвенцией Julia.
LinearAlgebra.mul!
— Functionmul!(Y, A, B) -> Y
Вычисляет произведение матрицы-матрицы или матрицы-вектора $A B$ и сохраняет результат в Y
, перезаписывая существующее значение Y
. Обратите внимание, что Y
не должно быть алиасом ни для A
, ни для B
.
Примеры
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
Реализация
Для пользовательских типов матриц и векторов рекомендуется реализовать mul!
с 5 аргументами, а не реализовывать mul!
с 3 аргументами напрямую, если это возможно.
mul!(C, A, B, α, β) -> C
Совместное умножение-сложение матриц или векторов $A B α + C β$ с изменением на месте. Результат сохраняется в C
, перезаписывая его. Обратите внимание, что C
не должен быть алиасом ни для A
, ни для B
.
Функция mul!
с пятью аргументами требует как минимум Julia 1.3.
Примеры
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]; # Копия оригинального значения C
julia> C == A * B * α + C_original * β
true
LinearAlgebra.lmul!
— Functionlmul!(a::Number, B::AbstractArray)
Масштабирует массив B
на скаляр a
, перезаписывая B
на месте. Используйте rmul!
, чтобы умножить скаляр справа. Операция масштабирования уважает семантику умножения *
между a
и элементом B
. В частности, это также относится к умножению, включающему конечные числа, такие как NaN
и ±Inf
.
До Julia 1.1 записи NaN
и ±Inf
в B
обрабатывались непоследовательно.
Примеры
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)
Вычисляет произведение матриц $AB$, перезаписывая B
, и возвращает результат. Здесь A
должен быть специальным типом матрицы, например, Diagonal
, UpperTriangular
или LowerTriangular
, или некоторым ортогональным типом, см. QR
.
Примеры
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)
Масштабирует массив A
на скаляр b
, перезаписывая A
на месте. Используйте lmul!
, чтобы умножить скаляр слева. Операция масштабирования уважает семантику умножения *
между элементом A
и b
. В частности, это также относится к умножению, включающему конечные числа, такие как NaN
и ±Inf
.
До Julia 1.1 записи NaN
и ±Inf
в A
обрабатывались непоследовательно.
Примеры
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)
Вычисляет произведение матриц $AB$, перезаписывая A
, и возвращает результат. Здесь B
должен быть специальным типом матрицы, например, Diagonal
, UpperTriangular
или LowerTriangular
, или некоторым ортогональным типом, см. QR
.
Примеры
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
Вычисляет A \ B
на месте и сохраняет результат в Y
, возвращая результат.
Аргумент A
не должен быть матрицей. Вместо матриц он должен быть объектом факторизации (например, полученным с помощью factorize
или cholesky
). Причина в том, что факторизация сама по себе является затратной и обычно выделяет память (хотя ее также можно выполнить на месте с помощью, например, lu!
), и в ситуациях, критичных к производительности, требующих ldiv!
, обычно также требуется тонкий контроль над факторизацией A
.
Определенные структурированные типы матриц, такие как Diagonal
и UpperTriangular
, разрешены, так как они уже находятся в факторизованной форме
Примеры
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)
Вычисляет A \ B
на месте, перезаписывая B
, чтобы сохранить результат.
Аргумент A
не должен быть матрицей. Вместо матриц он должен быть объектом факторизации (например, созданным с помощью factorize
или cholesky
). Причина этого заключается в том, что факторизация сама по себе является дорогостоящей и обычно требует выделения памяти (хотя это также можно сделать на месте с помощью, например, lu!
), и в ситуациях, критически важных для производительности, требующих ldiv!
, обычно также требуется тонкий контроль над факторизацией A
.
Некоторые структурированные типы матриц, такие как Diagonal
и UpperTriangular
, разрешены, так как они уже находятся в факторизованной форме
Примеры
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)
Разделите каждую запись в массиве B
на скаляр a
, перезаписывая B
на месте. Используйте rdiv!
, чтобы разделить скаляр справа.
Примеры
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
Вычисляет A \ B
на месте с помощью гауссовского исключения с частичным выбором и сохраняет результат в B
, возвращая результат. В процессе диагонали A
также перезаписываются.
ldiv!
для левых частей Tridiagonal
требует как минимум Julia 1.11.
LinearAlgebra.rdiv!
— Functionrdiv!(A, B)
Вычисляет A / B
на месте, перезаписывая A
для хранения результата.
Аргумент B
не должен быть матрицей. Вместо матриц он должен быть объектом факторизации (например, созданным с помощью factorize
или cholesky
). Причина этого заключается в том, что факторизация сама по себе является дорогостоящей и обычно выделяет память (хотя это также можно сделать на месте с помощью, например, lu!
), и в ситуациях, критически важных для производительности, требующих rdiv!
, обычно также требуется тонкий контроль над факторизацией B
.
Определенные структурированные типы матриц, такие как Diagonal
и UpperTriangular
, разрешены, так как они уже находятся в факторизованной форме.
rdiv!(A::AbstractArray, b::Number)
Разделите каждую запись в массиве A
на скаляр b
, перезаписывая A
на месте. Используйте ldiv!
, чтобы разделить скаляр слева.
Примеры
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
В Julia (как и во многих научных вычислениях) операции с плотной линейной алгеброй основаны на LAPACK library, который, в свою очередь, построен на основе основных строительных блоков линейной алгебры, известных как BLAS. Существуют высоко оптимизированные реализации BLAS для каждой архитектуры компьютера, и иногда в высокопроизводительных рутинных операциях линейной алгебры полезно вызывать функции BLAS напрямую.
LinearAlgebra.BLAS
предоставляет обертки для некоторых функций BLAS. Те функции BLAS, которые перезаписывают один из входных массивов, имеют названия, заканчивающиеся на '!'
. Обычно для функции BLAS определено четыре метода для массивов Float32
, Float64
, ComplexF32
и ComplexF64
.
BLAS character arguments
Многие функции BLAS принимают аргументы, которые определяют, нужно ли транспонировать аргумент (trans
), какую треугольную часть матрицы использовать (uplo
или ul
), можно ли считать диагональ треугольной матрицы равной единице (dA
) или с какой стороны умножения матриц находится входной аргумент (side
). Возможности следующие:
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
— ModuleИнтерфейс к подпрограммам BLAS.
LinearAlgebra.BLAS.set_num_threads
— Functionset_num_threads(n::Integer)
set_num_threads(::Nothing)
Установите количество потоков, которые библиотека BLAS должна использовать, равным n::Integer
.
Также принимает nothing
, в этом случае julia пытается угадать количество потоков по умолчанию. Передача nothing
не рекомендуется и в основном существует по историческим причинам.
LinearAlgebra.BLAS.get_num_threads
— Functionget_num_threads()
Получите количество потоков, которые использует библиотека BLAS.
get_num_threads
требует как минимум Julia 1.6.
Функции BLAS можно разделить на три группы, также называемые тремя уровнями, в зависимости от того, когда они были впервые предложены, типа входных параметров и сложности операции.
Level 1 BLAS functions
Функции уровня 1 BLAS были впервые предложены в [(Lawson, 1979)][Lawson-1979] и определяют операции между скалярами и векторами.
[Lawson-1979]: https://dl.acm.org/doi/10.1145/355841.355847
LinearAlgebra.BLAS.rot!
— Functionrot!(n, X, incx, Y, incy, c, s)
Перезаписывает X
как c*X + s*Y
и Y
как -conj(s)*X + c*Y
для первых n
элементов массива X
с шагом incx
и первых n
элементов массива Y
с шагом incy
. Возвращает X
и Y
.
rot!
требует как минимум Julia 1.5.
LinearAlgebra.BLAS.scal!
— Functionscal!(n, a, X, incx)
scal!(a, X)
Перезаписывает X
как a*X
для первых n
элементов массива X
с шагом incx
. Возвращает X
.
Если n
и incx
не указаны, используются length(X)
и stride(X,1)
.
LinearAlgebra.BLAS.scal
— Functionscal(n, a, X, incx)
scal(a, X)
Возвращает X
, масштабированный на a
для первых n
элементов массива X
с шагом incx
.
Если n
и incx
не указаны, используются length(X)
и stride(X,1)
.
LinearAlgebra.BLAS.blascopy!
— Functionblascopy!(n, X, incx, Y, incy)
Копирует n
элементов массива X
с шагом incx
в массив Y
с шагом incy
. Возвращает Y
.
LinearAlgebra.BLAS.dot
— Functiondot(n, X, incx, Y, incy)
Скалярное произведение двух векторов, состоящих из n
элементов массива X
с шагом incx
и n
элементов массива Y
с шагом incy
.
Примеры
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)
Функция Dot для двух комплексных векторов, состоящих из n
элементов массива X
с шагом incx
и n
элементов массива Y
с шагом incy
.
Примеры
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)
Функция Dot для двух комплексных векторов, состоящих из n
элементов массива X
с шагом incx
и n
элементов массива U
с шагом incy
, конъюгируя первый вектор.
Примеры
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-норма вектора, состоящего из n
элементов массива X
с шагом incx
.
Примеры
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)
Сумма модулей первых n
элементов массива X
с шагом incx
.
Для вещественного массива модуль — это абсолютное значение. Для комплексного массива модуль — это сумма абсолютного значения действительной части и абсолютного значения мнимой части.
Примеры
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)
Найдите индекс элемента dx
с максимальным абсолютным значением. n
— это длина dx
, а incx
— это шаг. Если n
и incx
не указаны, они принимают значения по умолчанию: n=length(dx)
и incx=stride1(dx)
.
Level 2 BLAS functions
Функции уровня 2 BLAS были опубликованы в [(Dongarra, 1988)][Dongarra-1988] и определяют операции матрица-вектор.
[Dongarra-1988]: https://dl.acm.org/doi/10.1145/42288.42291
вернуть вектор
LinearAlgebra.BLAS.gemv!
— Functiongemv!(tA, alpha, A, x, beta, y)
Обновите вектор y
как alpha*A*x + beta*y
или alpha*A'x + beta*y
в зависимости от tA
. alpha
и beta
являются скалярами. Верните обновленный y
.
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, alpha, A, x)
Возвращает alpha*A*x
или alpha*A'x
в зависимости от tA
. alpha
является скаляром.
LinearAlgebra.BLAS.gemv
— Methodgemv(tA, A, x)
Возвращает A*x
или A'x
в зависимости от tA
.
LinearAlgebra.BLAS.gbmv!
— Functiongbmv!(trans, m, kl, ku, alpha, A, x, beta, y)
Обновите вектор y
как alpha*A*x + beta*y
или alpha*A'*x + beta*y
в зависимости от trans
. Матрица A
является общей ленточной матрицей размером m
на size(A,2)
с kl
поддиагоналями и ku
наддиагоналями. alpha
и beta
являются скалярами. Верните обновленный y
.
LinearAlgebra.BLAS.gbmv
— Functiongbmv(trans, m, kl, ku, alpha, A, x)
Возвращает alpha*A*x
или alpha*A'*x
в зависимости от trans
. Матрица A
является общей ленточной матрицей размером m
на size(A,2)
с kl
поддиагоналями и ku
наддиагоналями, а alpha
является скаляром.
LinearAlgebra.BLAS.hemv!
— Functionhemv!(ul, alpha, A, x, beta, y)
Обновите вектор y
как alpha*A*x + beta*y
. A
предполагается как эрмитова. Используется только ul
треугольник A
. alpha
и beta
являются скалярами. Верните обновленный y
.
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, alpha, A, x)
Возвращает alpha*A*x
. Предполагается, что A
является эрмитовой. Используется только ul
треугольник A
. alpha
является скаляром.
LinearAlgebra.BLAS.hemv
— Methodhemv(ul, A, x)
Возвращает A*x
. Предполагается, что A
является эрмитовым. Используется только ul
треугольник A
.
LinearAlgebra.BLAS.hpmv!
— Functionhpmv!(uplo, α, AP, x, β, y)
Обновите вектор y
как α*A*x + β*y
, где A
— это эрмитова матрица, представленная в упакованном формате AP
.
При uplo = 'U'
массив AP должен содержать верхнюю треугольную часть эрмитовой матрицы, упакованную последовательно, по столбцам, так что AP[1]
содержит A[1, 1]
, AP[2]
и AP[3]
содержат A[1, 2]
и A[2, 2]
соответственно, и так далее.
При uplo = 'L'
массив AP должен содержать нижнюю треугольную часть эрмитовой матрицы, упакованную последовательно, по столбцам, так что AP[1]
содержит A[1, 1]
, AP[2]
и AP[3]
содержат A[2, 1]
и A[3, 1]
соответственно, и так далее.
Скалярные входные данные α
и β
должны быть комплексными или вещественными числами.
Массивы x
, y
и AP
должны быть типа ComplexF32
или ComplexF64
.
Верните обновленный y
.
hpmv!
требует как минимум Julia 1.5.
LinearAlgebra.BLAS.symv!
— Functionsymv!(ul, alpha, A, x, beta, y)
Обновите вектор y
как alpha*A*x + beta*y
. A
предполагается симметричным. Используется только ul
треугольник A
. alpha
и beta
являются скалярами. Верните обновленный y
.
LinearAlgebra.BLAS.symv
— Methodsymv(ul, alpha, A, x)
Возвращает alpha*A*x
. Предполагается, что A
является симметричной. Используется только ul
треугольник A
. alpha
является скаляром.
LinearAlgebra.BLAS.symv
— Methodsymv(ul, A, x)
Возвращает A*x
. Предполагается, что A
является симметричной. Используется только ul
треугольник A
.
LinearAlgebra.BLAS.sbmv!
— Functionsbmv!(uplo, k, alpha, A, x, beta, y)
Обновите вектор y
как alpha*A*x + beta*y
, где A
является симметричной ленточной матрицей порядка size(A,2)
с k
наддиагоналями, хранящимися в аргументе A
. Формат хранения для A
описан в справочном модуле BLAS, уровень-2 BLAS на https://www.netlib.org/lapack/explore-html/. Используется только треугольник uplo
матрицы A
.
Возвращает обновленный y
.
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, alpha, A, x)
Возвращает alpha*A*x
, где A
является симметричной ленточной матрицей порядка size(A,2)
с k
наддиагоналями, хранящимися в аргументе A
. Используется только uplo
треугольник матрицы A
.
LinearAlgebra.BLAS.sbmv
— Methodsbmv(uplo, k, A, x)
Возвращает A*x
, где A
является симметричной ленточной матрицей порядка size(A,2)
с k
наддиагоналями, хранящимися в аргументе A
. Используется только треугольник uplo
матрицы A
.
LinearAlgebra.BLAS.spmv!
— Functionspmv!(uplo, α, AP, x, β, y)
Обновите вектор y
как α*A*x + β*y
, где A
- симметрическая матрица, представленная в упакованном формате AP
.
При uplo = 'U'
массив AP должен содержать верхнюю треугольную часть симметрической матрицы, упакованную последовательно, по столбцам, так что AP[1]
содержит A[1, 1]
, AP[2]
и AP[3]
содержат A[1, 2]
и A[2, 2]
соответственно, и так далее.
При uplo = 'L'
массив AP должен содержать нижнюю треугольную часть симметрической матрицы, упакованную последовательно, по столбцам, так что AP[1]
содержит A[1, 1]
, AP[2]
и AP[3]
содержат A[2, 1]
и A[3, 1]
соответственно, и так далее.
Скалярные входные данные α
и β
должны быть действительными.
Массивы x
, y
и AP
должны быть типа Float32
или Float64
.
Верните обновленный y
.
spmv!
требует как минимум Julia 1.5.
LinearAlgebra.BLAS.trmv!
— Functiontrmv!(ul, tA, dA, A, b)
Возвращает op(A)*b
, где op
определяется tA
. Используется только ul
треугольник A
. dA
определяет, читаются ли диагональные значения или предполагается, что они все равны единице. Умножение происходит на месте в b
.
LinearAlgebra.BLAS.trmv
— Functiontrmv(ul, tA, dA, A, b)
Возвращает op(A)*b
, где op
определяется tA
. Используется только ul
треугольник матрицы A
. dA
определяет, читаются ли диагональные значения или предполагается, что они все равны единице.
LinearAlgebra.BLAS.trsv!
— Functiontrsv!(ul, tA, dA, A, b)
Перезапишите b
с решением уравнения A*x = b
или одного из двух других вариантов, определяемых tA
и ul
. dA
определяет, читаются ли диагональные значения или предполагается, что они все равны единице. Верните обновленное b
.
LinearAlgebra.BLAS.trsv
— Functiontrsv(ul, tA, dA, A, b)
Возвращает решение уравнения A*x = b
или один из двух других вариантов, определяемых tA
и ul
. dA
определяет, считываются ли диагональные значения или предполагается, что они все равны единице.
вернуть матрицу
LinearAlgebra.BLAS.ger!
— Functionger!(alpha, x, y, A)
Ранг-1 обновление матрицы A
с векторами x
и y
в виде alpha*x*y' + A
.
LinearAlgebra.BLAS.her!
— Functionher!(uplo, alpha, x, A)
Методы только для комплексных массивов. Ранг-1 обновление эрмитовой матрицы A
с вектором x
как alpha*x*x' + A
. uplo
управляет тем, какая треугольная часть A
обновляется. Возвращает A
.
LinearAlgebra.BLAS.syr!
— Functionsyr!(uplo, alpha, x, A)
Ранг-1 обновление симметричной матрицы A
с вектором x
как alpha*x*transpose(x) + A
. uplo
управляет тем, какая треугольная часть A
обновляется. Возвращает A
.
LinearAlgebra.BLAS.spr!
— Functionspr!(uplo, α, x, AP)
Обновите матрицу A
как A+α*x*x'
, где A
- симметричная матрица, представленная в упакованном формате AP
, а x
- вектор.
При uplo = 'U'
массив AP должен содержать верхнюю треугольную часть симметричной матрицы, упакованную последовательно, по столбцам, так что AP[1]
содержит A[1, 1]
, AP[2]
и AP[3]
содержат A[1, 2]
и A[2, 2]
соответственно, и так далее.
При uplo = 'L'
массив AP должен содержать нижнюю треугольную часть симметричной матрицы, упакованную последовательно, по столбцам, так что AP[1]
содержит A[1, 1]
, AP[2]
и AP[3]
содержат A[2, 1]
и A[3, 1]
соответственно, и так далее.
Скалярный ввод α
должен быть действительным.
Массивы x
и AP
должны быть типа Float32
или Float64
. Верните обновленный AP
.
spr!
требует как минимум Julia 1.8.
Level 3 BLAS functions
Функции уровня 3 BLAS были опубликованы в [(Dongarra, 1990)][Dongarra-1990] и определяют операции матрица-матрица.
[Dongarra-1990]: https://dl.acm.org/doi/10.1145/77626.79170
LinearAlgebra.BLAS.gemmt!
— Functiongemmt!(uplo, tA, tB, alpha, A, B, beta, C)
Обновите нижнюю или верхнюю треугольную часть, указанную uplo
, матрицы C
как alpha*A*B + beta*C
или другие варианты в зависимости от tA
и tB
. Верните обновленную матрицу C
.
gemmt!
требует как минимум Julia 1.11.
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, alpha, A, B)
Возвращает нижнюю или верхнюю треугольную часть, указанную uplo
, от A*B
или других трех вариантов в зависимости от tA
и tB
.
gemmt
требует как минимум Julia 1.11.
LinearAlgebra.BLAS.gemmt
— Methodgemmt(uplo, tA, tB, A, B)
Возвращает нижнюю или верхнюю треугольную часть, указанную uplo
, от A*B
или другие три варианта в зависимости от tA
и tB
.
gemmt
требует как минимум Julia 1.11.
LinearAlgebra.BLAS.gemm!
— Functiongemm!(tA, tB, alpha, A, B, beta, C)
Обновите C
как alpha*A*B + beta*C
или другие три варианта в зависимости от tA
и tB
. Верните обновленный C
.
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, alpha, A, B)
Возвращает alpha*A*B
или другие три варианта в зависимости от tA
и tB
.
LinearAlgebra.BLAS.gemm
— Methodgemm(tA, tB, A, B)
Возвращает A*B
или другие три варианта в зависимости от tA
и tB
.
LinearAlgebra.BLAS.symm!
— Functionsymm!(side, ul, alpha, A, B, beta, C)
Обновите C
как alpha*A*B + beta*C
или alpha*B*A + beta*C
в зависимости от side
. Предполагается, что A
является симметричной. Используется только ul
треугольник A
. Верните обновленный C
.
LinearAlgebra.BLAS.symm
— Methodsymm(side, ul, alpha, A, B)
Возвращает alpha*A*B
или alpha*B*A
в зависимости от side
. Предполагается, что A
является симметричной. Используется только ul
треугольник A
.
LinearAlgebra.BLAS.symm
— Methodsymm(side, ul, A, B)
Возвращает A*B
или B*A
в зависимости от side
. Предполагается, что A
является симметричной. Используется только ul
треугольник A
.
LinearAlgebra.BLAS.hemm!
— Functionhemm!(side, ul, alpha, A, B, beta, C)
Обновите C
как alpha*A*B + beta*C
или alpha*B*A + beta*C
в зависимости от side
. Предполагается, что A
является эрмитовой. Используется только ul
треугольник A
. Верните обновленный C
.
LinearAlgebra.BLAS.hemm
— Methodhemm(side, ul, alpha, A, B)
Возвращает alpha*A*B
или alpha*B*A
в зависимости от side
. Предполагается, что A
является эрмитовой. Используется только треугольник ul
матрицы A
.
LinearAlgebra.BLAS.hemm
— Methodhemm(side, ul, A, B)
Возвращает A*B
или B*A
в зависимости от side
. Предполагается, что A
является эрмитовым. Используется только ul
треугольник A
.
LinearAlgebra.BLAS.syrk!
— Functionsyrk!(uplo, trans, alpha, A, beta, C)
Ранговое обновление симметричной матрицы C
как alpha*A*transpose(A) + beta*C
или alpha*transpose(A)*A + beta*C
в зависимости от trans
. Используется только uplo
треугольник C
. Возвращает C
.
LinearAlgebra.BLAS.syrk
— Functionsyrk(uplo, trans, alpha, A)
Возвращает либо верхний треугольник, либо нижний треугольник матрицы A
, в зависимости от uplo
, от alpha*A*transpose(A)
или alpha*transpose(A)*A
, в зависимости от trans
.
LinearAlgebra.BLAS.herk!
— Functionherk!(uplo, trans, alpha, A, beta, C)
Методы только для комплексных массивов. Обновление ранга-k эрмитовой матрицы C
как alpha*A*A' + beta*C
или alpha*A'*A + beta*C
в зависимости от trans
. Обновляется только uplo
треугольник C
. Возвращает C
.
LinearAlgebra.BLAS.herk
— Functionherk(uplo, trans, alpha, A)
Методы только для комплексных массивов. Возвращает uplo
треугольник alpha*A*A'
или alpha*A'*A
, в зависимости от trans
.
LinearAlgebra.BLAS.syr2k!
— Functionsyr2k!(uplo, trans, alpha, A, B, beta, C)
Обновление ранга-2k симметрической матрицы C
в виде alpha*A*transpose(B) + alpha*B*transpose(A) + beta*C
или alpha*transpose(A)*B + alpha*transpose(B)*A + beta*C
в зависимости от trans
. Используется только uplo
треугольник матрицы C
. Возвращает C
.
LinearAlgebra.BLAS.syr2k
— Functionsyr2k(uplo, trans, alpha, A, B)
Возвращает треугольник uplo
от alpha*A*transpose(B) + alpha*B*transpose(A)
или alpha*transpose(A)*B + alpha*transpose(B)*A
, в зависимости от trans
.
syr2k(uplo, trans, A, B)
Возвращает треугольник uplo
матрицы A*transpose(B) + B*transpose(A)
или transpose(A)*B + transpose(B)*A
, в зависимости от trans
.
LinearAlgebra.BLAS.her2k!
— Functionher2k!(uplo, trans, alpha, A, B, beta, C)
Обновление ранга-2k гермитовой матрицы C
в виде alpha*A*B' + alpha*B*A' + beta*C
или alpha*A'*B + alpha*B'*A + beta*C
в зависимости от trans
. Скаляр beta
должен быть действительным. Используется только uplo
треугольник матрицы C
. Возвращает C
.
LinearAlgebra.BLAS.her2k
— Functionher2k(uplo, trans, alpha, A, B)
Возвращает uplo
треугольник alpha*A*B' + alpha*B*A'
или alpha*A'*B + alpha*B'*A
, в зависимости от trans
.
her2k(uplo, trans, A, B)
Возвращает uplo
треугольник A*B' + B*A'
или A'*B + B'*A
, в зависимости от trans
.
LinearAlgebra.BLAS.trmm!
— Functiontrmm!(сторона, ul, tA, dA, alpha, A, B)
Обновите B
как alpha*A*B
или один из трех других вариантов, определяемых side
и tA
. Используется только ul
треугольник A
. dA
определяет, читаются ли диагональные значения или предполагается, что все они равны единице. Верните обновленный B
.
LinearAlgebra.BLAS.trmm
— Functiontrmm(side, ul, tA, dA, alpha, A, B)
Возвращает alpha*A*B
или один из других трех вариантов, определяемых side
и tA
. Используется только ul
треугольник матрицы A
. dA
определяет, читаются ли диагональные значения или предполагается, что они все равны единице.
LinearAlgebra.BLAS.trsm!
— Functiontrsm!(сторона, ul, tA, dA, альфа, A, B)
Перезаписывает B
решением уравнения A*X = альфа*B
или одного из трех других вариантов, определяемых сторона
и tA
. Используется только ul
треугольник матрицы A
. dA
определяет, читаются ли диагональные значения или предполагается, что они все равны единице. Возвращает обновленное B
.
LinearAlgebra.BLAS.trsm
— Functiontrsm(side, ul, tA, dA, alpha, A, B)
Возвращает решение уравнения A*X = alpha*B
или один из трех других вариантов, определяемых side
и tA
. Используется только ul
треугольник матрицы A
. dA
определяет, считываются ли диагональные значения или предполагается, что они все равны единице.
LAPACK functions
LinearAlgebra.LAPACK
предоставляет обертки для некоторых функций LAPACK для линейной алгебры. Функции, которые перезаписывают один из входных массивов, имеют названия, заканчивающиеся на '!'
.
Обычно функция имеет 4 метода, определенных для Float64
, Float32
, массивов ComplexF64
и ComplexF32
.
Обратите внимание, что API LAPACK, предоставляемый Julia, может измениться в будущем. Поскольку этот API не предназначен для пользователей, нет обязательств по поддержке/устареванию этого конкретного набора функций в будущих релизах.
LinearAlgebra.LAPACK
— ModuleИнтерфейсы к подпрограммам LAPACK.
LinearAlgebra.LAPACK.gbtrf!
— Functiongbtrf!(kl, ku, m, AB) -> (AB, ipiv)
Вычисляет LU-разложение ленточной матрицы AB
. kl
— это первая поддиагональ, содержащая ненулевую полосу, ku
— последняя наддиагональ, содержащая одну, а m
— это первое измерение матрицы AB
. Возвращает LU-разложение на месте и ipiv
, вектор пивотов, используемых.
LinearAlgebra.LAPACK.gbtrs!
— Functiongbtrs!(trans, kl, ku, m, AB, ipiv, B)
Решите уравнение AB * X = B
. trans
определяет ориентацию AB
. Это может быть N
(без транспонирования), T
(транспонирование) или C
(сопряженное транспонирование). kl
- это первая поддиагональ, содержащая ненулевую полосу, ku
- последняя наддиагональ, содержащая одну, а m
- это первое измерение матрицы AB
. ipiv
- это вектор пивотов, возвращаемый из gbtrf!
. Возвращает вектор или матрицу X
, перезаписывая B
на месте.
LinearAlgebra.LAPACK.gebal!
— Functiongebal!(job, A) -> (ilo, ihi, scale)
Сбалансируйте матрицу A
перед вычислением её собственных значений или факторизации Шура. job
может быть одним из N
(A
не будет переставлена или масштабирована), P
(A
будет только переставлена), S
(A
будет только масштабирована) или B
(A
будет и переставлена, и масштабирована). Модифицирует A
на месте и возвращает ilo
, ihi
и scale
. Если перестановка была включена, то A[i,j] = 0
, если j > i
и 1 < j < ilo
или j > ihi
. scale
содержит информацию о выполненных масштабировании/перестановках.
LinearAlgebra.LAPACK.gebak!
— Functiongebak!(job, side, ilo, ihi, scale, V)
Преобразует собственные векторы V
матрицы, сбалансированной с помощью gebal!
, в несмасштабированные/неперемешанные собственные векторы оригинальной матрицы. Модифицирует V
на месте. side
может быть L
(преобразуются левые собственные векторы) или R
(преобразуются правые собственные векторы).
LinearAlgebra.LAPACK.gebrd!
— Functiongebrd!(A) -> (A, d, e, tauq, taup)
Сокращает A
на месте до бидиагональной формы A = QBP'
. Возвращает A
, содержащую бидиагональную матрицу B
; d
, содержащий диагональные элементы B
; e
, содержащий недиагональные элементы B
; tauq
, содержащий элементарные отражатели, представляющие Q
; и taup
, содержащий элементарные отражатели, представляющие P
.
LinearAlgebra.LAPACK.gelqf!
— Functiongelqf!(A, tau)
Вычисляет LQ
факторизацию A
, A = LQ
. tau
содержит скаляры, которые параметризуют элементарные отражатели факторизации. tau
должен иметь длину, большую или равную наименьшему размеру A
.
Возвращает A
и tau
, измененные на месте.
gelqf!(A) -> (A, tau)
Вычисляет LQ
факторизацию A
, A = LQ
.
Возвращает A
, измененный на месте, и tau
, который содержит скаляры, параметризующие элементарные отражатели факторизации.
LinearAlgebra.LAPACK.geqlf!
— Functiongeqlf!(A, tau)
Вычисляет QL
факторизацию A
, A = QL
. tau
содержит скаляры, которые параметризуют элементарные отражатели факторизации. tau
должен иметь длину, большую или равную наименьшему размеру A
.
Возвращает A
и tau
, измененные на месте.
geqlf!(A) -> (A, tau)
Вычисляет QL
факторизацию A
, A = QL
.
Возвращает A
, измененный на месте, и tau
, который содержит скаляры, параметризующие элементарные отражатели факторизации.
LinearAlgebra.LAPACK.geqrf!
— Functiongeqrf!(A, tau)
Вычисляет QR
факторизацию A
, A = QR
. tau
содержит скаляры, которые параметризуют элементарные отражатели факторизации. tau
должен иметь длину, большую или равную наименьшему размеру A
.
Возвращает A
и tau
, измененные на месте.
geqrf!(A) -> (A, tau)
Вычисляет QR
факторизацию A
, A = QR
.
Возвращает A
, изменённую на месте, и tau
, который содержит скаляры, параметризующие элементарные отражатели факторизации.
LinearAlgebra.LAPACK.geqp3!
— Functiongeqp3!(A, [jpvt, tau]) -> (A, tau, jpvt)
Вычисляет разложение QR
с учетом пивотирования матрицы A
, AP = QR
, используя BLAS уровня 3. P
— это матрица пивотирования, представленная jpvt
. tau
хранит элементарные отражатели. Аргументы jpvt
и tau
являются необязательными и позволяют передавать предварительно выделенные массивы. Если они переданы, jpvt
должен иметь длину, большую или равную n
, если A
является матрицей размером (m x n)
, а tau
должен иметь длину, большую или равную наименьшему размеру A
. При входе, если jpvt[j]
не равен нулю, то j
-й столбец A
перемещается в начало AP
.
A
, jpvt
и tau
изменяются на месте.
LinearAlgebra.LAPACK.gerqf!
— Functiongerqf!(A, tau)
Вычисляет RQ
факторизацию A
, A = RQ
. tau
содержит скаляры, которые параметризуют элементарные отражатели факторизации. Длина tau
должна быть больше или равна наименьшему размеру A
.
Возвращает A
и tau
, измененные на месте.
gerqf!(A) -> (A, tau)
Вычисляет RQ
факторизацию A
, A = RQ
.
Возвращает A
, измененный на месте, и tau
, который содержит скаляры, параметризующие элементарные отражатели факторизации.
LinearAlgebra.LAPACK.geqrt!
— Functiongeqrt!(A, T)
Вычисляет блочную QR
факторизацию A
, A = QR
. T
содержит верхние треугольные блочные отражатели, которые параметризуют элементарные отражатели факторизации. Первая размерность T
задает размер блока и должна быть между 1 и n
. Вторая размерность T
должна быть равна наименьшей размерности A
.
Возвращает A
и T
, измененные на месте.
geqrt!(A, nb) -> (A, T)
Вычисляет блочную QR
факторизацию A
, A = QR
. nb
задает размер блока и должен быть между 1 и n
, вторым измерением A
.
Возвращает A
, измененный на месте, и T
, который содержит верхние треугольные блочные отражатели, которые параметризуют элементарные отражатели факторизации.
LinearAlgebra.LAPACK.geqrt3!
— Functiongeqrt3!(A, T)
Рекурсивно вычисляет блочную QR
факторизацию A
, A = QR
. T
содержит верхние треугольные блочные отражатели, которые параметризуют элементарные отражатели факторизации. Первая размерность T
задает размер блока и должна быть между 1 и n
. Вторая размерность T
должна быть равна наименьшей размерности A
.
Возвращает A
и T
, измененные на месте.
geqrt3!(A) -> (A, T)
Рекурсивно вычисляет блочную QR
факторизацию A
, A = QR
.
Возвращает A
, изменённую на месте, и T
, который содержит верхние треугольные блочные отражатели, которые параметризуют элементарные отражатели факторизации.
LinearAlgebra.LAPACK.getrf!
— Functiongetrf!(A, ipiv) -> (A, ipiv, info)
Вычисляет разложение LU
с учетом перестановок для A
, A = LU
. ipiv
содержит информацию о перестановках, а info
— код, который указывает на успех (info = 0
), сингулярное значение в U
(info = i
, в этом случае U[i,i]
сингулярно) или код ошибки (info < 0
).
getrf!(A) -> (A, ipiv, info)
Вычисляет разложение LU
с учетом перестановок для A
, A = LU
.
Возвращает A
, измененный на месте, ipiv
, информацию о перестановках, и код info
, который указывает на успех (info = 0
), сингулярное значение в U
(info = i
, в этом случае U[i,i]
сингулярно) или код ошибки (info < 0
).
LinearAlgebra.LAPACK.tzrzf!
— Functiontzrzf!(A) -> (A, tau)
Преобразует верхнюю трапециевидную матрицу A
в верхнюю треугольную форму на месте. Возвращает A
и tau
, скалярные параметры для элементарных отражателей преобразования.
LinearAlgebra.LAPACK.ormrz!
— Functionormrz!(side, trans, A, tau, C)
Умножает матрицу C
на Q
из преобразования, предоставленного tzrzf!
. В зависимости от side
или trans
умножение может быть с левой стороны (side = L, Q*C
) или с правой стороны (side = R, C*Q
), и Q
может быть неизменным (trans = N
), транспонированным (trans = T
) или сопряженно транспонированным (trans = C
). Возвращает матрицу C
, которая изменяется на месте с результатом умножения.
LinearAlgebra.LAPACK.gels!
— Functiongels!(trans, A, B) -> (F, B, ssr)
Решает линейное уравнение A * X = B
, transpose(A) * X = B
или adjoint(A) * X = B
с использованием QR или LQ факторизации. Модифицирует матрицу/вектор B
на месте с решением. A
перезаписывается своей QR
или LQ
факторизацией. trans
может быть одним из N
(без модификации), T
(транспонированная) или C
(сопряженная транспонированная). gels!
ищет решение с минимальной нормой/методом наименьших квадратов. A
может быть недоопределенной или переопределенной. Решение возвращается в B
.
LinearAlgebra.LAPACK.gesv!
— Functiongesv!(A, B) -> (B, A, ipiv)
Решает линейное уравнение A * X = B
, где A
является квадратной матрицей, используя LU
факторизацию A
. A
перезаписывается своей LU
факторизацией, а B
перезаписывается решением X
. ipiv
содержит информацию о перестановках для LU
факторизации A
.
LinearAlgebra.LAPACK.getrs!
— Functiongetrs!(trans, A, ipiv, B)
Решает линейное уравнение A * X = B
, transpose(A) * X = B
или adjoint(A) * X = B
для квадратной матрицы A
. Модифицирует матрицу/вектор B
на месте с решением. A
является разложением LU
из getrf!
, с ipiv
как информацией о перестановках. trans
может быть одним из N
(без модификации), T
(транспонированная) или C
(сопряженно-транспонированная).
LinearAlgebra.LAPACK.getri!
— Functiongetri!(A, ipiv)
Вычисляет обратную матрицу A
, используя ее LU
факторизацию, найденную с помощью getrf!
. ipiv
— это информация о пивотах, а A
содержит LU
факторизацию из getrf!
. A
перезаписывается своей обратной матрицей.
LinearAlgebra.LAPACK.gesvx!
— Functiongesvx!(fact, trans, A, AF, ipiv, equed, R, C, B) -> (X, equed, R, C, B, rcond, ferr, berr, work)
Решает линейное уравнение A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
) или adjoint(A) * X = B
(trans = C
) с использованием LU
факторизации A
. fact
может быть E
, в этом случае A
будет уравновешен и скопирован в AF
; F
, в этом случае AF
и ipiv
из предыдущей LU
факторизации являются входными данными; или N
, в этом случае A
будет скопирован в AF
, а затем факторизован. Если fact = F
, equed
может быть N
, что означает, что A
не был уравновешен; R
, что означает, что A
был умножен на Diagonal(R)
слева; C
, что означает, что A
был умножен на Diagonal(C)
справа; или B
, что означает, что A
был умножен на Diagonal(R)
слева и Diagonal(C)
справа. Если fact = F
и equed = R
или B
, элементы R
должны быть все положительными. Если fact = F
и equed = C
или B
, элементы C
должны быть все положительными.
Возвращает решение X
; equed
, который является выходным, если fact
не равен N
, и описывает уравновешивание, которое было выполнено; R
, диагональ уравновешивания по строкам; C
, диагональ уравновешивания по столбцам; B
, который может быть перезаписан своей уравновешенной формой Diagonal(R)*B
(если trans = N
и equed = R,B
) или Diagonal(C)*B
(если trans = T,C
и equed = C,B
); rcond
, обратное условное число A
после уравновешивания; ferr
, граница ошибки вперед для каждого векторного решения в X
; berr
, граница ошибки вперед для каждого векторного решения в X
; и work
, обратный фактор роста пивота.
gesvx!(A, B)
Упрощение gesvx!
без эквивалентности и без транспонирования.
LinearAlgebra.LAPACK.gelsd!
— Functiongelsd!(A, B, rcond) -> (B, rnk)
Вычисляет решение с наименьшей нормой уравнения A * X = B
, находя факторизацию SVD
матрицы A
, а затем решая задачу методом деления и завоевания. B
перезаписывается решением X
. Сингулярные значения ниже rcond
будут рассматриваться как ноль. Возвращает решение в B
и эффективный ранг A
в rnk
.
LinearAlgebra.LAPACK.gelsy!
— Functiongelsy!(A, B, rcond) -> (B, rnk)
Вычисляет решение с наименьшей нормой уравнения A * X = B
, находя полную QR
факторизацию A
, а затем решая задачу методом деления и завоевания. B
перезаписывается решением X
. Сингулярные значения ниже rcond
будут рассматриваться как ноль. Возвращает решение в B
и эффективный ранг A
в rnk
.
LinearAlgebra.LAPACK.gglse!
— Functiongglse!(A, c, B, d) -> (X,res)
Решает уравнение A * x = c
, где x
подчиняется равенству B * x = d
. Использует формулу ||c - A*x||^2 = 0
для решения. Возвращает X
и сумму квадратов остатков.
LinearAlgebra.LAPACK.geev!
— Functiongeev!(jobvl, jobvr, A) -> (W, VL, VR)
Находит собственную систему матрицы A
. Если jobvl = N
, левые собственные векторы матрицы A
не вычисляются. Если jobvr = N
, правые собственные векторы матрицы A
не вычисляются. Если jobvl = V
или jobvr = V
, соответствующие собственные векторы вычисляются. Возвращает собственные значения в W
, правые собственные векторы в VR
и левые собственные векторы в VL
.
LinearAlgebra.LAPACK.gesdd!
— Functiongesdd!(job, A) -> (U, S, VT)
Находит сингулярное разложение A
, A = U * S * V'
, с использованием подхода "разделяй и властвуй". Если job = A
, вычисляются все столбцы U
и строки V'
. Если job = N
, не вычисляются ни столбцы U
, ни строки V'
. Если job = O
, A
перезаписывается столбцами (тонкого) U
и строками (тонкого) V'
. Если job = S
, вычисляются и возвращаются отдельно столбцы (тонкого) U
и строки (тонкого) V'
.
LinearAlgebra.LAPACK.gesvd!
— Functiongesvd!(jobu, jobvt, A) -> (U, S, VT)
Находит сингулярное разложение A
, A = U * S * V'
. Если jobu = A
, вычисляются все столбцы U
. Если jobvt = A
, вычисляются все строки V'
. Если jobu = N
, не вычисляются столбцы U
. Если jobvt = N
, не вычисляются строки V'
. Если jobu = O
, A
перезаписывается столбцами (тонкого) U
. Если jobvt = O
, A
перезаписывается строками (тонкого) V'
. Если jobu = S
, вычисляются и возвращаются отдельно столбцы (тонкого) U
. Если jobvt = S
, вычисляются и возвращаются отдельно строки (тонкого) V'
. jobu
и jobvt
не могут оба быть O
.
Возвращает U
, S
и Vt
, где S
— это сингулярные значения A
.
LinearAlgebra.LAPACK.ggsvd!
— Functionggsvd!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
Находит обобщенное сингулярное разложение A
и B
, U'*A*Q = D1*R
и V'*B*Q = D2*R
. D1
имеет alpha
на своей диагонали, а D2
имеет beta
на своей диагонали. Если jobu = U
, вычисляется ортогональная/унитарная матрица U
. Если jobv = V
, вычисляется ортогональная/унитарная матрица V
. Если jobq = Q
, вычисляется ортогональная/унитарная матрица Q
. Если jobu
, jobv
или jobq
равны N
, то эта матрица не вычисляется. Эта функция доступна только в версиях LAPACK до 3.6.0.
LinearAlgebra.LAPACK.ggsvd3!
— Functionggsvd3!(jobu, jobv, jobq, A, B) -> (U, V, Q, alpha, beta, k, l, R)
Находит обобщенное сингулярное разложение A
и B
, U'*A*Q = D1*R
и V'*B*Q = D2*R
. D1
имеет alpha
на своей диагонали, а D2
имеет beta
на своей диагонали. Если jobu = U
, вычисляется ортогональная/унитарная матрица U
. Если jobv = V
, вычисляется ортогональная/унитарная матрица V
. Если jobq = Q
, вычисляется ортогональная/унитарная матрица Q
. Если jobu
, jobv
или jobq
равны N
, эта матрица не вычисляется. Эта функция требует LAPACK 3.6.0.
LinearAlgebra.LAPACK.geevx!
— Functiongeevx!(balanc, jobvl, jobvr, sense, A) -> (A, w, VL, VR, ilo, ihi, scale, abnrm, rconde, rcondv)
Находит собственную систему матрицы A
с балансировкой матрицы. Если jobvl = N
, левые собственные векторы A
не вычисляются. Если jobvr = N
, правые собственные векторы A
не вычисляются. Если jobvl = V
или jobvr = V
, соответствующие собственные векторы вычисляются. Если balanc = N
, балансировка не выполняется. Если balanc = P
, A
переставляется, но не масштабируется. Если balanc = S
, A
масштабируется, но не переставляется. Если balanc = B
, A
переставляется и масштабируется. Если sense = N
, обратные числа условий не вычисляются. Если sense = E
, обратные числа условий вычисляются только для собственных значений. Если sense = V
, обратные числа условий вычисляются только для правых собственных векторов. Если sense = B
, обратные числа условий вычисляются для правых собственных векторов и собственных векторов. Если sense = E,B
, правые и левые собственные векторы должны быть вычислены.
LinearAlgebra.LAPACK.ggev!
— Functionggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
Находит обобщенное собственное разложение матриц A
и B
. Если jobvl = N
, левые собственные векторы не вычисляются. Если jobvr = N
, правые собственные векторы не вычисляются. Если jobvl = V
или jobvr = V
, соответствующие собственные векторы вычисляются.
LinearAlgebra.LAPACK.ggev3!
— Functionggev3!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
Находит обобщенное собственное разложение A
и B
с использованием блочной алгоритма. Если jobvl = N
, левые собственные векторы не вычисляются. Если jobvr = N
, правые собственные векторы не вычисляются. Если jobvl = V
или jobvr = V
, соответствующие собственные векторы вычисляются. Эта функция требует LAPACK 3.6.0.
LinearAlgebra.LAPACK.gtsv!
— Functiongtsv!(dl, d, du, B)
Решает уравнение A * X = B
, где A
— это тридиагональная матрица с dl
на поддиагонали, d
на диагонали и du
на наддиагонали.
Перезаписывает B
решением X
и возвращает его.
LinearAlgebra.LAPACK.gttrf!
— Functiongttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)
Находит LU
факторизацию тридиагональной матрицы с dl
на поддиагонали, d
на диагонали и du
на наддиагонали.
Модифицирует dl
, d
и du
на месте и возвращает их, а также вторую наддиагональ du2
и вектор перестановок ipiv
.
LinearAlgebra.LAPACK.gttrs!
— Functiongttrs!(trans, dl, d, du, du2, ipiv, B)
Решает уравнение A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
) или adjoint(A) * X = B
(trans = C
) с использованием LU
факторизации, вычисленной с помощью gttrf!
. B
перезаписывается решением X
.
LinearAlgebra.LAPACK.orglq!
— Functionorglq!(A, tau, k = length(tau))
Явно находит матрицу Q
разложения LQ
после вызова gelqf!
на A
. Использует вывод gelqf!
. A
перезаписывается Q
.
LinearAlgebra.LAPACK.orgqr!
— Functionorgqr!(A, tau, k = length(tau))
Явно находит матрицу Q
разложения QR
после вызова geqrf!
на A
. Использует вывод geqrf!
. A
перезаписывается Q
.
LinearAlgebra.LAPACK.orgql!
— Functionorgql!(A, tau, k = length(tau))
Явно находит матрицу Q
разложения QL
после вызова geqlf!
на A
. Использует вывод geqlf!
. A
перезаписывается на Q
.
LinearAlgebra.LAPACK.orgrq!
— Functionorgrq!(A, tau, k = length(tau))
Явно находит матрицу Q
разложения RQ
после вызова gerqf!
на A
. Использует вывод gerqf!
. A
перезаписывается на Q
.
LinearAlgebra.LAPACK.ormlq!
— Functionormlq!(side, trans, A, tau, C)
Вычисляет Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) для side = L
или эквивалентное умножение справа для side = R
, используя Q
из LQ
факторизации A
, вычисленной с помощью gelqf!
. C
перезаписывается.
LinearAlgebra.LAPACK.ormqr!
— Functionormqr!(side, trans, A, tau, C)
Вычисляет Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) для side = L
или эквивалентное умножение справа для side = R
, используя Q
из QR
факторизации A
, вычисленной с помощью geqrf!
. C
перезаписывается.
LinearAlgebra.LAPACK.ormql!
— Functionormql!(side, trans, A, tau, C)
Вычисляет Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) для side = L
или эквивалентное умножение справа для side = R
, используя Q
из QL
факторизации A
, вычисленной с помощью geqlf!
. C
перезаписывается.
LinearAlgebra.LAPACK.ormrq!
— Functionormrq!(side, trans, A, tau, C)
Вычисляет Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) для side = L
или эквивалентное умножение справа для side = R
, используя Q
из RQ
факторизации A
, вычисленной с помощью gerqf!
. C
перезаписывается.
LinearAlgebra.LAPACK.gemqrt!
— Functiongemqrt!(side, trans, V, T, C)
Вычисляет Q * C
(trans = N
), transpose(Q) * C
(trans = T
), adjoint(Q) * C
(trans = C
) для side = L
или эквивалентное умножение справа для side = R
, используя Q
из QR
разложения A
, вычисленного с помощью geqrt!
. C
перезаписывается.
LinearAlgebra.LAPACK.posv!
— Functionposv!(uplo, A, B) -> (A, B)
Находит решение уравнения A * X = B
, где A
является симметричной или эрмитовой положительно определенной матрицей. Если uplo = U
, вычисляется верхняя разложение Холецкого матрицы A
. Если uplo = L
, вычисляется нижняя разложение Холецкого матрицы A
. A
перезаписывается своим разложением Холецкого. B
перезаписывается решением X
.
LinearAlgebra.LAPACK.potrf!
— Functionpotrf!(uplo, A)
Вычисляет разложение Холецкого (верхнее, если uplo = U
, нижнее, если uplo = L
) положительно определенной матрицы A
. A
перезаписывается и возвращается с кодом информации.
LinearAlgebra.LAPACK.potri!
— Functionpotri!(uplo, A)
Вычисляет обратную матрицу положительно определенной матрицы A
после вызова potrf!
для нахождения ее (верхней, если uplo = U
, нижней, если uplo = L
) разложения Холецкого.
A
перезаписывается своей обратной матрицей и возвращается.
LinearAlgebra.LAPACK.potrs!
— Functionpotrs!(uplo, A, B)
Находит решение уравнения A * X = B
, где A
является симметричной или эрмитовой положительно определенной матрицей, для которой разложение Холецкого было вычислено с помощью potrf!
. Если uplo = U
, то было вычислено верхнее разложение Холецкого матрицы A
. Если uplo = L
, то было вычислено нижнее разложение Холецкого матрицы A
. B
перезаписывается решением X
.
LinearAlgebra.LAPACK.pstrf!
— Functionpstrf!(uplo, A, tol) -> (A, piv, rank, info)
Вычисляет (верхнюю, если uplo = U
, нижнюю, если uplo = L
) разложение Холецкого с пивотированием положительно определенной матрицы A
с заданной пользователем точностью tol
. A
перезаписывается своим разложением Холецкого.
Возвращает A
, пивоты piv
, ранг A
и код info
. Если info = 0
, факторизация прошла успешно. Если info = i > 0
, то A
является неопределенной или имеет недостаточный ранг.
LinearAlgebra.LAPACK.ptsv!
— Functionptsv!(D, E, B)
Решает уравнение A * X = B
для положительно определенной тридиагональной матрицы A
. D
— это диагональ A
, а E
— это вне диагонали. B
перезаписывается решением X
и возвращается.
LinearAlgebra.LAPACK.pttrf!
— Functionpttrf!(D, E)
Вычисляет факторизацию LDLt положительно определенной тридиагональной матрицы с D
в качестве диагонали и E
в качестве вне диагонали. D
и E
перезаписываются и возвращаются.
LinearAlgebra.LAPACK.pttrs!
— Functionpttrs!(D, E, B)
Решает уравнение A * X = B
для положительно определенной тридиагональной матрицы A
с диагональю D
и вне диагональными элементами E
после вычисления LDLt факторизации A
с использованием pttrf!
. B
перезаписывается решением X
.
LinearAlgebra.LAPACK.trtri!
— Functiontrtri!(uplo, diag, A)
Находит обратную матрицу (верхнюю, если uplo = U
, нижнюю, если uplo = L
) треугольной матрицы A
. Если diag = N
, у A
есть ненормированные диагональные элементы. Если diag = U
, все диагональные элементы A
равны единице. A
перезаписывается своим обратным значением.
LinearAlgebra.LAPACK.trtrs!
— Functiontrtrs!(uplo, trans, diag, A, B)
Решает A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
) или adjoint(A) * X = B
(trans = C
) для (верхней, если uplo = U
, нижней, если uplo = L
) треугольной матрицы A
. Если diag = N
, у A
есть ненормированные диагональные элементы. Если diag = U
, все диагональные элементы A
равны единице. B
перезаписывается решением X
.
LinearAlgebra.LAPACK.trcon!
— Functiontrcon!(norm, uplo, diag, A)
Находит обратное число обусловленности (верхнее, если uplo = U
, нижнее, если uplo = L
) треугольной матрицы A
. Если diag = N
, у A
есть ненормированные диагональные элементы. Если diag = U
, все диагональные элементы A
равны единице. Если norm = I
, число обусловленности находится в бесконечной норме. Если norm = O
или 1
, число обусловленности находится в одной норме.
LinearAlgebra.LAPACK.trevc!
— Functiontrevc!(side, howmny, select, T, VL = similar(T), VR = similar(T))
Находит собственную систему верхней треугольной матрицы T
. Если side = R
, вычисляются правые собственные векторы. Если side = L
, вычисляются левые собственные векторы. Если side = B
, вычисляются оба набора. Если howmny = A
, находятся все собственные векторы. Если howmny = B
, находятся все собственные векторы и выполняется обратное преобразование с использованием VL
и VR
. Если howmny = S
, вычисляются только собственные векторы, соответствующие значениям в select
.
LinearAlgebra.LAPACK.trrfs!
— Functiontrrfs!(uplo, trans, diag, A, B, X, Ferr, Berr) -> (Ferr, Berr)
Оценивает ошибку в решении уравнения A * X = B
(trans = N
), transpose(A) * X = B
(trans = T
), adjoint(A) * X = B
(trans = C
) для side = L
, или эквивалентные уравнения с правой стороны side = R
X * A
после вычисления X
с помощью trtrs!
. Если uplo = U
, A
является верхней треугольной матрицей. Если uplo = L
, A
является нижней треугольной матрицей. Если diag = N
, A
имеет ненормированные диагональные элементы. Если diag = U
, все диагональные элементы A
равны единице. Ferr
и Berr
являются необязательными входными параметрами. Ferr
— это ошибка прямого хода, а Berr
— ошибка обратного хода, каждая по компонентам.
LinearAlgebra.LAPACK.stev!
— Functionstev!(job, dv, ev) -> (dv, Zmat)
Вычисляет собственную систему для симметричной тридиагональной матрицы с dv
в качестве диагонали и ev
в качестве вне диагонали. Если job = N
, то находят только собственные значения и возвращают их в dv
. Если job = V
, то также находят собственные векторы и возвращают их в Zmat
.
LinearAlgebra.LAPACK.stebz!
— Functionstebz!(range, order, vl, vu, il, iu, abstol, dv, ev) -> (dv, iblock, isplit)
Вычисляет собственные значения для симметричной тридиагональной матрицы с dv
в качестве диагонали и ev
в качестве вне диагонали. Если range = A
, находятся все собственные значения. Если range = V
, находятся собственные значения в полузакрытом интервале (vl, vu]
. Если range = I
, находятся собственные значения с индексами между il
и iu
. Если order = B
, собственные значения упорядочиваются внутри блока. Если order = E
, они упорядочиваются по всем блокам. abstol
может быть установлен как допустимая погрешность для сходимости.
LinearAlgebra.LAPACK.stegr!
— Functionstegr!(jobz, range, dv, ev, vl, vu, il, iu) -> (w, Z)
Вычисляет собственные значения (jobz = N
) или собственные значения и собственные векторы (jobz = V
) для симметричной тридиагональной матрицы с dv
в качестве диагонали и ev
в качестве вне диагонали. Если range = A
, находятся все собственные значения. Если range = V
, находятся собственные значения в полузакрытом интервале (vl, vu]
. Если range = I
, находятся собственные значения с индексами между il
и iu
. Собственные значения возвращаются в w
, а собственные векторы в Z
.
LinearAlgebra.LAPACK.stein!
— Functionstein!(dv, ev_in, w_in, iblock_in, isplit_in)
Вычисляет собственные векторы для симметричной тридиагональной матрицы с dv
в качестве диагонали и ev_in
в качестве внедиагональных элементов. w_in
указывает входные собственные значения, для которых необходимо найти соответствующие собственные векторы. iblock_in
указывает подматрицы, соответствующие собственным значениям в w_in
. isplit_in
указывает точки разбиения между блоками подматриц.
LinearAlgebra.LAPACK.syconv!
— Functionsyconv!(uplo, A, ipiv) -> (A, work)
Преобразует симметричную матрицу A
(которая была факторизована в треугольную матрицу) в две матрицы L
и D
. Если uplo = U
, A
является верхней треугольной. Если uplo = L
, она является нижней треугольной. ipiv
— это вектор пивотов из треугольной факторизации. A
перезаписывается L
и D
.
LinearAlgebra.LAPACK.sysv!
— Functionsysv!(uplo, A, B) -> (B, A, ipiv)
Находит решение уравнения A * X = B
для симметричной матрицы A
. Если uplo = U
, то верхняя половина A
хранится. Если uplo = L
, то хранится нижняя половина. B
перезаписывается решением X
. A
перезаписывается его факторизацией Банч-Кауфмана. ipiv
содержит информацию о перестановках для факторизации.
LinearAlgebra.LAPACK.sytrf!
— Functionsytrf!(uplo, A) -> (A, ipiv, info)
Вычисляет факторизацию Банч-Кауфмана симметричной матрицы A
. Если uplo = U
, верхняя половина A
хранится. Если uplo = L
, хранится нижняя половина.
Возвращает A
, перезаписанную факторизацией, вектор перестановок ipiv
и код ошибки info
, который является неотрицательным целым числом. Если info
положительно, матрица сингулярна, и диагональная часть факторизации точно равна нулю в позиции info
.
sytrf!(uplo, A, ipiv) -> (A, ipiv, info)
Вычисляет факторизацию Банч-Кауфмана симметричной матрицы A
. Если uplo = U
, верхняя половина A
хранится. Если uplo = L
, хранится нижняя половина.
Возвращает A
, перезаписанную факторизацией, вектор перестановок ipiv
и код ошибки info
, который является неотрицательным целым числом. Если info
положительно, матрица сингулярна, и диагональная часть факторизации точно равна нулю в позиции info
.
LinearAlgebra.LAPACK.sytri!
— Functionsytri!(uplo, A, ipiv)
Вычисляет обратную матрицу симметричной матрицы A
, используя результаты sytrf!
. Если uplo = U
, верхняя половина A
хранится. Если uplo = L
, хранится нижняя половина. A
перезаписывается своей обратной.
LinearAlgebra.LAPACK.sytrs!
— Functionsytrs!(uplo, A, ipiv, B)
Решает уравнение A * X = B
для симметричной матрицы A
, используя результаты sytrf!
. Если uplo = U
, то верхняя половина A
хранится. Если uplo = L
, то хранится нижняя половина. B
перезаписывается решением X
.
LinearAlgebra.LAPACK.hesv!
— Functionhesv!(uplo, A, B) -> (B, A, ipiv)
Находит решение уравнения A * X = B
для эрмитовой матрицы A
. Если uplo = U
, то хранится верхняя половина A
. Если uplo = L
, то хранится нижняя половина. B
перезаписывается решением X
. A
перезаписывается его факторизацией Банч-Кауфмана. ipiv
содержит информацию о перестановках для факторизации.
LinearAlgebra.LAPACK.hetrf!
— Functionhetrf!(uplo, A) -> (A, ipiv, info)
Вычисляет факторизацию Банч-Кауфмана для эрмитовой матрицы A
. Если uplo = U
, то верхняя половина A
хранится. Если uplo = L
, то хранится нижняя половина.
Возвращает A
, перезаписанную факторизацией, вектор перестановок ipiv
и код ошибки info
, который является неотрицательным целым числом. Если info
положительно, матрица сингулярна, и диагональная часть факторизации точно равна нулю в позиции info
.
hetrf!(uplo, A, ipiv) -> (A, ipiv, info)
Вычисляет факторизацию Банч-Кауфмана для эрмитовой матрицы A
. Если uplo = U
, то верхняя половина A
хранится. Если uplo = L
, то хранится нижняя половина.
Возвращает A
, перезаписанную факторизацией, вектор перестановок ipiv
и код ошибки info
, который является неотрицательным целым числом. Если info
положительно, матрица сингулярна, и диагональная часть факторизации точно равна нулю в позиции info
.
LinearAlgebra.LAPACK.hetri!
— Functionhetri!(uplo, A, ipiv)
Вычисляет обратную матрицу для эрмитовой матрицы A
, используя результаты sytrf!
. Если uplo = U
, то хранится верхняя половина A
. Если uplo = L
, то хранится нижняя половина. A
перезаписывается своей обратной матрицей.
LinearAlgebra.LAPACK.hetrs!
— Functionhetrs!(uplo, A, ipiv, B)
Решает уравнение A * X = B
для эрмитовой матрицы A
, используя результаты sytrf!
. Если uplo = U
, то хранится верхняя половина A
. Если uplo = L
, то хранится нижняя половина. B
перезаписывается решением X
.
LinearAlgebra.LAPACK.syev!
— Functionsyev!(jobz, uplo, A)
Находит собственные значения (jobz = N
) или собственные значения и собственные векторы (jobz = V
) симметричной матрицы A
. Если uplo = U
, используется верхний треугольник A
. Если uplo = L
, используется нижний треугольник A
.
LinearAlgebra.LAPACK.syevr!
— Functionsyevr!(jobz, range, uplo, A, vl, vu, il, iu, abstol) -> (W, Z)
Находит собственные значения (jobz = N
) или собственные значения и собственные векторы (jobz = V
) симметричной матрицы A
. Если uplo = U
, используется верхний треугольник A
. Если uplo = L
, используется нижний треугольник A
. Если range = A
, находятся все собственные значения. Если range = V
, находятся собственные значения в полузакрытом интервале (vl, vu]
. Если range = I
, находятся собственные значения с индексами между il
и iu
. abstol
может быть установлен как допустимая погрешность для сходимости.
Собственные значения возвращаются в W
, а собственные векторы в Z
.
LinearAlgebra.LAPACK.syevd!
— Functionsyevd!(jobz, uplo, A)
Находит собственные значения (jobz = N
) или собственные значения и собственные векторы (jobz = V
) симметричной матрицы A
. Если uplo = U
, используется верхний треугольник A
. Если uplo = L
, используется нижний треугольник A
.
Использует метод деления и завоевания, вместо итерации QR, используемой syev!
, или нескольких относительно устойчивых представлений, используемых syevr!
. См. James W. Demmel и др., SIAM J. Sci. Comput. 30, 3, 1508 (2008) для сравнения точности и производительности различных методов.
LinearAlgebra.LAPACK.sygvd!
— Functionsygvd!(itype, jobz, uplo, A, B) -> (w, A, B)
Находит обобщенные собственные значения (jobz = N
) или собственные значения и собственные векторы (jobz = V
) симметричной матрицы A
и симметричной положительно определенной матрицы B
. Если uplo = U
, используются верхние треугольники A
и B
. Если uplo = L
, используются нижние треугольники A
и B
. Если itype = 1
, задача, которую нужно решить, выглядит как A * x = lambda * B * x
. Если itype = 2
, задача, которую нужно решить, выглядит как A * B * x = lambda * x
. Если itype = 3
, задача, которую нужно решить, выглядит как B * A * x = lambda * x
.
LinearAlgebra.LAPACK.bdsqr!
— Functionbdsqr!(uplo, d, e_, Vt, U, C) -> (d, Vt, U, C)
Вычисляет сингулярное разложение бидиагональной матрицы с d
на диагонали и e_
на вне диагонали. Если uplo = U
, e_
является супердиагональю. Если uplo = L
, e_
является поддиагональю. Также можно опционально вычислить произведение Q' * C
.
Возвращает сингулярные значения в d
, а матрица C
перезаписывается как Q' * C
.
LinearAlgebra.LAPACK.bdsdc!
— Functionbdsdc!(uplo, compq, d, e_) -> (d, e, u, vt, q, iq)
Вычисляет сингулярное разложение бидиагональной матрицы с d
на диагонали и e_
на вне диагонали, используя метод деления и завоевания. Если uplo = U
, e_
является супердиагональю. Если uplo = L
, e_
является поддиагональю. Если compq = N
, находятся только сингулярные значения. Если compq = I
, находятся сингулярные значения и векторы. Если compq = P
, сингулярные значения и векторы находятся в компактной форме. Работает только для вещественных типов.
Возвращает сингулярные значения в d
, а если compq = P
, компактные сингулярные векторы в iq
.
LinearAlgebra.LAPACK.gecon!
— Functiongecon!(normtype, A, anorm)
Находит обратное число обусловленности матрицы A
. Если normtype = I
, число обусловленности находится в бесконечной норме. Если normtype = O
или 1
, число обусловленности находится в одной норме. A
должно быть результатом getrf!
, а anorm
— это норма A
в соответствующей норме.
LinearAlgebra.LAPACK.gehrd!
— Functiongehrd!(ilo, ihi, A) -> (A, tau)
Преобразует матрицу A
в форму Хессенберга. Если A
сбалансирована с помощью gebal!
, то ilo
и ihi
являются выходными данными gebal!
. В противном случае они должны быть ilo = 1
и ihi = size(A,2)
. tau
содержит элементарные отражатели факторизации.
LinearAlgebra.LAPACK.orghr!
— Functionorghr!(ilo, ihi, A, tau)
Явно находит Q
, ортогональную/унитарную матрицу из gehrd!
. ilo
, ihi
, A
и tau
должны соответствовать входным/выходным данным для gehrd!
.
LinearAlgebra.LAPACK.gees!
— Functiongees!(jobvs, A) -> (A, vs, w)
Вычисляет собственные значения (jobvs = N
) или собственные значения и векторы Шура (jobvs = V
) матрицы A
. A
перезаписывается в своей форме Шура.
Возвращает A
, vs
, содержащий векторы Шура, и w
, содержащий собственные значения.
LinearAlgebra.LAPACK.gges!
— Functiongges!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
Вычисляет обобщенные собственные значения, обобщенную форму Шура, левые векторы Шура (jobsvl = V
) или правые векторы Шура (jobvsr = V
) для A
и B
.
Обобщенные собственные значения возвращаются в alpha
и beta
. Левые векторы Шура возвращаются в vsl
, а правые векторы Шура возвращаются в vsr
.
LinearAlgebra.LAPACK.gges3!
— Functiongges3!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
Вычисляет обобщенные собственные значения, обобщенную форму Шура, левые векторы Шура (jobsvl = V
) или правые векторы Шура (jobvsr = V
) для A
и B
, используя блочный алгоритм. Эта функция требует LAPACK 3.6.0.
Обобщенные собственные значения возвращаются в alpha
и beta
. Левые векторы Шура возвращаются в vsl
, а правые векторы Шура возвращаются в vsr
.
LinearAlgebra.LAPACK.trexc!
— Functiontrexc!(compq, ifst, ilst, T, Q) -> (T, Q)
trexc!(ifst, ilst, T, Q) -> (T, Q)
Переставляет факторизацию Шура T
матрицы так, чтобы диагональный блок T
с индексом строки ifst
был перемещен на индекс строки ilst
. Если compq = V
, векторы Шура Q
переставляются. Если compq = N
, они не изменяются. Метод с 4 аргументами вызывает метод с 5 аргументами с compq = V
.
LinearAlgebra.LAPACK.trsen!
— Functiontrsen!(job, compq, select, T, Q) -> (T, Q, w, s, sep)
trsen!(select, T, Q) -> (T, Q, w, s, sep)
Переставляет факторизацию Шура матрицы и при необходимости находит обратные числа условий. Если job = N
, числа условий не находятся. Если job = E
, находится только число условий для этого кластера собственных значений. Если job = V
, находится только число условий для инвариантного подпространства. Если job = B
, то находятся числа условий для кластера и подпространства. Если compq = V
, векторы Шура Q
обновляются. Если compq = N
, векторы Шура не изменяются. select
определяет, какие собственные значения находятся в кластере. Метод с 3 аргументами вызывает метод с 5 аргументами с job = N
и compq = V
.
Возвращает T
, Q
, переставленные собственные значения в w
, число условий кластера собственных значений s
и число условий инвариантного подпространства sep
.
LinearAlgebra.LAPACK.tgsen!
— Functiontgsen!(select, S, T, Q, Z) -> (S, T, alpha, beta, Q, Z)
Переставляет векторы обобщенного разложения Шура. select
указывает собственные значения в каждом кластере.
LinearAlgebra.LAPACK.trsyl!
— Functiontrsyl!(transa, transb, A, B, C, isgn=1) -> (C, scale)
Решает матричное уравнение Сильвестра A * X +/- X * B = scale*C
, где A
и B
оба являются квази-верхне-треугольными. Если transa = N
, A
не изменяется. Если transa = T
, A
транспонируется. Если transa = C
, A
конъюгированно транспонируется. Аналогично для transb
и B
. Если isgn = 1
, решается уравнение A * X + X * B = scale * C
. Если isgn = -1
, решается уравнение A * X - X * B = scale * C
.
Возвращает X
(перезаписывая C
) и scale
.
LinearAlgebra.LAPACK.hseqr!
— Functionhseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)
Вычисляет все собственные значения и (по желанию) факторизацию Шура матрицы, приведенной к форме Хессенберга. Если H
сбалансирована с помощью gebal!
, то ilo
и ihi
являются выходными значениями gebal!
. В противном случае они должны быть ilo = 1
и ihi = size(H,2)
. tau
содержит элементарные отражатели факторизации.
- ACM832Дэвис, Тимоти А. (2004b). Алгоритм 832: UMFPACK V4.3–-метод многогранного разложения с нессиметричной структурой. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
- ACM887Chen, Y., Davis, T. A., Hager, W. W., & Rajamanickam, S. (2008). Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate. ACM Trans. Math. Softw., 35(3). doi:10.1145/1391989.1391995
- DavisHager2009Davis, Timothy A., & Hager, W. W. (2009). Dynamic Supernodes in Sparse Cholesky Update/Downdate and Triangular Solves. ACM Trans. Math. Softw., 35(4). doi:10.1145/1462173.1462176
- Bischof1987C Bischof и C Van Loan, "Представление WY для произведений матриц Хаусхолдера", SIAM J Sci Stat Comput 8 (1987), s2-s13. doi:10.1137/0908009
- Schreiber1989R Schreiber и C Van Loan, "Эффективное по памяти представление WY для произведений преобразований Хаусхолдера", SIAM J Sci Stat Comput 10 (1989), 53-57. doi:10.1137/0910005
- ACM933Foster, L. V., & Davis, T. A. (2013). Algorithm 933: Reliable Calculation of Numerical Rank, Null Space Bases, Pseudoinverse Solutions, and Basic Solutions Using SuitesparseQR. ACM Trans. Math. Softw., 40(1). doi:10.1145/2513109.2513116
- Bunch1977J R Bunch и L Kaufman, Некоторые стабильные методы для вычисления инерции и решения симметричных линейных систем, 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 and 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 и Nicholas J. Higham, "Улучшенные алгоритмы обратного масштабирования и квадратирования для матричного логарифма", SIAM Journal on Scientific Computing, 34(4), 2012, C153-C169. doi:10.1137/110852553
- AHR13Awad H. Al-Mohy, Nicholas J. Higham и Samuel D. Relton, "Вычисление производной Фреше матричного логарифма и оценка числа обусловленности", SIAM Journal on Scientific Computing, 35(4), 2013, C394-C410. doi:10.1137/120885991
- BH83Åke Björck и Sven Hammarling, "Метод Шура для квадратного корня матрицы", Линейная алгебра и её приложения, 52-53, 1983, 127-140. doi:10.1016/0024-3795(83)80010-X
- H87Nicholas J. Higham, "Вычисление действительных квадратных корней действительной матрицы", Линейная алгебра и её приложения, 88-89, 1987, 405-430. doi:10.1016/0024-3795(87)90118-2
- S03Мэтью I. Смит, "Алгоритм Шура для вычисления p-х корней матрицы", SIAM Journal on Matrix Analysis and Applications, том 24, 2003, стр. 971–989. doi:10.1137/S0895479801392697
- AH16_1Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и гиперболические функции матрицы: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_2Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и гиперболические функции матрицы: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_3Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и обратные гиперболические функции матрицы: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_4Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и обратные гиперболические функции матриц: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_5Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и обратные гиперболические функции матриц: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_6Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и обратные гиперболические функции матриц: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577