Линейная алгебра
Помимо (и как часть) поддержки многомерных массивов, 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 предоставляет множество разложений, которые можно использовать для ускорения задач, таких как решение линейных уравнений или возведение матрицы в степень, предварительно разложив матрицу в форму, более подходящую (по производительности или объему памяти) для задачи. Дополнительную информацию см. в документации по 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
Здесь Julia смогла определить, что B фактически является симметричной, и использовала более подходящее разложение. Часто можно написать более эффективный код для матрицы, о которой известно, что она обладает определенными свойствами, например, является симметричной или трехдиагональной. Julia предоставляет некоторые специальные типы, чтобы вы могли «помечать» матрицы как обладающие этими свойствами. Например:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
sB была помечена как матрица, которая (вещественная) симметричная, поэтому для последующих операций с ней, таких как собственное разложение или вычисление матрично-векторных произведений, можно повысить эффективность, ссылаясь только на половину матрицы. Например:
julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
1.5 2.0 -4.0
2.0 -1.0 -3.0
-4.0 -3.0 5.0
julia> x = [1; 2; 3]
3-element Vector{Int64}:
1
2
3
julia> sB\x
3-element Vector{Float64}:
-1.7391304347826084
-1.1086956521739126
-1.4565217391304346
Операция \ здесь выполняет линейное решение. Оператор левого деления довольно мощный, и с его помощью легко написать компактный, читаемый код, достаточно гибкий для решения различных систем линейных уравнений.
Специальные матрицы
Матрицы со специальными симметриями и структурами часто встречаются в линейной алгебре и часто связаны с различными разложениями матриц. Julia предлагает богатый набор специальных типов матриц, которые позволяют ускорить вычисления с помощью специализированных процедур, разработанных специально для определенных типов матриц.
В следующих таблицах обобщены типы специальных матриц, реализованных в Julia, а также наличие подключений к различным оптимизированным методам для них в LAPACK.
| Тип | Описание |
|---|---|
Symmetric |
Симметричная матрица |
Hermitian |
Эрмитова матрица |
UpperTriangular |
Верхняя треугольная матрица |
UnitUpperTriangular |
Верхняя треугольная матрица с единичной диагональю |
LowerTriangular |
Нижняя треугольная матрица |
UnitLowerTriangular |
Нижняя треугольная матрица с единичной диагональю |
UpperHessenberg |
Верхняя матрица Хессенберга |
Tridiagonal |
Трехдиагональная матрица |
SymTridiagonal |
Симметричная трехдиагональная матрица |
Bidiagonal |
Верхняя/нижняя бидиагональная матрица |
Diagonal |
Диагональная матрица |
UniformScaling |
Оператор равномерного масштабирования |
Элементарные операции
| Тип матрицы | + |
- |
* |
\ |
Другие функции с оптимизированными методами |
|---|---|---|---|---|---|
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 | / |
Легенда:
| Ключ | Описание |
|---|---|
| M (матрица) | Доступен оптимизированный метод для матрично-матричных операций |
| V (вектор) | Доступен оптимизированный метод для матрично-векторных операций |
| S (скаляр) | Доступен оптимизированный метод для матрично-скалярных операций |
Разложения матриц
| Тип матрицы | 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 |
Условные обозначения:
| Ключ | Описание | Пример |
|---|---|---|
| A (все) | Доступен оптимизированный метод для нахождения всех собственных значений и/или векторов. | например, eigvals(M)
|
| R (диапазон) | Доступен оптимизированный метод для нахождения собственных значений с il-го по ih-й. |
eigvals(M, il, ih) |
| I (интервал) | Доступен оптимизированный метод для нахождения собственных значений в интервале [vl, vh]. |
eigvals(M, vl, vh) |
| V (векторы) | Доступен оптимизированный метод для нахождения собственных векторов, соответствующих собственным значениям x=[x1, x2,...]. |
eigvecs(M, x) |
Оператор равномерного масштабирования
Оператор 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) и связанных операций, таких как вычисление определителя.
Разложения матриц
Разложение матриц (также разложение матрицы) вычисляют разложение матрицы на произведение матриц и являются одним из центральных понятий в (численных) линейной алгебре.
В следующей таблице подытожены типы разложений матриц, реализованные в Julia. Подробное описание связанных методов можно найти в разделе «Стандартные функции» документации по линейной алгебре.
| Тип | Описание |
|---|---|
BunchKaufman |
Разложение Банча-Кауфмана |
Cholesky |
Разложение Холецкого |
CholeskyPivoted |
Разложение Холецкого с выбором опорных элементов |
LDLt |
Разложение LDL(T) |
LU |
Разложение LU |
QR |
Разложение QR |
QRCompactWY |
Компактная форма QR |
QRPivoted |
Разложение QR с выбором опорных элементов |
LQ |
Разложение QR матрицы transpose(A) |
Hessenberg |
Разложение Хессенберга |
Eigen |
Спектральное разложение |
GeneralizedEigen |
Обобщённое спектральное разложение |
SVD |
Разложение по сингулярным значениям |
GeneralizedSVD |
Обобщённое разложение по сингулярным значениям |
Schur |
Разложение Шур |
GeneralizedSchur |
Обобщённое разложение Шур |
Сопряжённые и транспонированные объекты Factorization лениво оборачиваются в объекты AdjointFactorization и TransposeFactorization соответственно. В общем случае транспонирование вещественных Factorization оборачивается как AdjointFactorization.
Ортогональные матрицы (AbstractQ)
Некоторые факторизации матриц генерируют ортогональные/унитарные «матричные» факторы. К этим факторизациям относятся факторизации, связанные с QR, полученные из вызовов qr, т.е., QR, QRCompactWY и QRPivoted, факторизация Хессенберга, полученная из вызовов hessenberg, и факторизация LQ, полученная из lq. Хотя эти ортогональные/унитарные факторы допускают матричное представление, их внутреннее представление по причинам производительности и памяти отличается. Следовательно, их следует рассматривать скорее как линейные операторы с матричной основой и основанными на функциях. В частности, для чтения, например, столбца его матричного представления требуется выполнить код умножения «матрица»-вектор, а не просто считать данные из памяти (возможно, заполнить части вектора структурными нулями). Другое явное различие с другими, нетреугольными типами матриц заключается в том, что код умножения в основе позволяет выполнять модификацию на месте во время умножения. Кроме того, объекты конкретных AbstractQ подтипов, как те, которые созданы с помощью qr, hessenberg и lq, могут вести себя как квадратные или прямоугольные матрицы в зависимости от контекста:
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) и индексация в матричное представление работают. Напротив, сложение и вычитание, а также более общее вещание по элементам в матричном представлении не работают, потому что это было бы очень неэффективно. В таких случаях рассмотрите возможность вычисления матричного представления заранее и кэширования его для повторного использования в будущем.
Стратегии выбора опорного элемента
Несколько факторизаций матриц Julia поддерживают выбор опорного элемента, который может использоваться для повышения их числовой устойчивости. Фактически, некоторые факторизации матриц, такие как факторизация LU, могут потерпеть неудачу без выбора опорного элемента.
При выборе опорного элемента сначала выбирается опорный элемент с хорошими числовыми свойствами, основанными на стратегии выбора опорного элемента. Затем строки и столбцы исходной матрицы переупорядочиваются, чтобы поместить выбранный элемент в нужное положение для последующих вычислений. Кроме того, процесс повторяется для каждой стадии факторизации.
Следовательно, помимо обычных матричных факторов, выходные данные факторизаций с выбором опорного элемента также включают матрицы перестановок.
В дальнейшем кратко описываются стратегии выбора опорного элемента, реализованные в Julia. Обратите внимание, что не все факторизации матриц могут их поддерживать. Для получения подробностей о поддерживаемых стратегиях выбора опорного элемента обратитесь к документации соответствующей факторизации матриц.
См. также LinearAlgebra.ZeroPivotException.
LinearAlgebra.NoPivotТип
NoPivot
Выбор опорного элемента не выполняется. Факторизации матриц, такие как факторизация LU, могут потерпеть неудачу без выбора опорного элемента и могут быть также числово неустойчивыми для матриц с плавающей запятой в условиях погрешности округления. Эта стратегия выбора опорного элемента в основном полезна в педагогических целях.
LinearAlgebra.RowNonZeroТип
RowNonZero
В качестве опорного элемента выбирается первый ненулевой элемент в оставшихся строках.
Обратите внимание, что для матриц с плавающей запятой полученный алгоритм LU является числово неустойчивым — эта стратегия в основном полезна для сравнения с ручными вычислениями (которые обычно используют эту стратегию) или для других алгебраических типов (например, рациональных чисел), не подверженных погрешностям округления. В противном случае, стратегия выбора опорного элемента по умолчанию RowMaximum должна быть предпочтительной при исключении Гаусса.
Обратите внимание, что тип элементов матрицы должен допускать метод iszero.
LinearAlgebra.RowMaximumТип
RowMaximum
В качестве опорного элемента выбирается элемент с максимальным модулем в оставшихся строках. Это стратегия по умолчанию для факторизации LU матриц с плавающей запятой и иногда называется алгоритмом «частичного выбора опорного элемента».
Обратите внимание, что тип элементов матрицы должен допускать метод abs, тип результата которого должен допускать метод <.
LinearAlgebra.ColumnNormТип
ColumnNorm
Для последующих вычислений используется столбец с максимальной нормой. Это используется для факторизации QR с выбором опорного элемента.
Обратите внимание, что тип элементов матрицы должен допускать методы norm и abs, типы результатов которых должны допускать метод <.
Стандартные функции
Функции линейной алгебры в Julia в значительной степени реализованы путем вызова функций из LAPACK. Факторизации разреженных матриц вызывают функции из SuiteSparse. Другие разреженные решатели доступны в качестве пакетов Julia.
Base.:*Метод
*(A::AbstractMatrix, B::AbstractMatrix)
Умножение матриц.
Примеры
julia> [1 1; 0 1] * [1 0; 1 1]
2×2 Matrix{Int64}:
2 1
1 1
Base.:*Метод
*(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.:\Метод
\(A, B)
Деление матриц с использованием полиалгоритма. Для входных матриц A и B, результат X такой, что A*X == B, когда A квадратная. Решатель, который используется, зависит от структуры A. Если A верхняя или нижняя треугольная (или диагональная), факторизация A не требуется, и система решается с помощью прямой или обратной подстановки. Для нетреугольных квадратных матриц используется факторизация LU.
Для прямоугольных A результат — решение наименьших квадратов с минимальной нормой, вычисленное с помощью факторизации QR с выбором опорного элемента A и оценкой ранга A, основанной на факторе R.
Когда A разреженная, используется аналогичный полиалгоритм. Для неопределённых матриц факторизация LDLt не использует выбор опорного элемента во время численных факторизаций, и поэтому процедура может потерпеть неудачу даже для обратимых матриц.
Примеры
julia> A = [1 0; 1 -2]; B = [32; -4];
julia> X = A \ B
2-element Vector{Float64}:
32.0
18.0
julia> A * X == B
true
Base.:/Метод
A / B
Деление матриц справа: A / B эквивалентно (B' \ A')', где \ — оператор левого деления. Для квадратных матриц результат X такой, что A == X*B.
См. также: rdiv!.
Примеры
julia> A = Float64[1 4 5; 3 9 2]; B = Float64[1 4 2; 3 4 2; 8 7 1];
julia> X = A / B
2×3 Matrix{Float64}:
-0.65 3.75 -1.2
3.25 -2.75 1.0
julia> isapprox(A, X*B)
true
julia> isapprox(X, A*pinv(B))
true
LinearAlgebra.SingularExceptionТип
SingularException
Исключение, которое выбрасывается, когда входная матрица имеет одно или несколько нулевых собственных значений и не является обратимой. Линейное решение, включающее такую матрицу, не может быть вычислено. Поле info указывает на расположение (одного из) сингулярных значений.
LinearAlgebra.PosDefExceptionТип
PosDefException
Исключение, выбрасываемое, когда входная матрица не является положительно определённой. Некоторые функции линейной алгебры и факторизации применимы только к положительно определённым матрицам. Поле info указывает местоположение (одного из) собственного(ых) значения(й), которое(ые) меньше/равно 0.
LinearAlgebra.ZeroPivotExceptionТип
ZeroPivotException <: Exception
Исключение, выбрасываемое, когда факторизация/решение матрицы сталкивается с нулём в позиции опорного элемента (по диагонали) и не может продолжить вычисления. Это не обязательно означает, что матрица является вырожденной: может быть полезно перейти к другой факторизации, например, LU с выбором опорных элементов, которая может переупорядочить переменные, чтобы устранить ложные нулевые опорные элементы. Поле info указывает местоположение (одного из) нулевых опорных элементов.
LinearAlgebra.RankDeficientExceptionТип
RankDeficientException
Исключение, выбрасываемое, когда входная матрица является вырожденной по рангу. Некоторые функции линейной алгебры, такие как разложение Холецкого, применимы только к матрицам, которые не являются вырожденными по рангу. Поле info указывает вычисленный ранг матрицы.
LinearAlgebra.LAPACKExceptionТип
LAPACKException
Общее исключение LAPACK, выбрасываемое либо во время прямых вызовов функций LAPACK, либо во время вызовов других функций, которые используют функции LAPACK внутри, но не имеют специализированной обработки ошибок. Поле info содержит дополнительную информацию об основной ошибке и зависит от функции LAPACK, которая была вызвана.
LinearAlgebra.dotФункция
dot(x, y) x ⋅ y
Вычислить скалярное произведение двух векторов. Для комплексных векторов первый вектор сопрягается.
dot также работает с произвольными итерируемыми объектами, включая массивы любого измерения, при условии, что dot определено для элементов.
dot семантически эквивалентно sum(dot(vx,vy) for (vx,vy) in zip(x, y)), с добавлением ограничения, что аргументы должны иметь равную длину.
x ⋅ y (где ⋅ можно ввести, нажав Tab во время ввода \cdot в REPL) является синонимом dot(x, y).
Примеры
julia> dot([1; 1], [2; 3]) 5 julia> dot([im; im], [1; 1]) 0 - 2im julia> dot(1:5, 2:6) 70 julia> x = fill(2., (5,5)); julia> y = fill(3., (5,5)); julia> dot(x, y) 150.0
LinearAlgebra.dotМетод
dot(x, A, y)
Вычислить обобщённое скалярное произведение dot(x, A*y) между двумя векторами x и y, не сохраняя промежуточного результата A*y. Как и для двухаргументной функции dot(_,_), это действует рекурсивно. Кроме того, для комплексных векторов первый вектор сопрягается.
Трех-аргументный dot требует как минимум Julia 1.4.
Примеры
julia> dot([1; 1], [1 2; 3 4], [2; 3]) 26 julia> dot(1:5, reshape(1:25, 5, 5), 2:6) 4850 julia> ⋅(1:5, reshape(1:25, 5, 5), 2:6) == dot(1:5, reshape(1:25, 5, 5), 2:6) true
LinearAlgebra.crossФункция
cross(x, y) ×(x,y)
Вычислить векторное произведение двух 3-векторов.
Примеры
julia> a = [0;1;0]
3-element Vector{Int64}:
0
1
0
julia> b = [0;0;1]
3-element Vector{Int64}:
0
0
1
julia> cross(a,b)
3-element Vector{Int64}:
1
0
0
LinearAlgebra.axpy!Функция
axpy!(α, x::AbstractArray, y::AbstractArray)
Перезаписать y значением x * α + y и вернуть y. Если x и y имеют одинаковые оси, это эквивалентно y .+= x .* a.
Примеры
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpy!(2, x, y)
3-element Vector{Int64}:
6
9
12
LinearAlgebra.axpby!Функция
axpby!(α, x::AbstractArray, β, y::AbstractArray)
Перезаписать y значением x * α + y * β и вернуть y. Если x и y имеют одинаковые оси, это эквивалентно y .= x .* a .+ y .* β.
Примеры
julia> x = [1; 2; 3];
julia> y = [4; 5; 6];
julia> axpby!(2, x, 2, y)
3-element Vector{Int64}:
10
14
18
LinearAlgebra.rotate!Функция
rotate!(x, y, c, s)
Перезаписать x значением c*x + s*y и y значением -conj(s)*x + c*y. Возвращает x и y.
rotate! требует как минимум Julia 1.5.
LinearAlgebra.reflect!Функция
reflect!(x, y, c, s)
Перезаписать x значением c*x + s*y и y значением conj(s)*x - c*y. Возвращает x и y.
reflect! требует как минимум Julia 1.5.
LinearAlgebra.factorizeФункция
factorize(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 will check to see that A is already factorized
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Тип
Diagonal(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Тип
Bidiagonal(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 is on the first superdiagonal
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 7 ⋅ ⋅
⋅ 2 8 ⋅
⋅ ⋅ 3 9
⋅ ⋅ ⋅ 4
julia> Bl = Bidiagonal(dv, ev, :L) # ev is on the first subdiagonal
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) # contains the main diagonal and first superdiagonal of A
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 1 ⋅ ⋅
⋅ 2 2 ⋅
⋅ ⋅ 3 3
⋅ ⋅ ⋅ 4
julia> Bidiagonal(A, :L) # contains the main diagonal and first subdiagonal of A
4×4 Bidiagonal{Int64, Vector{Int64}}:
1 ⋅ ⋅ ⋅
2 2 ⋅ ⋅
⋅ 3 3 ⋅
⋅ ⋅ 4 4
LinearAlgebra.SymTridiagonalТип
SymTridiagonal(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Тип
Tridiagonal(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 4
LinearAlgebra.SymmetricТип
Symmetric(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Тип
Hermitian(A::AbstractMatrix, uplo::Symbol=:U)
Постройте представление Hermitian верхней (если 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Тип
LowerTriangular(A::AbstractMatrix)
Постройте представление LowerTriangular матрицы A.
Примеры
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> LowerTriangular(A)
3×3 LowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 5.0 ⋅
7.0 8.0 9.0
LinearAlgebra.UpperTriangularТип
UpperTriangular(A::AbstractMatrix)
Постройте представление UpperTriangular матрицы A.
Примеры
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UpperTriangular(A)
3×3 UpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 5.0 6.0
⋅ ⋅ 9.0
LinearAlgebra.UnitLowerTriangularТип
UnitLowerTriangular(A::AbstractMatrix)
Постройте представление UnitLowerTriangular матрицы A. Такое представление имеет значение oneunit типа eltype A на своей диагонали.
Примеры
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitLowerTriangular(A)
3×3 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅ ⋅
4.0 1.0 ⋅
7.0 8.0 1.0
LinearAlgebra.UnitUpperTriangularТип
UnitUpperTriangular(A::AbstractMatrix)
Постройте представление UnitUpperTriangular матрицы A. Такое представление имеет значение oneunit типа eltype A на своей диагонали.
Примеры
julia> A = [1.0 2.0 3.0; 4.0 5.0 6.0; 7.0 8.0 9.0]
3×3 Matrix{Float64}:
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
julia> UnitUpperTriangular(A)
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 2.0 3.0
⋅ 1.0 6.0
⋅ ⋅ 1.0
LinearAlgebra.UpperHessenbergТип
UpperHessenberg(A::AbstractMatrix)
Постройте представление UpperHessenberg матрицы A. Элементы A ниже первой побочной диагонали игнорируются.
Этот тип был добавлен в Julia 1.3.
Эффективные алгоритмы реализованы для H \ b, det(H) и аналогичных.
См. также функцию hessenberg для разложения любой матрицы в подобную верхнюю гэссенберговскую матрицу.
Если F::Hessenberg – это объект разложения, унитарную матрицу можно получить с помощью F.Q, а гэссенберговскую матрицу с помощью F.H. При извлечении Q, результирующий тип – это объект HessenbergQ, который можно преобразовать в обычную матрицу с помощью convert(Array, _) (или Array(_) для краткости).
Итерация разложения дает факторы F.Q и F.H.
Примеры
julia> A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
4×4 Matrix{Int64}:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
julia> UpperHessenberg(A)
4×4 UpperHessenberg{Int64, Matrix{Int64}}:
1 2 3 4
5 6 7 8
⋅ 10 11 12
⋅ ⋅ 15 16
LinearAlgebra.UniformScalingТип
UniformScaling{T<:Number}
Матрица с равномерным масштабированием произвольного размера, определенная как скаляр умноженный на единичную матрицу, λ*I. Несмотря на отсутствие явного size, она в многих случаях ведет себя как матрица и поддерживает индексирование. См. также I.
Индексирование с помощью диапазонов доступно начиная с Julia 1.6.
Примеры
julia> J = UniformScaling(2.)
UniformScaling{Float64}
2.0*I
julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> J*A
2×2 Matrix{Float64}:
2.0 4.0
6.0 8.0
julia> J[1:2, 1:2]
2×2 Matrix{Float64}:
2.0 0.0
0.0 2.0
LinearAlgebra.IКонстанта
I
Объект типа UniformScaling, представляющий единичную матрицу любого размера.
Примеры
julia> fill(1, (5,6)) * I == fill(1, (5,6))
true
julia> [1 2im 3; 1im 2 3] * I
2×3 Matrix{Complex{Int64}}:
1+0im 0+2im 3+0im
0+1im 2+0im 3+0im
LinearAlgebra.UniformScalingМетод
(I::UniformScaling)(n::Integer)
Постройте матрицу Diagonal из кортежа UniformScaling.
Этот метод доступен начиная с Julia 1.2.
Примеры
julia> I(3)
3×3 Diagonal{Bool, Vector{Bool}}:
1 ⋅ ⋅
⋅ 1 ⋅
⋅ ⋅ 1
julia> (0.7*I)(3)
3×3 Diagonal{Float64, Vector{Float64}}:
0.7 ⋅ ⋅
⋅ 0.7 ⋅
⋅ ⋅ 0.7
LinearAlgebra.FactorizationТип
LinearAlgebra.Factorization
Абстрактный тип для разложений матриц. См. онлайн-документацию для списка доступных разложений матриц.
LinearAlgebra.LUТип
LU <: 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); # destructuring via iteration
julia> l == F.L && u == F.U && p == F.p
true
LinearAlgebra.luФункция
lu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU
Вычислить LU-разложение разреженной матрицы A.
Для разреженной A с вещественным или комплексным типом элементов, возвращаемый тип F — UmfpackLU{Tv, Ti}, с Tv = Float64 или ComplexF64 соответственно, а Ti — целочисленный тип (Int32 или Int64).
Если check = true, при неудачном разложении выбрасывается ошибка. Если check = false, ответственность за проверку корректности разложения (через issuccess) лежит на пользователе.
Перестановка q может быть либо вектором перестановок, либо nothing. Если вектор перестановок не предоставлен или q — nothing, используется значение по умолчанию UMFPACK. Если перестановка не нулево-базисная, создаётся нулево-базисная копия.
Вектор control по умолчанию соответствует настройкам пакета Julia SparseArrays для UMFPACK (примечание: это изменено по сравнению с настройками UMFPACK, чтобы отключить итеративную уточнение), но может быть изменён путём передачи вектора длиной UMFPACK_CONTROL, см. руководство UMFPACK для возможных настроек. Например, чтобы снова включить итеративное уточнение:
umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # read Julia default configuration for a Float64 sparse matrix SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # optional - display values umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # reenable iterative refinement (2 is UMFPACK default max iterative refinement steps) Alu = lu(A; control = umfpack_control) x = Alu \ b # solve Ax = b, including UMFPACK iterative refinement
Индивидуальные компоненты разложения 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 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 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); # destructuring via iteration
julia> l == F.L && u == F.U && p == F.p
true
julia> lu([1 2; 1 2], allowsingular = true)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
1.0 1.0
U factor (rank-deficient):
2×2 Matrix{Float64}:
1.0 2.0
0.0 0.0
LinearAlgebra.lu!Функция
lu!(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) -> LU
lu! эквивалентен lu, но экономит место, перезаписывая входной A, вместо создания копии. Исключение InexactError выбрасывается, если факторизация приводит к числу, не представимому типом элементов A, например, для целочисленных типов.
Ключевое слово allowsingular было добавлено в Julia 1.11.
Примеры
julia> A = [4. 3.; 6. 3.]
2×2 Matrix{Float64}:
4.0 3.0
6.0 3.0
julia> F = lu!(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
1.0 0.0
0.666667 1.0
U factor:
2×2 Matrix{Float64}:
6.0 3.0
0.0 1.0
julia> iA = [4 3; 6 3]
2×2 Matrix{Int64}:
4 3
6 3
julia> lu!(iA)
ERROR: InexactError: Int64(0.6666666666666666)
Stacktrace:
[...]
LinearAlgebra.CholeskyТип
Cholesky <: 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; # destructuring via iteration
julia> l == C.L && u == C.U
true
LinearAlgebra.CholeskyPivotedТип
CholeskyPivoted
Тип матричной факторизации пивот-холеского разложения плотной симметричной/эрмитовой положительно полуопределённой матрицы 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 factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
4.0 2.0 3.0 1.0
⋅ 0.0 6.0 2.0
⋅ ⋅ 9.0 3.0
⋅ ⋅ ⋅ 1.0
permutation:
4-element Vector{Int64}:
4
2
3
1
julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true
julia> l, u = C; # destructuring via iteration
julia> l == C.L && u == C.U
true
LinearAlgebra.choleskyФункция
cholesky(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 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
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 factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
4.0 2.0 3.0 1.0
⋅ 0.0 6.0 2.0
⋅ ⋅ 9.0 3.0
⋅ ⋅ ⋅ 1.0
permutation:
4-element Vector{Int64}:
4
2
3
1
julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true
julia> l, u = C; # destructuring via iteration
julia> l == C.L && u == C.U
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!Функция
cholesky!(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Функция
lowrankupdate(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
Получить факторизацию Холецкого A + C*C', заданную факторизацией LDLt или LLt F матрицы A.
Возвращаемая факторизация всегда является факторизацией Холецкого.
См. также lowrankupdate!, lowrankdowndate, lowrankdowndate!.
LinearAlgebra.lowrankdowndateФункция
lowrankdowndate(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
Получить факторизацию Холецкого A + C*C', заданную факторизацией LDLt или LLt F матрицы A.
Возвращаемая факторизация всегда является факторизацией Холецкого.
См. также lowrankdowndate!, lowrankupdate, lowrankupdate!.
LinearAlgebra.lowrankupdate!Функция
lowrankupdate!(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)
Обновить факторизацию Холецкого или LLt F матрицы A до факторизации матрицы A + C*C'.
Факторизации LLt преобразуются в факторизации LDLt.
См. также lowrankupdate, lowrankdowndate, lowrankdowndate!.
LinearAlgebra.lowrankdowndate!Функция
lowrankdowndate!(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)
Обновить факторизацию Холецкого или LLt F матрицы A до факторизации матрицы A - C*C'.
Факторизации LLt преобразуются в факторизации LDLt.
См. также lowrankdowndate, lowrankupdate, lowrankupdate!.
LinearAlgebra.LDLtТип
LDLt <: Factorization
Тип факторизации матрицы LDLt факторизации вещественной SymTridiagonal матрицы S, такой, что S = L*Diagonal(d)*L', где L — нижняя треугольная матрица, а 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 factor:
3×3 UnitLowerTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}:
1.0 ⋅ ⋅
0.333333 1.0 ⋅
0.0 0.545455 1.0
D factor:
3×3 Diagonal{Float64, Vector{Float64}}:
3.0 ⋅ ⋅
⋅ 3.66667 ⋅
⋅ ⋅ 3.90909
LinearAlgebra.ldltФункция
ldlt(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!Функция
ldlt!(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Тип
QR <: Factorization
Разложение QR матрицы, хранящееся в упакованном формате, обычно получаемое из qr. Если $A$ — m×n матрица, то
\[A = Q R\]
где $Q$ — ортогональная/унитарная матрица, а $R$ — верхняя треугольная матрица. Матрица $Q$ хранится как последовательность отражателей Хаусхолдера $v_i$ и коэффициентов $\tau_i$, где:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
Итерация разложения производит компоненты Q и R.
Объект имеет два поля:
-
factors—m×nматрица.Верхняя треугольная часть содержит элементы $R$, то есть
R = triu(F.factors)для объектаQRF.Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, где $v_i$ — $i$-ый столбец матрицы
V = I + tril(F.factors, -1).
τ— вектор длинойmin(m,n), содержащий коэффициенты $au_i$.
LinearAlgebra.QRCompactWYТип
QRCompactWY <: Factorization
Разложение QR матрицы, хранящееся в компактном блочном формате, обычно получаемое из qr. Если $A$ — m×n матрица, то
\[A = Q R\]
где $Q$ — ортогональная/унитарная матрица, а $R$ — верхняя треугольная матрица. Это аналогично формату QR, за исключением того, что ортогональная/унитарная матрица $Q$ хранится в формате Compact WY [Schreiber1989]. Для размера блока $n_b$ он хранится как m×n нижняя трапециевидная матрица $V$ и матрица $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$) и верхней трапециевидной $n_b$×$\min(m,n) - (b-1) n_b$ матрицы $T_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).
T— матрица $n_b$-на-$\min(m,n)$, как описано выше. Поддиагональные элементы для каждой треугольной матрицы $T_j$ игнорируются.
Этот формат не следует путать со старым представлением WY [Bischof1987].
LinearAlgebra.QRPivotedТип
QRPivoted <: Factorization
Разложение QR матрицы с выбором столбцов в упакованном формате, обычно получаемое из qr. Если $A$ — m×n матрица, то
\[A P = Q R\]
где $P$ — матрица перестановок, $Q$ — ортогональная/унитарная матрица, а $R$ — верхняя треугольная матрица. Матрица $Q$ хранится как последовательность отражателей Хаусхолдера:
\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T).\]
Итерация разложения производит компоненты Q, R и p.
Объект имеет три поля:
-
factors—m×nматрица.Верхняя треугольная часть содержит элементы $R$, то есть
R = triu(F.factors)для объектаQRF.Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, где $v_i$ — $i$-ый столбец матрицы
V = I + tril(F.factors, -1).
τ— вектор длинойmin(m,n), содержащий коэффициенты $au_i$.jpvt— целочисленный вектор длинойn, соответствующий перестановке $P$.
LinearAlgebra.qrФункция
qr(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} with 4 stored entries:
1.0 ⋅
1.0 ⋅
⋅ 1.0
⋅ 1.0
julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q factor:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R factor:
2×2 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
-1.41421 ⋅
⋅ -1.41421
Row permutation:
4-element Vector{Int64}:
1
3
4
2
Column permutation:
2-element Vector{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: ортогональная/унитарная матрицаQ -
F.R: верхняя треугольная матрицаR -
F.p: вектор перестановок для выбора опорного элемента (QRPivotedтолько) -
F.P: матрица перестановок для выбора опорного элемента (QRPivotedтолько)
Каждый вызов верхнего треугольного множителя через F.R выделяет новый массив. Поэтому рекомендуется кэшировать этот массив, например, при помощи R = F.R, и продолжать работу с R.
Итерирование разложения производит компоненты Q, R, и если существует, p.
Для объектов QR доступны следующие функции: inv, size и \. Когда A является прямоугольной, \ вернёт решение метода наименьших квадратов, и если решение не единственное, будет возвращено решение с наименьшей нормой. Когда A не имеет полного ранга, необходимо использовать разложение с выбором опорных элементов (столбцов), чтобы получить решение с минимальной нормой.
Разрешено умножение относительно как полных/квадратных, так и неполных/квадратных Q, т.е. поддерживаются как F.Q*F.R, так и F.Q*A. Матрицу Q можно преобразовать в обычную матрицу с помощью Matrix. Эта операция возвращает «тонкий» (thin) множитель 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 factor: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R factor:
2×2 Matrix{Float64}:
-5.0 10.0
0.0 -1.0
julia> F.Q * F.R == A
true
qr возвращает несколько типов, потому что LAPACK использует несколько представлений, которые минимизируют требования к памяти для произведений элементарных отражателей Хаусхолдера, так что матрицы Q и R могут храниться компактно, а не как две отдельные плотные матрицы.
LinearAlgebra.qr!Функция
qr!(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 factor: 2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R factor:
2×2 Matrix{Float64}:
-3.16228 -4.42719
0.0 -0.632456
julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> qr!(a)
ERROR: InexactError: Int64(3.1622776601683795)
Stacktrace:
[...]
LinearAlgebra.LQТип
LQ <: 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 factor:
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
Q factor: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}
julia> S.L * S.Q
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> l, q = S; # destructuring via iteration
julia> l == S.L && q == S.Q
true
LinearAlgebra.lqФункция
lq(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 factor:
2×2 Matrix{Float64}:
-8.60233 0.0
4.41741 -0.697486
Q factor: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}
julia> S.L * S.Q
2×2 Matrix{Float64}:
5.0 7.0
-2.0 -4.0
julia> l, q = S; # destructuring via iteration
julia> l == S.L && q == S.Q
true
LinearAlgebra.lq!Функция
lq!(A) -> LQ
Вычислите LQ-разложение A, используя входную матрицу в качестве рабочей области. См. также lq.
LinearAlgebra.BunchKaufmanТип
BunchKaufman <: Factorization
Тип матричного разложения для факторизации Банча-Коуфмана симметричной или эрмитовой матрицы 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 gets wrapped internally by Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U factor:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
permutation:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # destructuring via iteration
julia> d == S.D && u == S.U && p == S.p
true
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L factor:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
permutation:
2-element Vector{Int64}:
2
1
LinearAlgebra.bunchkaufmanФункция
bunchkaufman(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 gets wrapped internally by Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
-0.333333 0.0
0.0 3.0
U factor:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
1.0 0.666667
⋅ 1.0
permutation:
2-element Vector{Int64}:
1
2
julia> d, u, p = S; # destructuring via iteration
julia> d == S.D && u == S.U && p == S.p
true
julia> S.U*S.D*S.U' - S.P*A*S.P'
2×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
3.0 0.0
0.0 -0.333333
L factor:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
1.0 ⋅
0.666667 1.0
permutation:
2-element Vector{Int64}:
2
1
julia> S.L*S.D*S.L' - A[S.p, S.p]
2×2 Matrix{Float64}:
0.0 0.0
0.0 0.0
LinearAlgebra.bunchkaufman!Функция
bunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufman
bunchkaufman! аналогична bunchkaufman, но экономит память, перезаписывая входной A вместо создания копии.
LinearAlgebra.EigenТип
Eigen <: 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; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.GeneralizedEigenТип
GeneralizedEigen <: 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; # destructuring via iteration
julia> vals == F.values && vecs == F.vectors
true
LinearAlgebra.eigvalsФункция
eigvals(A; permute::Bool=true, scale::Bool=true, sortby) -> values
Возвращает собственные значения A.
Для общих несимметричных матриц можно указать, как балансировать матрицу перед вычислением собственных значений. Ключевые слова permute, scale и sortby такие же, как для eigen.
Примеры
julia> diag_matrix = [1 0; 0 4]
2×2 Matrix{Int64}:
1 0
0 4
julia> eigvals(diag_matrix)
2-element Vector{Float64}:
1.0
4.0Для скалярного входного значения eigvals вернёт скаляр.
Примеры
julia> eigvals(-2) -2
eigvals(A, B) -> values
Вычисляет обобщенные собственные значения 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.140054944640259
LinearAlgebra.eigvals!Функция
eigvals!(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Функция
eigmax(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` cannot have complex eigenvalues.
Stacktrace:
[...]
LinearAlgebra.eigminФункция
eigmin(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` cannot have complex eigenvalues.
Stacktrace:
[...]
LinearAlgebra.eigvecsФункция
eigvecs(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.0im
LinearAlgebra.eigenФункция
eigen(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; # destructuring via iteration
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; # destructuring via iteration
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!Функция
eigen!(A; permute, scale, sortby) eigen!(A, B; sortby)
Аналогично eigen, но экономит место, перезаписывая входной A (и B), вместо создания копии.
LinearAlgebra.HessenbergТип
Hessenberg <: Factorization
Объект Hessenberg представляет факторизацию Гамильтона QHQ' квадратной матрицы или смещение Q(H+μI)Q' последней, которое производится функцией hessenberg.
LinearAlgebra.hessenbergФункция
hessenberg(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 factor: 3×3 LinearAlgebra.HessenbergQ{Float64, Matrix{Float64}, Vector{Float64}, false}
H factor:
3×3 UpperHessenberg{Float64, Matrix{Float64}}:
4.0 -11.3137 -1.41421
-5.65685 5.0 2.0
⋅ -8.88178e-16 1.0
julia> F.Q * F.H * F.Q'
3×3 Matrix{Float64}:
4.0 9.0 7.0
4.0 4.0 1.0
4.0 3.0 2.0
julia> q, h = F; # destructuring via iteration
julia> q == F.Q && h == F.H
true
LinearAlgebra.hessenberg!Функция
hessenberg!(A) -> Hessenberg
hessenberg! — это то же самое, что hessenberg, но экономит место, перезаписывая входной A, вместо создания копии.
LinearAlgebra.SchurТип
Schur <: 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 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; # destructuring via iteration
julia> t == F.T && z == F.Z && vals == F.values
true
LinearAlgebra.GeneralizedSchurТип
GeneralizedSchur <: 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Функция
schur(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; # destructuring via iteration
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!Функция
schur!(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 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> A
2×2 Matrix{Float64}:
3.0 9.0
0.0 -2.0schur!(A::StridedMatrix, B::StridedMatrix) -> F::GeneralizedSchur
То же, что и schur, но использует входные матрицы A и B в качестве рабочей области.
LinearAlgebra.ordschurФункция
ordschur(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!Функция
ordschur!(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Тип
SVD <: 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
singular values:
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; # destructuring via iteration
julia> u == F.U && s == F.S && v == F.V
true
LinearAlgebra.GeneralizedSVDТип
GeneralizedSVD <: Factorization
Тип матричной факторизации обобщенного разложения по сингулярным значениям (SVD) двух матриц A и B, таких, что A = F.U*F.D1*F.R0*F.Q' и B = F.V*F.D2*F.R0*F.Q'. Это тип возвращаемого значения функции матричной факторизации svd(_, _).
Для M-на-N матрицы A и P-на-N матрицы B,
-
U— ортогональная M-на-M матрица, -
V— ортогональная P-на-P матрица, -
Q— ортогональная N-на-N матрица, -
D1— диагональная M-на-(K+L) матрица с 1 в первых K элементах, -
D2— P-на-(K+L) матрица, у которой верхний правый блок L-на-L диагональный, -
R0— (K+L)-на-N матрица, у которой правый (K+L)-на-(K+L) блок невырожденный верхний блочно-треугольный,
K+L — эффективный числовой ранг матрицы [A; B].
Итерация разложения производит компоненты U, V, Q, D1, D2 и R0.
Элементы F.D1 и F.D2 связаны, как объяснено в документации LAPACK для обобщенного SVD и процедуры xGGSVD3, которая вызывается внутри (в LAPACK 3.6.0 и новее).
Примеры
julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
0.0 1.0
1.0 0.0
julia> F = svd(A, B)
GeneralizedSVD{Float64, Matrix{Float64}, Float64, Vector{Float64}}
U factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
V factor:
2×2 Matrix{Float64}:
-0.0 -1.0
1.0 0.0
Q factor:
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
D1 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
D2 factor:
2×2 Matrix{Float64}:
0.707107 0.0
0.0 0.707107
R0 factor:
2×2 Matrix{Float64}:
1.41421 0.0
0.0 -1.41421
julia> F.U*F.D1*F.R0*F.Q'
2×2 Matrix{Float64}:
1.0 0.0
0.0 -1.0
julia> F.V*F.D2*F.R0*F.Q'
2×2 Matrix{Float64}:
-0.0 1.0
1.0 0.0
LinearAlgebra.svdФункция
svd(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); # Store the Factorization Object julia> A ≈ F.U * Diagonal(F.S) * F.Vt true julia> U, S, V = F; # destructuring via iteration julia> A ≈ U * Diagonal(S) * V' true julia> Uonly, = svd(A); # Store U only julia> Uonly == U true
svd(A, B) -> GeneralizedSVD
Вычислить обобщенное SVD A и B, возвращая объект факторизации GeneralizedSVD F, так что [A;B] = [F.U * F.D1; F.V * F.D2] * F.R0 * F.Q'
-
U— ортогональная M-на-M матрица, -
V— ортогональная P-на-P матрица, -
Q— ортогональная N-на-N матрица, -
D1— диагональная M-на-(K+L) матрица с 1 в первых 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, как в геномах человека и дрожжей, или сигнала и шума, или между кластерами и внутри кластеров. (См. обсуждение в Edelman и Wang: https://arxiv.org/abs/1901.00485)
Он разлагает [A; B] на [UC; VS]H, где [UC; VS] — естественный ортогональный базис для пространства столбцов [A; B], а H = RQ' — естественный неортогональный базис для пространства строк [A;B], где верхние строки наиболее тесно связаны с матрицей A, а нижние — с матрицей B. Матрицы многократного косинуса/синуса C и S предоставляют многомерную меру того, сколько принадлежит A по сравнению с тем, сколько принадлежит B, а U и V предоставляют направления, в которых это измеряется.
Примеры
julia> A = randn(3,2); B=randn(4,2); julia> F = svd(A, B); julia> U,V,Q,C,S,R = F; julia> H = R*Q'; julia> [A; B] ≈ [U*C; V*S]*H true julia> [A; B] ≈ [F.U*F.D1; F.V*F.D2]*F.R0*F.Q' true julia> Uonly, = svd(A,B); julia> U == Uonly true
LinearAlgebra.svd!Функция
svd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD
svd! — то же, что и svd, но экономит место, перезаписывая входной A вместо создания копии. См. документацию svd для подробностей.
svd!(A, B) -> GeneralizedSVD
svd! — то же, что и svd, но изменяет аргументы A и B на месте, а не создает копии. См. документацию svd для подробностей.
LinearAlgebra.svdvalsФункция
svdvals(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.0
LinearAlgebra.svdvals!Функция
svdvals!(A)
Вернуть сингулярные значения A, экономя место, перезаписывая входной параметр. См. также svdvals и svd.
svdvals!(A, B)
Возвращает обобщенные сингулярные значения из обобщенного сингулярного разложения A и B, экономя место, перезаписывая A и B. См. также svd и svdvals.
LinearAlgebra.GivensТип
LinearAlgebra.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Функция
givens(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Функция
triu(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.0
LinearAlgebra.triu!Функция
triu!(M)
Верхняя треугольная часть матрицы, перезаписывая M в процессе. См. также triu.
triu!(M, k::Integer)
Возвращает верхнюю треугольную часть M, начиная с k-й наддиагонали, перезаписывая M в процессе.
Примеры
julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
julia> triu!(M, 1)
5×5 Matrix{Int64}:
0 2 3 4 5
0 0 3 4 5
0 0 0 4 5
0 0 0 0 5
0 0 0 0 0
LinearAlgebra.trilФункция
tril(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.0
LinearAlgebra.tril!Функция
tril!(M)
Нижняя треугольная часть матрицы, перезаписывая M в процессе. См. также tril.
tril!(M, k::Integer)
Возвращает нижнюю треугольную часть M, начиная с k-й наддиагонали, перезаписывая M в процессе.
Примеры
julia> M = [1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5; 1 2 3 4 5]
5×5 Matrix{Int64}:
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
julia> tril!(M, 2)
5×5 Matrix{Int64}:
1 2 3 0 0
1 2 3 4 0
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
LinearAlgebra.diagindФункция
diagind(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Функция
diag(M, k::Integer=0)
k-я диагональ матрицы в виде вектора.
См. также diagm, diagind, Diagonal, isdiag.
Примеры
julia> A = [1 2 3; 4 5 6; 7 8 9]
3×3 Matrix{Int64}:
1 2 3
4 5 6
7 8 9
julia> diag(A,1)
2-element Vector{Int64}:
2
6
LinearAlgebra.diagmФункция
diagm(kv::Pair{<:Integer,<:AbstractVector}...)
diagm(m::Integer, n::Integer, kv::Pair{<:Integer,<:AbstractVector}...)
Построение матрицы из диагоналей и векторов. Вектор 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 3
LinearAlgebra.rankФункция
rank(::QRSparse{Tv,Ti}) -> Ti
Возвращает ранг QR-разложения.
rank(S::SparseMatrixCSC{Tv,Ti}; [tol::Real]) -> Ti
Вычисление ранга S путём вычисления его QR-разложения. Значения, меньшие, чем tol, считаются нулями. См. руководство SPQR.
rank(A::AbstractMatrix; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ) rank(A::AbstractMatrix, rtol::Real)
Вычисление числового ранга матрицы путём подсчёта количества результатов svdvals(A), которые больше, чем max(atol, rtol*σ₁), где σ₁ — наибольшее вычисленное сингулярное значение A. atol и rtol — абсолютная и относительная погрешности соответственно. По умолчанию относительная погрешность равна n*ϵ, где n — размер наименьшего измерения A, а ϵ — eps типа элемента A.
Числовой ранг может быть чувствительным и неточным показателем для плохо обусловленных матриц с сингулярными значениями, близкими к пороговой погрешности max(atol, rtol*σ₁). В таких случаях небольшие возмущения в вычислении сингулярных значений или в матрице могут изменить результат rank, продвинув одно или несколько сингулярных значений через порог. Эти изменения могут происходить даже из-за изменений ошибок с плавающей запятой между различными версиями Julia, архитектурами, компиляторами или операционными системами.
Ключевые аргументы atol и rtol требуют по крайней мере Julia 1.1. В Julia 1.0 rtol доступен как позиционный аргумент, но это будет устаревшим в Julia 2.0.
Примеры
julia> rank(Matrix(I, 3, 3)) 3 julia> rank(diagm(0 => [1, 0, 2])) 2 julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.1) 2 julia> rank(diagm(0 => [1, 0.001, 2]), rtol=0.00001) 3 julia> rank(diagm(0 => [1, 0.001, 2]), atol=1.5) 1
LinearAlgebra.normФункция
norm(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.0
LinearAlgebra.opnormФункция
opnorm(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)
Для векторов с сопряжённым/транспонированным оболочкой верните операторную $q$-норму A, что эквивалентно p-норме со значением p = q/(q-1). Они совпадают при p = q = 2. Используйте norm для вычисления p нормы A как вектора.
Разница в норме между пространством векторов и его двойственным пространством возникает для сохранения связи между двойственностью и скалярным произведением, и результат согласуется с операторной p-нормой 1 × n матрицы.
Примеры
julia> v = [1; im]; julia> vc = v'; julia> opnorm(vc, 1) 1.0 julia> norm(vc, 1) 2.0 julia> norm(v, 1) 2.0 julia> opnorm(vc, 2) 1.4142135623730951 julia> norm(vc, 2) 1.4142135623730951 julia> norm(v, 2) 1.4142135623730951 julia> opnorm(vc, Inf) 2.0 julia> norm(vc, Inf) 1.0 julia> norm(v, Inf) 1.0
LinearAlgebra.normalize!Функция
normalize!(a::AbstractArray, p::Real=2)
Нормализуйте массив a на месте так, чтобы его p-норма равнялась единице, т. е. norm(a, p) == 1. См. также normalize и norm.
LinearAlgebra.normalizeФункция
normalize(a, p::Real=2)
Нормализуйте a так, чтобы его p-норма равнялась единице, т. е. norm(a, p) == 1. Для скаляров это аналогично sign(a), за исключением normalize(0) = NaN. См. также normalize!, norm и sign.
Примеры
julia> a = [1,2,4];
julia> b = normalize(a)
3-element Vector{Float64}:
0.2182178902359924
0.4364357804719848
0.8728715609439696
julia> norm(b)
1.0
julia> c = normalize(a, 1)
3-element Vector{Float64}:
0.14285714285714285
0.2857142857142857
0.5714285714285714
julia> norm(c, 1)
1.0
julia> a = [1 2 4 ; 1 2 4]
2×3 Matrix{Int64}:
1 2 4
1 2 4
julia> norm(a)
6.48074069840786
julia> normalize(a)
2×3 Matrix{Float64}:
0.154303 0.308607 0.617213
0.154303 0.308607 0.617213
julia> normalize(3, 1)
1.0
julia> normalize(-8, 1)
-1.0
julia> normalize(0, 1)
NaN
LinearAlgebra.condФункция
cond(M, p::Real=2)
Число обусловленности матрицы M, вычисленное с помощью операторной p-нормы. Допустимые значения для p — 1, 2 (по умолчанию) или Inf.
LinearAlgebra.condskeelФункция
condskeel(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}\]
Число обусловленности Skeel $\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Функция
tr(M)
След матрицы. Суммирует диагональные элементы M.
Примеры
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> tr(A)
5
LinearAlgebra.detФункция
det(M)
Определитель матрицы.
См. также: logdet и logabsdet.
Примеры
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> det(M)
2.0
LinearAlgebra.logdetФункция
logdet(M)
Логарифм определителя матрицы. Эквивалентно log(det(M)), но может обеспечить повышенную точность и избежать переполнения/потерь точности.
Примеры
julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
1 0
2 2
julia> logdet(M)
0.6931471805599453
julia> logdet(Matrix(I, 3, 3))
0.0
LinearAlgebra.logabsdetФункция
logabsdet(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Метод
inv(M)
Обратная матрица. Вычисляет матрицу N, такую, что M * N = I, где I — единичная матрица. Вычисляется путём решения левого деления N = M \ I.
Примеры
julia> M = [2 5; 1 3]
2×2 Matrix{Int64}:
2 5
1 3
julia> N = inv(M)
2×2 Matrix{Float64}:
3.0 -5.0
-1.0 2.0
julia> M*N == N*M == Matrix(I, 2, 2)
true
LinearAlgebra.pinvФункция
pinv(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ) pinv(M, rtol::Real) = pinv(M; rtol=rtol) # to be deprecated in Julia 2.0
Вычисляет псевдообратную матрицу по Мур-Пенрозу.
Для матриц M с плавающей точкой удобно вычислить псевдообратную, инвертируя только сингулярные значения, большие чем max(atol, rtol*σ₁), где σ₁ — наибольшее сингулярное значение M.
Оптимальный выбор абсолютной (atol) и относительной толерантности (rtol) варьируется как в зависимости от значения M, так и от предполагаемого применения псевдообратной матрицы. По умолчанию относительная толерантность составляет n*ϵ, где n — размер наименьшего измерения M, а ϵ — eps типа элементов M.
Для инвертирования плотных плохо обусловленных матриц в смысле наименьших квадратов рекомендуется rtol = sqrt(eps(real(float(oneunit(eltype(M)))))).
Дополнительную информацию см. в [issue8859], [B96], [S84], [KY88].
Примеры
julia> M = [1.5 1.3; 1.2 1.9]
2×2 Matrix{Float64}:
1.5 1.3
1.2 1.9
julia> N = pinv(M)
2×2 Matrix{Float64}:
1.47287 -1.00775
-0.930233 1.16279
julia> M * N
2×2 Matrix{Float64}:
1.0 -2.22045e-16
4.44089e-16 1.0
LinearAlgebra.nullspaceФункция
nullspace(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ) nullspace(M, rtol::Real) = nullspace(M; rtol=rtol) # to be deprecated in Julia 2.0
Вычисляет базис нулевого пространства M путём включения сингулярных векторов M, сингулярные значения которых имеют величины меньше, чем max(atol, rtol*σ₁), где σ₁ — наибольшее сингулярное значение M.
По умолчанию относительная толерантность rtol равна n*ϵ, где n — размер наименьшего измерения M, а ϵ — eps типа элементов M.
Примеры
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Функция
kron(A, B)
Вычисляет кронекеровское произведение двух векторов, матриц или чисел.
Для вещественных векторов v и w кронекеровское произведение связано с внешним произведением соотношением kron(v,w) == vec(w * transpose(v)) или w * transpose(v) == reshape(kron(v,w), (length(w), length(v))). Обратите внимание, как порядок v и w отличается слева и справа в этих выражениях (из-за хранения в формате «столбец-строка»). Для комплексных векторов внешнее произведение w * v' также отличается сопряжением v.
Примеры
julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
1 2
3 4
julia> B = [im 1; 1 -im]
2×2 Matrix{Complex{Int64}}:
0+1im 1+0im
1+0im 0-1im
julia> kron(A, B)
4×4 Matrix{Complex{Int64}}:
0+1im 1+0im 0+2im 2+0im
1+0im 0-1im 2+0im 0-2im
0+3im 3+0im 0+4im 4+0im
3+0im 0-3im 4+0im 0-4im
julia> v = [1, 2]; w = [3, 4, 5];
julia> w*transpose(v)
3×2 Matrix{Int64}:
3 6
4 8
5 10
julia> reshape(kron(v,w), (length(w), length(v)))
3×2 Matrix{Int64}:
3 6
4 8
5 10
Base.kron!Функция
kron!(C, A, B)
Вычисляет кронекеровское произведение A и B и сохраняет результат в C, перезаписывая существующее содержимое C. Это версия в формате «на месте» функции kron.
Эта функция требует Julia 1.6 или более поздней версии.
Base.expМетод
exp(A::AbstractMatrix)
Вычислите матричную экспоненту A, определённую по формуле
\[e^A = \sum_{n=0}^{\infty} \frac{A^n}{n!}.\]
Для симметричных или эрмитовых A используется собственное разложение (eigen), в противном случае выбирается алгоритм масштабирования и возведения в квадрат (см. [H05]).
Примеры
julia> A = Matrix(1.0I, 2, 2)
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
julia> exp(A)
2×2 Matrix{Float64}:
2.71828 0.0
0.0 2.71828
Base.cisМетод
cis(A::AbstractMatrix)
Более эффективный метод для exp(im*A) квадратной матрицы A (особенно если A является Hermitian или вещественно-Symmetric).
Поддержка использования cis с матрицами была добавлена в Julia 1.7.
Примеры
julia> cis([π 0; 0 π]) ≈ -I true
Base.:^Метод
^(A::AbstractMatrix, p::Number)
Степень матрицы, эквивалентная $\exp(p\log(A))$
Примеры
julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
1 26
0 27
Base.:^Метод
^(b::Number, A::AbstractMatrix)
Матричная экспонента, эквивалентная $\exp(\log(b)A)$.
Поддержка возведения Irrational чисел (таких как ℯ) в матрицу была добавлена в Julia 1.1.
Примеры
julia> 2^[1 2; 0 3]
2×2 Matrix{Float64}:
2.0 6.0
0.0 8.0
julia> ℯ^[1 2; 0 3]
2×2 Matrix{Float64}:
2.71828 17.3673
0.0 20.0855
Base.logМетод
log(A::AbstractMatrix)
Если у A нет отрицательных вещественных собственных значений, вычислите главную матричную логарифм A, т. е. единственную матрицу $X$ такую, что $e^X = A$ и $-\pi < Im(\lambda) < \pi$ для всех собственных значений $\lambda$ матрицы $X$. Если у A есть неотрицательные собственные значения, то возвращается неглавная матричная функция, когда это возможно.
Если A является симметричной или эрмитовой, используется её собственное разложение (eigen), если A является треугольной, используется улучшенная версия метода обратного масштабирования и возведения в квадрат (см. [AH12] и [AHR13]). Если A вещественная без отрицательных собственных значений, вычисляется вещественная форма Шура. В противном случае вычисляется комплексная форма Шура. Затем на верхнем (квази-)треугольном факторе используется алгоритм в [AHR13].
Примеры
julia> A = Matrix(2.7182818*I, 2, 2)
2×2 Matrix{Float64}:
2.71828 0.0
0.0 2.71828
julia> log(A)
2×2 Matrix{Float64}:
1.0 0.0
0.0 1.0
Base.sqrtМетод
sqrt(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 is below the branch cut
0.0 - 9.0im
julia> .√(1:4)
4-element Vector{Float64}:
1.0
1.4142135623730951
1.7320508075688772
2.0
исходный кодsqrt(A::AbstractMatrix)
Если у A нет отрицательных вещественных собственных значений, вычислите главную матричную квадратную корень из A, то есть единственную матрицу $X$ со собственными значениями, имеющими положительную действительную часть, такую что $X^2 = A$. В противном случае возвращается неглавный квадратный корень.
Если A вещественно-симметричная или эрмитова, используется её собственное разложение (eigen) для вычисления квадратного корня. Для таких матриц собственные значения λ, которые, по-видимому, немного отрицательны из-за ошибок округления, обрабатываются так, как если бы они были равны нулю. Более точно, матрицы со всеми собственными значениями ≥ -rtol*(max |λ|) обрабатываются как полуопределённые (что даёт эрмитов квадратный корень), а отрицательные собственные значения принимаются равными нулю. rtol — это ключевой аргумент для sqrt (только в случае эрмитовых/вещественно-симметричных матриц), который по умолчанию равен машинной точности, умноженной на size(A,1).
В противном случае квадратный корень определяется с помощью метода Бьёрка-Хаммарлинга [BH83], который вычисляет комплексную форму Шура (schur), а затем комплексный квадратный корень из треугольного фактора. Если существует вещественный квадратный корень, то вместо этого используется расширение этого метода [H87], который вычисляет вещественную форму Шура, а затем вещественный квадратный корень из квазитреугольного фактора.
Примеры
julia> A = [4 0; 0 4]
2×2 Matrix{Int64}:
4 0
0 4
julia> sqrt(A)
2×2 Matrix{Float64}:
2.0 0.0
0.0 2.0
Base.Math.cbrtМетод
cbrt(A::AbstractMatrix{<:Real})
Вычисляет вещественный кубический корень вещественной матрицы A. Если T = cbrt(A), то у нас есть T*T*T ≈ A, см. пример ниже.
Если A является симметричной, т. е. типа HermOrSym{<:Real}, для поиска кубического корня используется (eigen). В противном случае используется специализированная версия алгоритма p-ой степени [S03], которая использует вещественное разложение Шура (schur) для вычисления кубического корня.
Примеры
julia> A = [0.927524 -0.15857; -1.3677 -1.01172]
2×2 Matrix{Float64}:
0.927524 -0.15857
-1.3677 -1.01172
julia> T = cbrt(A)
2×2 Matrix{Float64}:
0.910077 -0.151019
-1.30257 -0.936818
julia> T*T*T ≈ A
true
Base.cosМетод
cos(A::AbstractMatrix)
Вычислите матричный косинус квадратной матрицы A.
Если A является симметричной или эрмитовой, для вычисления косинуса используется её собственное разложение (eigen). В противном случае косинус определяется вызовом exp.
Примеры
julia> cos(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.sinМетод
sin(A::AbstractMatrix)
Вычислите матринный синус квадратной матрицы A.
Если A является симметричной или эрмитовой, для вычисления синуса используется её собственное разложение (eigen). В противном случае синус определяется вызовом exp.
Примеры
julia> sin(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
0.454649 0.454649
0.454649 0.454649
Base.Math.sincosМетод
sincos(A::AbstractMatrix)
Вычислите матричный синус и косинус квадратной матрицы A.
Примеры
julia> S, C = sincos(fill(1.0, (2,2)));
julia> S
2×2 Matrix{Float64}:
0.454649 0.454649
0.454649 0.454649
julia> C
2×2 Matrix{Float64}:
0.291927 -0.708073
-0.708073 0.291927
Base.tanМетод
tan(A::AbstractMatrix)
Вычислите матричный тангенс квадратной матрицы A.
Если A является симметричной или эрмитовой, для вычисления тангенса используется её собственное разложение (eigen). В противном случае тангенс определяется вызовом exp.
Примеры
julia> tan(fill(1.0, (2,2)))
2×2 Matrix{Float64}:
-1.09252 -1.09252
-1.09252 -1.09252
Base.Math.secМетод
sec(A::AbstractMatrix)
Вычислите матричную секанс квадратной матрицы A.
Base.Math.cscМетод
csc(A::AbstractMatrix)
Вычислите матричную косеканс квадратной матрицы A.
Base.Math.cotМетод
cot(A::AbstractMatrix)
Вычислите матричный котангенс квадратной матрицы A.
Base.coshМетод
cosh(A::AbstractMatrix)
Вычислите гиперболический косинус матрицы квадратной матрицы A.
Base.sinhМетод
sinh(A::AbstractMatrix)
Вычислите гиперболический синус квадратной матрицы A.
Base.tanhМетод
tanh(A::AbstractMatrix)
Вычислите гиперболический тангенс квадратной матрицы A.
Base.Math.sechМетод
sech(A::AbstractMatrix)
Вычислите гиперболический секанс квадратной матрицы A.
Base.Math.cschМетод
csch(A::AbstractMatrix)
Вычислите гиперболический косеканс квадратной матрицы A.
Base.Math.cothМетод
coth(A::AbstractMatrix)
Вычислите гиперболический котангенс квадратной матрицы A.
Base.acosМетод
acos(A::AbstractMatrix)
Вычислите обратный косинус матрицы квадратной матрицы A.
Если A является симметричной или эрмитовой, используется её собственное разложение (eigen) для вычисления обратного косинуса. В противном случае обратный косинус определяется с помощью log и sqrt. Теория и логарифмические формулы, используемые для вычисления этой функции, см. в [AH16_1].
Примеры
julia> acos(cos([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5-8.32667e-17im 0.1+0.0im
-0.2+2.63678e-16im 0.3-3.46945e-16im
Base.asinМетод
asin(A::AbstractMatrix)
Вычислите обратный синус матрицы квадратной матрицы A.
Если A является симметричной или эрмитовой, используется её собственное разложение (eigen) для вычисления обратного синуса. В противном случае обратный синус определяется с помощью log и sqrt. Теория и логарифмические формулы, используемые для вычисления этой функции, см. в [AH16_2].
Примеры
julia> asin(sin([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5-4.16334e-17im 0.1-5.55112e-17im
-0.2+9.71445e-17im 0.3-1.249e-16im
Base.atanМетод
atan(A::AbstractMatrix)
Вычислите обратный тангенс квадратной матрицы A.
Если A является симметричной или эрмитовой, используется её собственное разложение (eigen) для вычисления обратного тангенса. В противном случае обратный тангенс определяется с помощью log. Теория и логарифмические формулы, используемые для вычисления этой функции, см. в [AH16_3].
Примеры
julia> atan(tan([0.5 0.1; -0.2 0.3]))
2×2 Matrix{ComplexF64}:
0.5+1.38778e-17im 0.1-2.77556e-17im
-0.2+6.93889e-17im 0.3-4.16334e-17im
Base.Math.asecМетод
asec(A::AbstractMatrix)
Вычислите обратный секанс матрицы A.
Base.Math.acscМетод
acsc(A::AbstractMatrix)
Вычислите обратный косеканс матрицы A.
Base.Math.acotМетод
acot(A::AbstractMatrix)
Вычислите обратный котангенс матрицы A.
Base.acoshМетод
acosh(A::AbstractMatrix)
Вычислите обратный гиперболический косинус квадратной матрицы A. Теория и логарифмические формулы, используемые для вычисления этой функции, см. в [AH16_4].
Base.asinhМетод
asinh(A::AbstractMatrix)
Вычислите обратный гиперболический синус квадратной матрицы A. Теория и логарифмические формулы, используемые для вычисления этой функции, см. в [AH16_5].
Base.atanhМетод
atanh(A::AbstractMatrix)
Вычислите обратный гиперболический тангенс квадратной матрицы A. Теория и логарифмические формулы, используемые для вычисления этой функции, см. в [AH16_6].
Base.Math.asechМетод
asech(A::AbstractMatrix)
Вычислите обратный гиперболический секанс матрицы A.
Base.Math.acschМетод
acsch(A::AbstractMatrix)
Вычислите обратный гиперболический косеканс матрицы A.
Base.Math.acothМетод
acoth(A::AbstractMatrix)
Вычислите обратный гиперболический котангенс матрицы A.
LinearAlgebra.lyapФункция
lyap(A, C)
Вычисляет решение X непрерывного уравнения Лиувилля AX + XA' + C = 0, где ни одна из собственных значений A не имеет нулевой действительной части, и никакие две собственные значения не являются отрицательными комплексными сопряжёнными друг друга.
Примеры
julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
3.0 4.0
5.0 6.0
julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
1.0 1.0
1.0 2.0
julia> X = lyap(A, B)
2×2 Matrix{Float64}:
0.5 -0.5
-0.5 0.25
julia> A*X + X*A' ≈ -B
true
LinearAlgebra.sylvesterФункция
sylvester(A, B, C)
Вычисляет решение X для уравнения Сильвестра AX + XB + C = 0, где A, B и C имеют совместимые размеры, и A и -B не имеют собственных значений с одинаковой действительной частью.
Примеры
julia> A = [3. 4.; 5. 6]
2×2 Matrix{Float64}:
3.0 4.0
5.0 6.0
julia> B = [1. 1.; 1. 2.]
2×2 Matrix{Float64}:
1.0 1.0
1.0 2.0
julia> C = [1. 2.; -2. 1]
2×2 Matrix{Float64}:
1.0 2.0
-2.0 1.0
julia> X = sylvester(A, B, C)
2×2 Matrix{Float64}:
-4.46667 1.93333
3.73333 -1.8
julia> A*X + X*B ≈ -C
true
LinearAlgebra.issuccessФункция
issuccess(F::Factorization)
Проверка успешности факторизации матрицы.
issuccess(::CholeskyPivoted) требует Julia 1.6 или новее.
Примеры
julia> F = cholesky([1 0; 0 1]); julia> issuccess(F) true
issuccess(F::LU; allowsingular = false)
Проверка успешности LU-факторизации матрицы. По умолчанию, факторизация, которая приводит к U-фактору с нулевым рангом, считается неудачной. Это можно изменить, передав allowsingular = true.
Ключевое слово-аргумент allowsingular был добавлен в Julia 1.11.
Примеры
julia> F = lu([1 2; 1 2], check = false); julia> issuccess(F) false julia> issuccess(F, allowsingular = true) true
LinearAlgebra.issymmetricФункция
issymmetric(A) -> Bool
Проверка, является ли матрица симметричной.
Примеры
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> issymmetric(a)
true
julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
1+0im 0+1im
0-1im 1+0im
julia> issymmetric(b)
false
LinearAlgebra.isposdefФункция
isposdef(A) -> Bool
Проверка, является ли матрица положительно определенной (и эрмитовой) путём попытки выполнить факторизацию Холецкого матрицы A.
См. также isposdef!, cholesky.
Примеры
julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
1 2
2 50
julia> isposdef(A)
true
LinearAlgebra.isposdef!Функция
isposdef!(A) -> Bool
Проверка, является ли матрица положительно определенной (и эрмитовой) путём попытки выполнить факторизацию Холецкого матрицы A, перезаписывая A в процессе. См. также isposdef.
Примеры
julia> A = [1. 2.; 2. 50.];
julia> isposdef!(A)
true
julia> A
2×2 Matrix{Float64}:
1.0 2.0
2.0 6.78233
LinearAlgebra.istrilФункция
istril(A::AbstractMatrix, k::Integer = 0) -> Bool
Проверка, является ли A нижней треугольной, начиная с k-ой наддиагонали.
Примеры
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> istril(a)
false
julia> istril(a, 1)
true
julia> c = [1 1 0; 1 1 1; 1 1 1]
3×3 Matrix{Int64}:
1 1 0
1 1 1
1 1 1
julia> istril(c)
false
julia> istril(c, 1)
true
LinearAlgebra.istriuФункция
istriu(A::AbstractMatrix, k::Integer = 0) -> Bool
Проверка, является ли A верхней треугольной, начиная с k-ой наддиагонали.
Примеры
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> istriu(a)
false
julia> istriu(a, -1)
true
julia> c = [1 1 1; 1 1 1; 0 1 1]
3×3 Matrix{Int64}:
1 1 1
1 1 1
0 1 1
julia> istriu(c)
false
julia> istriu(c, -1)
true
LinearAlgebra.isdiagФункция
isdiag(A) -> Bool
Проверка, является ли матрица диагональной в том смысле, что iszero(A[i,j]) истинно, за исключением случая i == j. Обратите внимание, что A не обязательно должна быть квадратной; если вам также нужно проверить, что это так, то необходимо проверить, что size(A, 1) == size(A, 2).
Примеры
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> isdiag(a)
false
julia> b = [im 0; 0 -im]
2×2 Matrix{Complex{Int64}}:
0+1im 0+0im
0+0im 0-1im
julia> isdiag(b)
true
julia> c = [1 0 0; 0 2 0]
2×3 Matrix{Int64}:
1 0 0
0 2 0
julia> isdiag(c)
true
julia> d = [1 0 0; 0 2 3]
2×3 Matrix{Int64}:
1 0 0
0 2 3
julia> isdiag(d)
false
LinearAlgebra.ishermitianФункция
ishermitian(A) -> Bool
Проверка, является ли матрица эрмитовой.
Примеры
julia> a = [1 2; 2 -1]
2×2 Matrix{Int64}:
1 2
2 -1
julia> ishermitian(a)
true
julia> b = [1 im; -im 1]
2×2 Matrix{Complex{Int64}}:
1+0im 0+1im
0-1im 1+0im
julia> ishermitian(b)
true
Base.transposeФункция
transpose(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 # the transpose of a transpose unwraps the parent
true
julia> Transpose(B) # however, the constructor always wraps its argument
2×2 transpose(transpose(::Matrix{Int64})) with eltype Int64:
3 2
0 0
julia> B[1,2] = 4; # modifying B will modify A automatically
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
transpose AbstractVector — это строка-вектор:
julia> v = [1,2,3]
3-element Vector{Int64}:
1
2
3
julia> transpose(v) # returns a row-vector
1×3 transpose(::Vector{Int64}) with eltype Int64:
1 2 3
julia> transpose(v) * v # compute the dot product
14
Для матрицы матриц отдельные блоки обрабатываются рекурсивно:
julia> C = [1 3; 2 4]
2×2 Matrix{Int64}:
1 3
2 4
julia> D = reshape([C, 2C, 3C, 4C], 2, 2) # construct a block matrix
2×2 Matrix{Matrix{Int64}}:
[1 3; 2 4] [3 9; 6 12]
[2 6; 4 8] [4 12; 8 16]
julia> transpose(D) # blocks are recursively transposed
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!Функция
transpose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
Транспонирует матрицу A и сохраняет её в матрице X. size(X) должно быть равно size(transpose(A)). Дополнительная память не выделяется, кроме изменения размеров rowval и nzval у X, если необходимо.
См. halfperm!
transpose!(dest,src)
Транспонирует массив src и сохраняет результат в предварительно выделенном массиве dest, размер которого должен соответствовать (size(src,2),size(src,1)). Поддержка транспонирования на месте не реализована, и могут возникнуть неожиданные результаты, если src и dest имеют перекрывающиеся области памяти.
Примеры
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
0+0im 0+0im
0+0im 0+0im
julia> transpose!(B, A);
julia> B
2×2 Matrix{Complex{Int64}}:
3+2im 8+7im
9+2im 4+6im
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
LinearAlgebra.TransposeТип
Transpose
Ленивая оболочка для представления транспонированной подлежащей линейной алгебраической структуры, обычно AbstractVector/AbstractMatrix. Обычно конструктор Transpose не следует вызывать напрямую, используйте transpose вместо этого. Для материализации представления используйте copy.
Этот тип предназначен для использования в линейной алгебре — для общих операций с данными см. permutedims.
Примеры
julia> A = [2 3; 0 0]
2×2 Matrix{Int64}:
2 3
0 0
julia> Transpose(A)
2×2 transpose(::Matrix{Int64}) with eltype Int64:
2 0
3 0
LinearAlgebra.TransposeFactorizationТип
TransposeFactorization
Ленивая оболочка для транспонирования подлежащего объекта Factorization. Обычно конструктор TransposeFactorization не следует вызывать напрямую, используйте transpose(:: Factorization) вместо этого.
Base.adjointФункция
A' 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' # equivalently 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 # the adjoint of an adjoint unwraps the parent
true
julia> Adjoint(B) # however, the constructor always wraps its argument
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; # modifying B will modify A automatically
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 # compute the dot product, equivalently 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!Функция
adjoint!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}
Транспонирует матрицу A и сохраняет сопряжённые транспонированные элементы в матрице X. size(X) должно быть равно size(transpose(A)). Дополнительная память не выделяется, кроме изменения размеров rowval и nzval у X, если необходимо.
См. halfperm!
adjoint!(dest,src)
Сопряжённо транспонирует массив src и сохраняет результат в предварительно выделенном массиве dest, размер которого должен соответствовать (size(src,2),size(src,1)). Поддержка транспонирования на месте не реализована, и могут возникнуть неожиданные результаты, если src и dest имеют перекрывающиеся области памяти.
Примеры
julia> A = [3+2im 9+2im; 8+7im 4+6im]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
julia> B = zeros(Complex{Int64}, 2, 2)
2×2 Matrix{Complex{Int64}}:
0+0im 0+0im
0+0im 0+0im
julia> adjoint!(B, A);
julia> B
2×2 Matrix{Complex{Int64}}:
3-2im 8-7im
9-2im 4-6im
julia> A
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
8+7im 4+6im
LinearAlgebra.AdjointТип
Adjoint
Ленивая оболочка для представления сопряжённого транспонирования подлежащего объекта линейной алгебры, обычно AbstractVector/AbstractMatrix. Обычно конструктор Adjoint не следует вызывать напрямую, используйте adjoint вместо этого. Для материализации представления используйте copy.
Этот тип предназначен для использования в линейной алгебре — для общих операций с данными см. permutedims.
Примеры
julia> A = [3+2im 9+2im; 0 0]
2×2 Matrix{Complex{Int64}}:
3+2im 9+2im
0+0im 0+0im
julia> Adjoint(A)
2×2 adjoint(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
3-2im 0+0im
9-2im 0+0im
LinearAlgebra.AdjointFactorizationТип
AdjointFactorization
Ленивая оболочка для сопряжённого транспонирования подлежащего объекта Factorization. Обычно конструктор AdjointFactorization не следует вызывать напрямую, используйте adjoint(:: Factorization) вместо этого.
Base.copyМетод
copy(A::Transpose) copy(A::Adjoint)
Вычисляет транспонирование/сопряжённое транспонирование матрицы. Обратите внимание, что транспонирование применяется рекурсивно к элементам.
Эта операция предназначена для использования в линейной алгебре — для общих операций с данными см. permutedims, которая не является рекурсивной.
Примеры
julia> A = [1 2im; -3im 4]
2×2 Matrix{Complex{Int64}}:
1+0im 0+2im
0-3im 4+0im
julia> T = transpose(A)
2×2 transpose(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
1+0im 0-3im
0+2im 4+0im
julia> copy(T)
2×2 Matrix{Complex{Int64}}:
1+0im 0-3im
0+2im 4+0im
LinearAlgebra.stride1Функция
stride1(A) -> Int
Возвращает расстояние между последовательными элементами массива в первом измерении в единицах размера элемента.
Примеры
julia> A = [1,2,3,4]
4-element Vector{Int64}:
1
2
3
4
julia> LinearAlgebra.stride1(A)
1
julia> B = view(A, 2:2:4)
2-element view(::Vector{Int64}, 2:2:4) with eltype Int64:
2
4
julia> LinearAlgebra.stride1(B)
2
LinearAlgebra.checksquareФункция
LinearAlgebra.checksquare(A)
Проверяет, является ли матрица квадратной, и возвращает размер. Для нескольких аргументов возвращает вектор.
Примеры
julia> A = fill(1, (4,4)); B = fill(1, (5,5));
julia> LinearAlgebra.checksquare(A, B)
2-element Vector{Int64}:
4
5
LinearAlgebra.peakflopsФункция
LinearAlgebra.peakflops(n::Integer=4096; eltype::DataType=Float64, ntrials::Integer=3, parallel::Bool=false)
peakflops вычисляет пиковую скорость FLOPS компьютера, используя двойную точность gemm!. По умолчанию, если не указаны аргументы, она перемножает две Float64 матрицы размера n x n, где n = 4096. Если используемый BLAS использует несколько потоков, достигается более высокая скорость FLOPS. Количество потоков BLAS можно настроить с помощью BLAS.set_num_threads(n).
Если предоставлен ключевой аргумент eltype, peakflops создаст матрицы с элементами типа eltype для вычисления пиковой скорости FLOPS.
По умолчанию peakflops использует лучшее время из 3 попыток. Если указан ключевой аргумент ntrials, peakflops будет использовать указанное количество попыток для выбора лучшего времени.
Если ключевой аргумент parallel установлен в true, peakflops выполняется параллельно на всех процессорах. Возвращается скорость FLOPS всего параллельного компьютера. При параллельном выполнении используется только 1 поток BLAS. Аргумент n по-прежнему относится к размеру задачи, решаемой на каждом процессоре.
Эта функция требует по крайней мере Julia 1.1. В Julia 1.0 она доступна из стандартной библиотеки InteractiveUtils.
LinearAlgebra.hermitianpartФункция
hermitianpart(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
Возвращает эрмитову часть квадратной матрицы A, определённую как (A + A') / 2, как матрицу Hermitian. Для вещественных матриц A это также известно как симметричная часть A; иногда это также называют «вещественной частью оператора». Необязательный аргумент uplo управляет соответствующим аргументом представления Hermitian. Для вещественных матриц последнее эквивалентно представлению Symmetric.
См. также hermitianpart! для соответствующей операции на месте.
Эта функция требует Julia 1.10 или более поздней версии.
LinearAlgebra.hermitianpart!Функция
hermitianpart!(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian
Заменяет квадратную матрицу A на месте её эрмитовой частью (A + A') / 2 и возвращает Hermitian(A, uplo). Для вещественных матриц A это также известно как симметричная часть A.
См. также hermitianpart для соответствующей операции вне места.
Эта функция требует Julia 1.10 или более поздней версии.
LinearAlgebra.copy_adjoint!Функция
copy_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!Функция
copy_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!.
Операции с матрицами низкого уровня
Во многих случаях существуют оперативные версии операций с матрицами, которые позволяют вам предоставить предварительно выделенный выходной вектор или матрицу. Это полезно при оптимизации критических участков кода для избегания накладных расходов на многократное выделение. Эти операции на месте помечены суффиксом ! ниже (например, mul!) в соответствии с обычной конвенцией Julia.
LinearAlgebra.mul!Функция
mul!(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
Реализация
Для пользовательских типов матриц и векторов рекомендуется реализовывать 5-аргументную функцию mul! вместо прямой реализации 3-аргументной функции mul!, если это возможно.
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]; # A copy of the original value of C
julia> C == A * B * α + C_original * β
true
LinearAlgebra.lmul!Функция
lmul!(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.0
LinearAlgebra.rmul!Функция
rmul!(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.0
LinearAlgebra.ldiv!Функция
ldiv!(Y, A, B) -> Y
Вычисляет A \ B на месте и сохраняет результат в Y, возвращая результат.
Аргумент A не должен быть матрицей. Вместо матриц должен быть объект факторизации (например, созданный функциями factorize или cholesky). Причина в том, что сама факторизация является дорогостоящей и обычно выделяет память (хотя это также можно сделать на месте, например, с помощью lu!), а в критически важных для производительности ситуациях, требующих ldiv!, обычно также требуется тонкий контроль факторизации A.
Разрешены некоторые структуры типов матриц, такие как Diagonal и UpperTriangular, так как они уже находятся в факторизованной форме.
Примеры
julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2]; julia> X = [1; 2.5; 3]; julia> Y = zero(X); julia> ldiv!(Y, qr(A), X); julia> Y ≈ A\X true
ldiv!(A, B)
Вычисляет A \ B на месте, перезаписывая B для хранения результата.
Аргумент A не должен быть матрицей. Вместо матриц должен быть объект факторизации (например, созданный функциями factorize или cholesky). Причина в том, что сама факторизация является дорогостоящей и обычно выделяет память (хотя это также можно сделать на месте, например, с помощью lu!), а в критически важных для производительности ситуациях, требующих ldiv!, обычно также требуется тонкий контроль факторизации A.
Разрешены некоторые структуры типов матриц, такие как Diagonal и UpperTriangular, так как они уже находятся в факторизованной форме.
Примеры
julia> A = [1 2.2 4; 3.1 0.2 3; 4 1 2]; julia> X = [1; 2.5; 3]; julia> Y = copy(X); julia> ldiv!(qr(A), X); julia> X ≈ A\Y true
ldiv!(a::Number, B::AbstractArray)
Делит каждый элемент массива B на скаляр a, перезаписывая B на месте. Используйте rdiv! для деления скаляра справа.
Примеры
julia> B = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> ldiv!(2.0, B)
2×2 Matrix{Float64}:
0.5 1.0
1.5 2.0ldiv!(A::Tridiagonal, B::AbstractVecOrMat) -> B
Вычисляет A \ B на месте методом Гаусса с частичным выбором главного элемента и сохраняет результат в B, возвращая результат. При этом также перезаписываются диагональные элементы A.
ldiv! для Tridiagonal левых сторон требует, как минимум, Julia 1.11.
LinearAlgebra.rdiv!Функция
rdiv!(A, B)
Вычисляет A / B на месте, перезаписывая A для хранения результата.
Аргумент B не должен быть матрицей. Вместо матриц должен быть объект факторизации (например, созданный функциями factorize или cholesky). Причина в том, что сама факторизация является дорогостоящей и обычно выделяет память (хотя это также можно сделать на месте, например, с помощью lu!), а в критически важных для производительности ситуациях, требующих rdiv!, обычно также требуется тонкий контроль факторизации B.
Разрешены некоторые структуры типов матриц, такие как Diagonal и UpperTriangular, так как они уже находятся в факторизованной форме
rdiv!(A::AbstractArray, b::Number)
Разделите каждое значение в массиве A на скаляр b, перезаписывая A значения на месте. Используйте ldiv! для деления скаляра слева.
Примеры
julia> A = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
1.0 2.0
3.0 4.0
julia> rdiv!(A, 2.0)
2×2 Matrix{Float64}:
0.5 1.0
1.5 2.0Функции BLAS
В Julia (как и во многих научных вычислениях) операции с плотной линейной алгеброй основаны на библиотеке LAPACK, которая, в свою очередь, построена на основе основных блоков линейной алгебры, известных как BLAS. Существуют высокооптимизированные реализации BLAS для каждой компьютерной архитектуры, и иногда в высокопроизводительных линейно-алгебраических процедурах полезно вызывать функции BLAS напрямую.
LinearAlgebra.BLAS предоставляет обёртки для некоторых функций BLAS. Те функции BLAS, которые перезаписывают один из входных массивов, имеют имена, заканчивающиеся на '!'. Обычно функция BLAS имеет четыре метода, определённых для массивов Float32, Float64, ComplexF32 и ComplexF64.
Символьные аргументы BLAS
Многие функции BLAS принимают аргументы, определяющие, нужно ли транспонировать аргумент (trans), какой треугольник матрицы ссылаться (uplo или ul), можно ли предположить, что диагональ треугольной матрицы состоит из единиц (dA) или на какой стороне матричного умножения находится входной аргумент (side). Возможные варианты:
Порядок умножения
side |
Значение |
|---|---|
'L' |
Аргумент находится с левой стороны матрично-матричной операции. |
'R' |
Аргумент находится с правой стороны матрично-матричной операции. |
Ссылка на треугольник
uplo/ul
|
Значение |
|---|---|
'U' |
Будет использоваться только верхний треугольник матрицы. |
'L' |
Будет использоваться только нижний треугольник матрицы. |
Операция транспонирования
trans/tX
|
Значение |
|---|---|
'N' |
Входная матрица X не транспонируется и не сопрягается. |
'T' |
Входная матрица X будет транспонирована. |
'C' |
Входная матрица X будет сопряжена и транспонирована. |
Единичная диагональ
diag/dX
|
Значение |
|---|---|
'N' |
Будут считаны значения диагонали матрицы X. |
'U' |
Диагональ матрицы X предполагается состоящей из единиц. |
LinearAlgebra.BLASМодуль
Интерфейс к подпрограммам BLAS.
LinearAlgebra.BLAS.set_num_threadsФункция
set_num_threads(n::Integer) set_num_threads(::Nothing)
Установить количество потоков, которое должна использовать библиотека BLAS, равное n::Integer.
Также принимает nothing, в этом случае Julia пытается угадать значение по умолчанию. Передача nothing не рекомендуется и в основном существует по историческим причинам.
LinearAlgebra.BLAS.get_num_threadsФункция
get_num_threads()
Получить количество потоков, используемых библиотекой BLAS.
get_num_threads требует по крайней мере Julia 1.6.
Функции BLAS можно разделить на три группы, также называемые тремя уровнями, в зависимости от того, когда они были впервые предложены, типа входных параметров и сложности операции.
Функции BLAS первого уровня
Функции BLAS первого уровня были впервые предложены в [(Lawson, 1979)][Lawson-1979] и определяют операции между скалярами и векторами.
[Lawson-1979]: https://dl.acm.org/doi/10.1145/355841.355847
LinearAlgebra.BLAS.rot!Функция
rot!(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!Функция
scal!(n, a, X, incx) scal!(a, X)
Перезаписать X с a*X для первых n элементов массива X с шагом incx. Возвращает X.
Если n и incx не предоставлены, используются length(X) и stride(X,1).
LinearAlgebra.BLAS.scalФункция
scal(n, a, X, incx) scal(a, X)
Возвращает X, умноженное на a, для первых n элементов массива X с шагом incx.
Если n и incx не предоставлены, используются length(X) и stride(X,1).
LinearAlgebra.BLAS.blascopy!Функция
blascopy!(n, X, incx, Y, incy)
Скопировать n элементов массива X с шагом incx в массив Y с шагом incy. Возвращает Y.
LinearAlgebra.BLAS.dotФункция
dot(n, X, incx, Y, incy)
Скалярное произведение двух векторов, состоящих из n элементов массива X с шагом incx и n элементов массива Y с шагом incy.
Примеры
julia> BLAS.dot(10, fill(1.0, 10), 1, fill(1.0, 20), 2) 10.0
LinearAlgebra.BLAS.dotuФункция
dotu(n, X, incx, Y, incy)
Функция скалярного произведения для двух комплексных векторов, состоящих из n элементов массива X с шагом incx и n элементов массива Y с шагом incy.
Примеры
julia> BLAS.dotu(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2) -10.0 + 10.0im
LinearAlgebra.BLAS.dotcФункция
dotc(n, X, incx, U, incy)
Функция скалярного произведения для двух комплексных векторов, состоящих из n элементов массива X с шагом incx и n элементов массива U с шагом incy, сопрягая первый вектор.
Примеры
julia> BLAS.dotc(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2) 10.0 - 10.0im
LinearAlgebra.BLAS.nrm2Функция
nrm2(n, X, incx)
2-норма вектора, состоящего из n элементов массива X с шагом incx.
Примеры
julia> BLAS.nrm2(4, fill(1.0, 8), 2) 2.0 julia> BLAS.nrm2(1, fill(1.0, 8), 2) 1.0
LinearAlgebra.BLAS.asumФункция
asum(n, X, incx)
Сумма модулей первых n элементов массива X с шагом incx.
Для вещественного массива модуль — это абсолютное значение. Для комплексного массива модуль — это сумма абсолютных значений действительной и мнимой частей.
Примеры
julia> BLAS.asum(5, fill(1.0im, 10), 2) 5.0 julia> BLAS.asum(2, fill(1.0im, 10), 5) 2.0
LinearAlgebra.BLAS.iamaxФункция
iamax(n, dx, incx) iamax(dx)
Найти индекс элемента dx с максимальным абсолютным значением. n — длина dx, а incx — шаг. Если n и incx не указаны, они принимают значения по умолчанию n=length(dx) и incx=stride1(dx).
Функции BLAS второго уровня
Функции BLAS второго уровня были опубликованы в [(Dongarra, 1988)][Dongarra-1988] и определяют операции матрица-вектор.
[Dongarra-1988]: https://dl.acm.org/doi/10.1145/42288.42291
вернуть вектор
LinearAlgebra.BLAS.gemv!Функция
gemv!(tA, alpha, A, x, beta, y)
Обновить вектор y как alpha*A*x + beta*y или alpha*A'x + beta*y в соответствии с tA. alpha и beta являются скалярами. Вернуть обновлённый y.
LinearAlgebra.BLAS.gemvМетод
gemv(tA, alpha, A, x)
Вернуть alpha*A*x или alpha*A'x в соответствии с tA. alpha является скаляром.
LinearAlgebra.BLAS.gemvМетод
gemv(tA, A, x)
Вернуть A*x или A'x в соответствии с tA.
LinearAlgebra.BLAS.gbmv!Функция
gbmv!(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Функция
gbmv(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!Функция
hemv!(ul, alpha, A, x, beta, y)
Обновить вектор y как alpha*A*x + beta*y. A предполагается эрмитовой. Используется только ul треугольник A. alpha и beta являются скалярами. Вернуть обновлённый y.
LinearAlgebra.BLAS.hemvМетод
hemv(ul, alpha, A, x)
Вернуть alpha*A*x. A предполагается эрмитовой. Используется только ul треугольник A. alpha является скаляром.
LinearAlgebra.BLAS.hemvМетод
hemv(ul, A, x)
Вернуть A*x. A предполагается эрмитовой. Используется только ul треугольник A.
LinearAlgebra.BLAS.hpmv!Функция
hpmv!(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!Функция
symv!(ul, alpha, A, x, beta, y)
Обновить вектор y как alpha*A*x + beta*y. A предполагается симметричной. Используется только ul треугольник A. alpha и beta являются скалярами. Вернуть обновлённый y.
LinearAlgebra.BLAS.symvМетод
symv(ul, alpha, A, x)
Вернуть alpha*A*x. A предполагается симметричной. Используется только ul треугольник A. alpha является скаляром.
LinearAlgebra.BLAS.symvМетод
symv(ul, A, x)
Вернуть A*x. A предполагается симметричной. Используется только ul треугольник A.
LinearAlgebra.BLAS.sbmv!Функция
sbmv!(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Метод
sbmv(uplo, k, alpha, A, x)
Вернуть alpha*A*x, где A — симметричная полосовая матрица порядка size(A,2) с k наддиагоналями, хранящимися в аргументе A. Используется только uplo треугольник A.
LinearAlgebra.BLAS.sbmvМетод
sbmv(uplo, k, A, x)
Вернуть A*x, где A — симметричная полосовая матрица порядка size(A,2) с k наддиагоналями, хранящимися в аргументе A. Используется только uplo треугольник A.
LinearAlgebra.BLAS.spmv!Функция
spmv!(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!Функция
trmv!(ul, tA, dA, A, b)
Вернуть op(A)*b, где op определяется tA. Используется только ul треугольник A. dA определяет, считываются ли значения диагоналей или предполагаются равными единице. Умножение происходит на месте в b.
LinearAlgebra.BLAS.trmvФункция
trmv(ul, tA, dA, A, b)
Вернуть op(A)*b, где op определяется tA. Используется только ul треугольник A. dA определяет, считываются ли значения диагоналей или предполагаются равными единице.
LinearAlgebra.BLAS.trsv!Функция
trsv!(ul, tA, dA, A, b)
Перезапишите b решением для A*x = b или одним из двух других вариантов, определяемых tA и ul. dA определяет, читаются ли диагональные значения или предполагается, что они все равны единице. Верните обновлённую b.
LinearAlgebra.BLAS.trsvФункция
trsv(ul, tA, dA, A, b)
Вернуть решение для A*x = b или один из двух других вариантов, определяемых tA и ul. dA определяет, читаются ли диагональные значения или предполагается, что они все равны единице.
вернуть матрицу
LinearAlgebra.BLAS.ger!Функция
ger!(alpha, x, y, A)
Обновление матрицы A ранга 1 векторами x и y как alpha*x*y' + A.
LinearAlgebra.BLAS.her!Функция
her!(uplo, alpha, x, A)
Методы только для комплексных массивов. Обновление эрмитовой матрицы A ранга 1 вектором x как alpha*x*x' + A. uplo управляет тем, какой треугольник A обновляется. Возвращает A.
LinearAlgebra.BLAS.syr!Функция
syr!(uplo, alpha, x, A)
Обновление симметричной матрицы A ранга 1 вектором x как alpha*x*transpose(x) + A. uplo управляет тем, какой треугольник A обновляется. Возвращает A.
LinearAlgebra.BLAS.spr!Функция
spr!(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.
Функции BLAS уровня 3
Функции BLAS уровня 3 были опубликованы в [(Dongarra, 1990)][Dongarra-1990] и определяют операции над матрицами.
[Dongarra-1990]: https://dl.acm.org/doi/10.1145/77626.79170
LinearAlgebra.BLAS.gemmt!Функция
gemmt!(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Метод
gemmt(uplo, tA, tB, alpha, A, B)
Возвращает нижнюю или верхнюю треугольную часть, указанную uplo матрицы A*B или другие три варианта в соответствии с tA и tB.
gemmt требует как минимум Julia 1.11.
LinearAlgebra.BLAS.gemmtМетод
gemmt(uplo, tA, tB, A, B)
Возвращает нижнюю или верхнюю треугольную часть, указанную uplo матрицы A*B или другие три варианта в соответствии с tA и tB.
gemmt требует как минимум Julia 1.11.
LinearAlgebra.BLAS.gemm!Функция
gemm!(tA, tB, alpha, A, B, beta, C)
Обновляет C как alpha*A*B + beta*C или другие три варианта в соответствии с tA и tB. Возвращает обновлённую C.
LinearAlgebra.BLAS.gemmМетод
gemm(tA, tB, alpha, A, B)
Возвращает alpha*A*B или другие три варианта в соответствии с tA и tB.
LinearAlgebra.BLAS.gemmМетод
gemm(tA, tB, A, B)
Возвращает A*B или другие три варианта в соответствии с tA и tB.
LinearAlgebra.BLAS.symm!Функция
symm!(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Метод
symm(side, ul, alpha, A, B)
Возвращает alpha*A*B или alpha*B*A в соответствии с side. A предполагается симметричным. Используется только треугольник ul A.
LinearAlgebra.BLAS.symmМетод
symm(side, ul, A, B)
Возвращает A*B или B*A в соответствии с side. A предполагается симметричным. Используется только треугольник ul A.
LinearAlgebra.BLAS.hemm!Функция
hemm!(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Метод
hemm(side, ul, alpha, A, B)
Возвращает alpha*A*B или alpha*B*A в соответствии с side. A предполагается эрмитовым. Используется только треугольник ul A.
LinearAlgebra.BLAS.hemmМетод
hemm(side, ul, A, B)
Возвращает A*B или B*A в соответствии с side. A предполагается эрмитовым. Используется только треугольник ul A.
LinearAlgebra.BLAS.syrk!Функция
syrk!(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Функция
syrk(uplo, trans, alpha, A)
Возвращает либо верхнюю, либо нижнюю треугольную часть A в соответствии с uplo для alpha*A*transpose(A) или alpha*transpose(A)*A в соответствии с trans.
LinearAlgebra.BLAS.herk!Функция
herk!(uplo, trans, alpha, A, beta, C)
Только для комплексных массивов. Обновление эрмитовой матрицы C как alpha*A*A' + beta*C или alpha*A'*A + beta*C в соответствии с trans. Обновляется только треугольник uplo C. Возвращает C.
LinearAlgebra.BLAS.herkФункция
herk(uplo, trans, alpha, A)
Методы только для комплексных массивов. Возвращает uplo треугольник alpha*A*A' или alpha*A'*A, в соответствии с trans.
LinearAlgebra.BLAS.syr2k!Функция
syr2k!(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Функция
syr2k(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!Функция
her2k!(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Функция
her2k(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!Функция
trmm!(side, ul, tA, dA, alpha, A, B)
Обновляет B как alpha*A*B или один из других трех вариантов, определяемых side и tA. Используется только ul треугольник A. dA определяет, считываются ли диагональные значения или предполагается, что они все равны единице. Возвращает обновлённую B.
LinearAlgebra.BLAS.trmmФункция
trmm(side, ul, tA, dA, alpha, A, B)
Возвращает alpha*A*B или один из других трех вариантов, определяемых side и tA. Используется только ul треугольник A. dA определяет, считываются ли диагональные значения или предполагается, что они все равны единице.
LinearAlgebra.BLAS.trsm!Функция
trsm!(side, ul, tA, dA, alpha, A, B)
Перезаписывает B решением A*X = alpha*B или одним из трех других вариантов, определяемых side и tA. Используется только ul треугольник A. dA определяет, считываются ли диагональные значения или предполагается, что они все равны единице. Возвращает обновлённую B.
LinearAlgebra.BLAS.trsmФункция
trsm(side, ul, tA, dA, alpha, A, B)
Возвращает решение A*X = alpha*B или один из трех других вариантов, определяемых side и tA. Используется только ul треугольник A. dA определяет, считываются ли диагональные значения или предполагается, что они все равны единице.
Функции LAPACK
LinearAlgebra.LAPACK предоставляет обёртки для некоторых функций LAPACK для линейной алгебры. Функции, которые перезаписывают один из входных массивов, имеют имена, заканчивающиеся '!'.
Обычно функция определяет 4 метода, по одному для Float64, Float32, ComplexF64 и ComplexF32 массивов.
Обратите внимание, что API LAPACK, предоставляемый Julia, может и будет изменяться в будущем. Поскольку этот API не предназначен для пользователя, нет обязательств по поддержке/устареванию этого набора функций в будущих выпусках.
LinearAlgebra.LAPACKМодуль
Интерфейсы к подпрограммам LAPACK.
LinearAlgebra.LAPACK.gbtrf!Функция
gbtrf!(kl, ku, m, AB) -> (AB, ipiv)
Вычисление LU-разложения полосовой матрицы AB. kl — это первая поддиагональ, содержащая ненулевую полосу, ku — последняя наддиагональ, содержащая ненулевую полосу, а m — первая размерность матрицы AB. Возвращает LU-разложение на месте и ipiv, вектор используемых поворотов.
LinearAlgebra.LAPACK.gbtrs!Функция
gbtrs!(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!Функция
gebal!(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!Функция
gebak!(job, side, ilo, ihi, scale, V)
Преобразование собственных векторов V матрицы, сбалансированной с помощью gebal!, в несбалансированные/непереставленные собственные векторы исходной матрицы. Изменяет V на месте. side может быть L (преобразуются левые собственные векторы) или R (преобразуются правые собственные векторы).
LinearAlgebra.LAPACK.gebrd!Функция
gebrd!(A) -> (A, d, e, tauq, taup)
Приводит A на месте к бидиагональной форме A = QBP'. Возвращает A, содержащую бидиагональную матрицу B; d, содержащую диагональные элементы B; e, содержащую внедиагональные элементы B; tauq, содержащую элементарные отражения, представляющие Q; и taup, содержащую элементарные отражения, представляющие P.
LinearAlgebra.LAPACK.gelqf!Функция
gelqf!(A, tau)
Вычисление LQ факторизации A, A = LQ. tau содержит скаляры, которые параметризуют элементарные отражения факторизации. tau должна иметь длину, большую или равную наименьшей размерности A.
Возвращает A и tau, изменённые на месте.
gelqf!(A) -> (A, tau)
Вычисление LQ факторизации A, A = LQ.
Возвращает A, изменённое на месте, и tau, содержащее скаляры, которые параметризуют элементарные отражения факторизации.
LinearAlgebra.LAPACK.geqlf!Функция
geqlf!(A, tau)
Вычислить QL факторизацию A, A = QL. tau содержит скаляры, которые параметризуют элементарные отражения факторизации. tau должен иметь длину не меньше наименьшей размерности A.
Возвращает A и tau, изменённые на месте.
geqlf!(A) -> (A, tau)
Вычислить QL факторизацию A, A = QL.
Возвращает A, изменённый на месте, и tau, который содержит скаляры, которые параметризуют элементарные отражения факторизации.
LinearAlgebra.LAPACK.geqrf!Функция
geqrf!(A, tau)
Вычислить QR факторизацию A, A = QR. tau содержит скаляры, которые параметризуют элементарные отражения факторизации. tau должен иметь длину не меньше наименьшей размерности A.
Возвращает A и tau, изменённые на месте.
geqrf!(A) -> (A, tau)
Вычислить QR факторизацию A, A = QR.
Возвращает A, изменённый на месте, и tau, который содержит скаляры, которые параметризуют элементарные отражения факторизации.
LinearAlgebra.LAPACK.geqp3!Функция
geqp3!(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!Функция
gerqf!(A, tau)
Вычислить RQ факторизацию A, A = RQ. tau содержит скаляры, которые параметризуют элементарные отражения факторизации. tau должен иметь длину не меньше наименьшей размерности A.
Возвращает A и tau, изменённые на месте.
gerqf!(A) -> (A, tau)
Вычислить RQ факторизацию A, A = RQ.
Возвращает A, изменённый на месте, и tau, который содержит скаляры, которые параметризуют элементарные отражения факторизации.
LinearAlgebra.LAPACK.geqrt!Функция
geqrt!(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!Функция
geqrt3!(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!Функция
getrf!(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!Функция
tzrzf!(A) -> (A, tau)
Преобразует верхнетреугольную матрицу A в верхнетреугольную форму на месте. Возвращает A и tau, скалярные параметры элементарных отражений преобразования.
LinearAlgebra.LAPACK.ormrz!Функция
ormrz!(side, trans, A, tau, C)
Умножает матрицу C на Q слева (side = L, Q*C) или справа (side = R, C*Q) с использованием преобразования, заданного tzrzf!. C может быть не модифицирована (trans = N), транспонирована (trans = T) или сопряжённо транспонирована (trans = C). Возвращает матрицу C, которая изменяется на месте с результатом умножения.
LinearAlgebra.LAPACK.gels!Функция
gels!(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!Функция
gesv!(A, B) -> (B, A, ipiv)
Решает линейное уравнение A * X = B, где A — квадратная матрица, используя LU факторизацию A. A перезаписывается с её LU факторизацией, а B перезаписывается с решением X. ipiv содержит информацию о выборе пивот-элементов для LU факторизации A.
LinearAlgebra.LAPACK.getrs!Функция
getrs!(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!Функция
getri!(A, ipiv)
Вычисляет обратную матрицу A, используя её LU факторизацию, полученную с помощью getrf!. ipiv — информация о выборе пивот-элементов, а A содержит LU факторизацию getrf!. A перезаписывается своей обратной матрицей.
LinearAlgebra.LAPACK.gesvx!Функция
gesvx!(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!Функция
gelsd!(A, B, rcond) -> (B, rnk)
Вычисляет решение наименьшей нормы уравнения A * X = B, найдя факторизацию SVD матрицы A, а затем, используя метод «разделяй и властвуй». Матрица B перезаписывается решением X. Сингулярные значения меньше rcond будут считаться нулевыми. Возвращает решение в B и эффективный ранг матрицы A в rnk.
LinearAlgebra.LAPACK.gelsy!Функция
gelsy!(A, B, rcond) -> (B, rnk)
Вычисляет решение наименьшей нормы уравнения A * X = B, найдя полную факторизацию QR матрицы A, а затем, используя метод «разделяй и властвуй». Матрица B перезаписывается решением X. Сингулярные значения меньше rcond будут считаться нулевыми. Возвращает решение в B и эффективный ранг матрицы A в rnk.
LinearAlgebra.LAPACK.gglse!Функция
gglse!(A, c, B, d) -> (X,res)
Решает уравнение A * x = c, где x подчиняется ограничению равенства B * x = d. Использует формулу ||c - A*x||^2 = 0 для решения. Возвращает X и остаточную сумму квадратов.
LinearAlgebra.LAPACK.geev!Функция
geev!(jobvl, jobvr, A) -> (W, VL, VR)
Находит собственную систему матрицы A. Если jobvl = N, собственные левые векторы матрицы A не вычисляются. Если jobvr = N, собственные правые векторы матрицы A не вычисляются. Если jobvl = V или jobvr = V, соответствующие собственные векторы вычисляются. Возвращает собственные значения в W, правые собственные векторы в VR и левые собственные векторы в VL.
LinearAlgebra.LAPACK.gesdd!Функция
gesdd!(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!Функция
gesvd!(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!Функция
ggsvd!(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!Функция
ggsvd3!(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!Функция
geevx!(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!Функция
ggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)
Находит обобщённое разложение собственных векторов матриц A и B. Если jobvl = N, левые собственные векторы не вычисляются. Если jobvr = N, правые собственные векторы не вычисляются. Если jobvl = V или jobvr = V, соответствующие собственные векторы вычисляются.
LinearAlgebra.LAPACK.ggev3!Функция
ggev3!(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!Функция
gtsv!(dl, d, du, B)
Решает уравнение A * X = B, где A — треугольная матрица с dl на побочной диагонали, d на главной диагонали и du на наддиагонали.
Заменяет B решением X и возвращает его.
LinearAlgebra.LAPACK.gttrf!Функция
gttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)
Находит факторизацию LU треугольной матрицы с dl на побочной диагонали, d на главной диагонали и du на наддиагонали.
Изменяет dl, d и du на месте и возвращает их, а также вторую наддиагональ du2 и вектор перестановки ipiv.
LinearAlgebra.LAPACK.gttrs!Функция
gttrs!(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!Функция
orglq!(A, tau, k = length(tau))
Явно находит матрицу Q факторизации LQ после вызова gelqf! над A. Использует результат вызова gelqf!. A перезаписывается значением Q.
LinearAlgebra.LAPACK.orgqr!Функция
orgqr!(A, tau, k = length(tau))
Явно находит матрицу Q факторизации QR после вызова geqrf! над A. Использует результат вызова geqrf!. A перезаписывается значением Q.
LinearAlgebra.LAPACK.orgql!Функция
orgql!(A, tau, k = length(tau))
Явно находит матрицу Q факторизации QL после вызова geqlf! над A. Использует результат вызова geqlf!. A перезаписывается значением Q.
LinearAlgebra.LAPACK.orgrq!Функция
orgrq!(A, tau, k = length(tau))
Явно находит матрицу Q факторизации RQ после вызова gerqf! над A. Использует результат вызова gerqf!. A перезаписывается значением Q.
LinearAlgebra.LAPACK.ormlq!Функция
ormlq!(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!Функция
ormqr!(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!Функция
ormql!(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!Функция
ormrq!(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!Функция
gemqrt!(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!Функция
posv!(uplo, A, B) -> (A, B)
Находит решение уравнения A * X = B, где A — симметричная или эрмитова положительно определённая матрица. Если uplo = U, вычисляется верхняя факторизация Холецкого A. Если uplo = L, вычисляется нижняя факторизация Холецкого A. A перезаписывается своей факторизацией Холецкого. B перезаписывается решением X.
LinearAlgebra.LAPACK.potrf!Функция
potrf!(uplo, A)
Вычисляет факторизацию Холецкого (верхнюю, если uplo = U, нижнюю, если uplo = L) положительно определённой матрицы A. A перезаписывается и возвращается с кодом информации.
LinearAlgebra.LAPACK.potri!Функция
potri!(uplo, A)
Вычисляет обратную матрицу A положительно определённой матрицы после вызова potrf! для нахождения её (верхней, если uplo = U, нижней, если uplo = L) факторизации Холецкого.
A перезаписывается своей обратной матрицей и возвращается.
LinearAlgebra.LAPACK.potrs!Функция
potrs!(uplo, A, B)
Находит решение уравнения A * X = B, где A — симметричная или эрмитова положительно определённая матрица, чья факторизация Холецкого была вычислена функцией potrf!. Если uplo = U, то была вычислена верхняя факторизация Холецкого A. Если uplo = L, то была вычислена нижняя факторизация Холецкого A. B перезаписывается решением X.
LinearAlgebra.LAPACK.pstrf!Функция
pstrf!(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!Функция
ptsv!(D, E, B)
Решает A * X = B для положительно определённой трёхдиагональной матрицы A. D — диагональ A, а E — внедиагональ. B перезаписывается решением X и возвращается.
LinearAlgebra.LAPACK.pttrf!Функция
pttrf!(D, E)
Вычисляет факторизацию LDLt положительно определённой трёхдиагональной матрицы с диагональю D и внедиагональю E. D и E перезаписываются и возвращаются.
LinearAlgebra.LAPACK.pttrs!Функция
pttrs!(D, E, B)
Решает A * X = B для положительно определённой трёхдиагональной матрицы A с диагональю D и внедиагональю E после вычисления факторизации LDLt A с помощью pttrf!. B перезаписывается решением X.
LinearAlgebra.LAPACK.trtri!Функция
trtri!(uplo, diag, A)
Находит обратную матрицу (верхнетреугольную, если uplo = U, нижнетреугольную, если uplo = L) треугольной матрицы A. Если diag = N, то A имеет ненулевые диагональные элементы. Если diag = U, все диагональные элементы A равны единице. Матрица A перезаписывается своим обратным значением.
LinearAlgebra.LAPACK.trtrs!Функция
trtrs!(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!Функция
trcon!(norm, uplo, diag, A)
Находит обратную условную величину (верхнетреугольной, если uplo = U, нижнетреугольной, если uplo = L) треугольной матрицы A. Если diag = N, A имеет ненулевые диагональные элементы. Если diag = U, все диагональные элементы A равны единице. Если norm = I, условная величина находится в бесконечной норме. Если norm = O или 1, условная величина находится в норме 1.
LinearAlgebra.LAPACK.trevc!Функция
trevc!(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!Функция
trrfs!(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!Функция
stev!(job, dv, ev) -> (dv, Zmat)
Вычисляет собственную систему для симметричной тридиагональной матрицы с dv по диагонали и ev по внедиагональным элементам. Если job = N, вычисляются только собственные значения и возвращаются в dv. Если job = V, то также находятся собственные векторы и возвращаются в Zmat.
LinearAlgebra.LAPACK.stebz!Функция
stebz!(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!Функция
stegr!(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!Функция
stein!(dv, ev_in, w_in, iblock_in, isplit_in)
Вычисляет собственные векторы для симметричной тридиагональной матрицы с dv по диагонали и ev_in по внедиагональным элементам. w_in указывает входные собственные значения, для которых необходимо найти соответствующие собственные векторы. iblock_in указывает подматрицы, соответствующие собственным значениям в w_in. isplit_in указывает точки разделения между блоками подматриц.
LinearAlgebra.LAPACK.syconv!Функция
syconv!(uplo, A, ipiv) -> (A, work)
Преобразует симметричную матрицу A (которая была разложена в треугольную матрицу) в две матрицы L и D. Если uplo = U, A — верхняя треугольная матрица. Если uplo = L, она — нижняя треугольная. ipiv — вектор опорных элементов из треугольного разложения. A перезаписывается L и D.
LinearAlgebra.LAPACK.sysv!Функция
sysv!(uplo, A, B) -> (B, A, ipiv)
Находит решение для A * X = B для симметричной матрицы A. Если uplo = U, верхняя половина A хранится. Если uplo = L, хранится нижняя половина. B перезаписывается решением X. A перезаписывается ее факторизацией по Банчу-Кофману. ipiv содержит информацию о повороте факторизации.
LinearAlgebra.LAPACK.sytrf!Функция
sytrf!(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!Функция
sytri!(uplo, A, ipiv)
Вычисляет обратную симметричную матрицу A, используя результаты sytrf!. Если uplo = U, верхняя половина A хранится. Если uplo = L, хранится нижняя половина. A перезаписывается своей обратной матрицей.
LinearAlgebra.LAPACK.sytrs!Функция
sytrs!(uplo, A, ipiv, B)
Решает уравнение A * X = B для симметричной матрицы A, используя результаты sytrf!. Если uplo = U, верхняя половина A хранится. Если uplo = L, хранится нижняя половина. B перезаписывается решением X.
LinearAlgebra.LAPACK.hesv!Функция
hesv!(uplo, A, B) -> (B, A, ipiv)
Находит решение для A * X = B для эрмитовой матрицы A. Если uplo = U, верхняя половина A хранится. Если uplo = L, хранится нижняя половина. B перезаписывается решением X. A перезаписывается ее факторизацией по Банчу-Кофману. ipiv содержит информацию о повороте факторизации.
LinearAlgebra.LAPACK.hetrf!Функция
hetrf!(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!Функция
hetri!(uplo, A, ipiv)
Вычисляет обратную матрицу эрмитовой матрицы A, используя результаты из sytrf!. Если uplo = U, верхняя половина A хранится. Если uplo = L, хранится нижняя половина. A перезаписывается своей обратной матрицей.
LinearAlgebra.LAPACK.hetrs!Функция
hetrs!(uplo, A, ipiv, B)
Решает уравнение A * X = B для эрмитовой матрицы A, используя результаты из sytrf!. Если uplo = U, верхняя половина A хранится. Если uplo = L, хранится нижняя половина. B перезаписывается решением X.
LinearAlgebra.LAPACK.syev!Функция
syev!(jobz, uplo, A)
Находит собственные значения (jobz = N) или собственные значения и собственные векторы (jobz = V) симметричной матрицы A. Если uplo = U, используется верхний треугольник A. Если uplo = L, используется нижний треугольник A.
LinearAlgebra.LAPACK.syevr!Функция
syevr!(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!Функция
syevd!(jobz, uplo, A)
Находит собственные значения (jobz = N) или собственные значения и собственные векторы (jobz = V) симметричной матрицы A. Если uplo = U, используется верхний треугольник A. Если uplo = L, используется нижний треугольник A.
Использует метод деления и объединения вместо итерации QR, используемой в syev!, или нескольких относительно устойчивых представлений, используемых в syevr!. См. James W. Demmel et al, SIAM J. Sci. Comput. 30, 3, 1508 (2008) для сравнения точности и производительности различных методов.
LinearAlgebra.LAPACK.sygvd!Функция
sygvd!(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!Функция
bdsqr!(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!Функция
bdsdc!(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!Функция
gecon!(normtype, A, anorm)
Находит обратную величину числовой обусловленности матрицы A. Если normtype = I, числовая обусловленность находится в норме бесконечности. Если normtype = O или 1, числовая обусловленность находится в норме единицы. A должно быть результатом из getrf!, и anorm — нормой A в соответствующей норме.
LinearAlgebra.LAPACK.gehrd!Функция
gehrd!(ilo, ihi, A) -> (A, tau)
Преобразует матрицу A в форму Хессенберга. Если A сбалансирована с gebal!, то ilo и ihi — результаты из gebal!. В противном случае они должны быть ilo = 1 и ihi = size(A,2). tau содержит элементарные отражения факторизации.
LinearAlgebra.LAPACK.orghr!Функция
orghr!(ilo, ihi, A, tau)
Явно находит Q, ортогональную/унитарную матрицу из gehrd!. ilo, ihi, A и tau должны соответствовать вводу/выводу к gehrd!.
LinearAlgebra.LAPACK.gees!Функция
gees!(jobvs, A) -> (A, vs, w)
Вычисляет собственные значения (jobvs = N) или собственные значения и векторы Шур (jobvs = V) матрицы A. A перезаписывается своей формой Шур.
Возвращает A, vs, содержащие векторы Шур, и w, содержащие собственные значения.
LinearAlgebra.LAPACK.gges!Функция
gges!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)
Вычисляет обобщенные собственные значения, обобщенную форму Шур, левые векторы Шур (jobsvl = V) или правые векторы Шур (jobvsr = V) из A и B.
Обобщенные собственные значения возвращаются в alpha и beta. Левые векторы Шур возвращаются в vsl, а правые — в vsr.
LinearAlgebra.LAPACK.gges3!Функция
gges3!(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!Функция
trexc!(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!Функция
trsen!(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!Функция
tgsen!(select, S, T, Q, Z) -> (S, T, alpha, beta, Q, Z)
Переупорядочивает векторы обобщенного разложения Шура. select определяет собственные значения в каждом кластере.
LinearAlgebra.LAPACK.trsyl!Функция
trsyl!(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!Функция
hseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)
Вычисляет все собственные значения и (необязательно) факторизацию Шура матрицы, приведенной к форме Хессенберга. Если H сбалансировано с помощью gebal!, то ilo и ihi — это результаты gebal!. В противном случае они должны быть ilo = 1 и ihi = size(H,2). tau содержит элементарные отражатели факторизации.
- ACM832Davis, Timothy A. (2004b). Algorithm 832: UMFPACK V4.3–-an Unsymmetric-Pattern Multifrontal Method. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
- ACM887Chen, Y., Davis, T. A., Hager, W. W., & Rajamanickam, S. (2008). 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 and C Van Loan, "The WY representation for products of Householder matrices", SIAM J Sci Stat Comput 8 (1987), s2-s13. doi:10.1137/0908009
- Schreiber1989R Schreiber and C Van Loan, "A storage-efficient WY representation for products of Householder transformations", 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 and L Kaufman, Some stable methods for calculating inertia and solving symmetric linear systems, 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 and Nicholas J. Higham, "Improved inverse scaling and squaring algorithms for the matrix logarithm", SIAM Journal on Scientific Computing, 34(4), 2012, C153-C169. doi:10.1137/110852553
- AHR13Awad H. Al-Mohy, Nicholas J. Higham and Samuel D. Relton, "Computing the Fréchet derivative of the matrix logarithm and estimating the condition number", SIAM Journal on Scientific Computing, 35(4), 2013, C394-C410. doi:10.1137/120885991
- BH83Åke Björck and Sven Hammarling, "A Schur method for the square root of a matrix", Linear Algebra and its Applications, 52-53, 1983, 127-140. doi:10.1016/0024-3795(83)80010-X
- H87Nicholas J. Higham, "Computing real square roots of a real matrix", Linear Algebra and its Applications, 88-89, 1987, 405-430. doi:10.1016/0024-3795(87)90118-2
- S03Matthew I. Smith, "A Schur Algorithm for Computing Matrix pth Roots", SIAM Journal on Matrix Analysis and Applications, vol. 24, 2003, pp. 971–989. doi:10.1137/S0895479801392697
- AH16_1Mary Aprahamian and Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_2Mary Aprahamian and Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_3Mary Aprahamian and Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_4Mary Aprahamian and Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_5Mary Aprahamian and Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
- AH16_6Mary Aprahamian and Nicholas J. Higham, "Matrix Inverse Trigonometric and Inverse Hyperbolic Functions: Theory and Algorithms", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
© 2009–2024 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/v1.11/stdlib/LinearAlgebra/