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.0sB был помечен как матрица, которая является (действительно) симметричной, поэтому для последующих операций, которые мы можем выполнять с ней, таких как собственная факторизация или вычисление произведений матрица-вектор, можно найти эффективность, ссылаясь только на половину из нее. Например:
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 ilth through the ihth 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 1Base.:* — 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
trueBase.:/ — 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))
trueLinearAlgebra.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.0LinearAlgebra.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)
trueLinearAlgebra.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
0LinearAlgebra.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
12LinearAlgebra.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
18LinearAlgebra.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.0Diagonal(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 ⋅
⋅ 5Diagonal{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 4Bidiagonal(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 4LinearAlgebra.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 4SymTridiagonal(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 0Tridiagonal(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 4LinearAlgebra.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.0LinearAlgebra.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.0LinearAlgebra.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.0LinearAlgebra.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.0LinearAlgebra.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 16LinearAlgebra.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.0LinearAlgebra.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+0imLinearAlgebra.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.7LinearAlgebra.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
trueLinearAlgebra.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.0LinearAlgebra.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.0lu!(A, pivot = RowMaximum(); check = true, allowsingular = false) -> LUlu! такой же, как 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
trueLinearAlgebra.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
trueLinearAlgebra.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
truecholesky(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
truecholesky(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.90909LinearAlgebra.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.3488372093023255ldlt(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.90909ldlt!(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 <: FactorizationQR-разложение матрицы, хранящееся в упакованном формате, обычно получаемое из 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)для объектаQRF. - Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, где $v_i$ — это $i$-й столбец матрицы
V = I + tril(F.factors, -1).
- Верхняя треугольная часть содержит элементы $R$, то есть
τ— это вектор длиныmin(m,n), содержащий коэффициенты $au_i$.
LinearAlgebra.QRCompactWY — TypeQRCompactWY <: FactorizationQR-матричная факторизация, хранящаяся в компактном блочном формате, обычно получаемая из 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)для объектаQRF. - Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, так что
V = I + tril(F.factors, -1).
- Верхняя треугольная часть содержит элементы $R$, то есть
T— это матрица размером $n_b$ на $\min(m,n)$, как описано выше. Поддиагональные элементы для каждой треугольной матрицы $T_j$ игнорируются.
Этот формат не следует путать с более старым представлением WY [Bischof1987].
LinearAlgebra.QRPivoted — TypeQRPivoted <: FactorizationQR-разложение матрицы с перестановкой столбцов в упакованном формате, обычно получаемое из 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)для объектаQRF. - Поддиагональная часть содержит отражатели $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
2qr(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: ортогональная/унитарная матрицаQF.R: верхняя треугольная матрицаRF.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
trueqr возвращает несколько типов, потому что 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
trueLinearAlgebra.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
trueLinearAlgebra.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
1LinearAlgebra.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.0LinearAlgebra.bunchkaufman! — Functionbunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufmanbunchkaufman! то же самое, что и 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
trueLinearAlgebra.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
trueLinearAlgebra.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)
-2eigvals(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.0imeigvals(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.140054944640259eigvals(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.140054944640259LinearAlgebra.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.37228eigvals!(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.0eigvals!(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.5547001962252291eigvecs(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.0eigvecs(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.0imLinearAlgebra.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
trueeigen(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
trueeigen(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
trueLinearAlgebra.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
trueLinearAlgebra.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
trueschur(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.0schur!(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
trueLinearAlgebra.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.0LinearAlgebra.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
truesvd(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
trueLinearAlgebra.svd! — Functionsvd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVDsvd! такой же, как svd, но экономит место, перезаписывая входные данные A, вместо создания копии. См. документацию по svd для получения подробной информации.
svd!(A, B) -> ОбобщённоеSVDsvd! то же самое, что и 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.0svdvals(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.0LinearAlgebra.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.0triu(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.0LinearAlgebra.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 0LinearAlgebra.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.0tril(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.0LinearAlgebra.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 5LinearAlgebra.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
6LinearAlgebra.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 0diagm(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 3LinearAlgebra.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)
1LinearAlgebra.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)
truenorm(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.0LinearAlgebra.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.0opnorm(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.0LinearAlgebra.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)
NaNLinearAlgebra.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)
5LinearAlgebra.det — Functiondet(M)Определитель матрицы.
Смотрите также: logdet и logabsdet.
Примеры
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> det(M)
2.0LinearAlgebra.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.0LinearAlgebra.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)
trueLinearAlgebra.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.0LinearAlgebra.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 10Base.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.71828Base.cis — Methodcis(A::AbstractMatrix)Более эффективный метод для exp(im*A) квадратной матрицы A (особенно если A является Гермицианской или вещественной Симметричной).
Поддержка использования cis с матрицами была добавлена в Julia 1.7.
Примеры
julia> cis([π 0; 0 π]) ≈ -I
trueBase.:^ — Method^(A::AbstractMatrix, p::Number)Степень матрицы, эквивалентная $\exp(p\log(A))$
Примеры
julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
1 26
0 27Base.:^ — 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.0855Base.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.0Base.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.0sqrt(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.0Base.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
trueBase.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.291927Base.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.454649Base.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.291927Base.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.09252Base.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-16imBase.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-16imBase.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-17imBase.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
trueLinearAlgebra.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
trueLinearAlgebra.issuccess — Functionissuccess(F::Factorization)Проверьте, что факторизация матрицы удалась.
issuccess(::CholeskyPivoted) требует Julia 1.6 или новее.
Примеры
julia> F = cholesky([1 0; 0 1]);
julia> issuccess(F)
trueissuccess(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)
trueLinearAlgebra.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)
falseLinearAlgebra.isposdef — Functionisposdef(A) -> BoolПроверьте, является ли матрица положительно определенной (и эрмитовой), пытаясь выполнить разложение Холецкого для A.
Смотрите также isposdef!, cholesky.
Примеры
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> isposdef(A)
trueLinearAlgebra.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.78233LinearAlgebra.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)
trueLinearAlgebra.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)
trueLinearAlgebra.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)
falseLinearAlgebra.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)
trueBase.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+6imLinearAlgebra.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 0LinearAlgebra.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+6imLinearAlgebra.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+0imLinearAlgebra.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+0imLinearAlgebra.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)
2LinearAlgebra.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
5LinearAlgebra.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 * β
trueLinearAlgebra.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}:
NaNlmul!(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.0LinearAlgebra.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}:
NaNrmul!(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.0LinearAlgebra.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
trueldiv!(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
trueldiv!(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.0ldiv!(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.0BLAS 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.0LinearAlgebra.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.0imLinearAlgebra.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.0imLinearAlgebra.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.0LinearAlgebra.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.0LinearAlgebra.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