Linear Algebra

В дополнение к (и как часть) своей поддержки многомерных массивов, Julia предоставляет нативные реализации многих общих и полезных операций линейной алгебры, которые можно загрузить с помощью using LinearAlgebra. Основные операции, такие как tr, det и inv, все поддерживаются:

julia> A = [1 2 3; 4 1 6; 7 8 1]
3×3 Matrix{Int64}:
 1  2  3
 4  1  6
 7  8  1

julia> tr(A)
3

julia> det(A)
104.0

julia> inv(A)
3×3 Matrix{Float64}:
 -0.451923   0.211538    0.0865385
  0.365385  -0.192308    0.0576923
  0.240385   0.0576923  -0.0673077

А также другие полезные операции, такие как нахождение собственных значений или собственных векторов:

julia> A = [-4. -17.; 2. 2.]
2×2 Matrix{Float64}:
 -4.0  -17.0
  2.0    2.0

julia> eigvals(A)
2-element Vector{ComplexF64}:
 -1.0 - 5.0im
 -1.0 + 5.0im

julia> eigvecs(A)
2×2 Matrix{ComplexF64}:
  0.945905-0.0im        0.945905+0.0im
 -0.166924+0.278207im  -0.166924-0.278207im

Кроме того, Julia предоставляет множество factorizations, которые могут быть использованы для ускорения задач, таких как линейное решение или возведение матрицы в степень, путем предварительной факторизации матрицы в форму, более удобную (по причинам производительности или памяти) для задачи. См. документацию по factorize для получения дополнительной информации. В качестве примера:

julia> A = [1.5 2 -4; 3 -1 -6; -10 2.3 4]
3×3 Matrix{Float64}:
   1.5   2.0  -4.0
   3.0  -1.0  -6.0
 -10.0   2.3   4.0

julia> factorize(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
3×3 Matrix{Float64}:
  1.0    0.0       0.0
 -0.15   1.0       0.0
 -0.3   -0.132196  1.0
U factor:
3×3 Matrix{Float64}:
 -10.0  2.3     4.0
   0.0  2.345  -3.4
   0.0  0.0    -5.24947

Поскольку A не является эрмитовой, симметричной, треугольной, тридиагональной или бидиагональной, факторизация LU может быть лучшим, что мы можем сделать. Сравните с:

julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

julia> factorize(B)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
3×3 Tridiagonal{Float64, Vector{Float64}}:
 -1.64286   0.0   ⋅
  0.0      -2.8  0.0
   ⋅        0.0  5.0
U factor:
3×3 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.142857  -0.8
  ⋅   1.0       -0.6
  ⋅    ⋅         1.0
permutation:
3-element Vector{Int64}:
 1
 2
 3

Здесь Джулия смогла обнаружить, что B на самом деле симметричен, и использовала более подходящую факторизацию. Часто возможно написать более эффективный код для матрицы, которая известна как обладающая определенными свойствами, например, она симметрична или тридиагональна. Джулия предоставляет некоторые специальные типы, чтобы вы могли "пометить" матрицы как обладающие этими свойствами. Например:

julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

sB был помечен как матрица, которая является (действительно) симметричной, поэтому для последующих операций, которые мы можем выполнять с ней, таких как собственная факторизация или вычисление произведений матрица-вектор, можно найти эффективность, ссылаясь только на половину из нее. Например:

julia> B = [1.5 2 -4; 2 -1 -3; -4 -3 5]
3×3 Matrix{Float64}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

julia> sB = Symmetric(B)
3×3 Symmetric{Float64, Matrix{Float64}}:
  1.5   2.0  -4.0
  2.0  -1.0  -3.0
 -4.0  -3.0   5.0

julia> x = [1; 2; 3]
3-element Vector{Int64}:
 1
 2
 3

julia> sB\x
3-element Vector{Float64}:
 -1.7391304347826084
 -1.1086956521739126
 -1.4565217391304346

Операция \ здесь выполняет линейное решение. Оператор деления слева довольно мощный, и легко написать компактный, читаемый код, который достаточно гибок, чтобы решать всевозможные системы линейных уравнений.

Special matrices

Matrices with special symmetries and structures часто встречаются в линейной алгебре и часто ассоциируются с различными разложениями матриц. Julia предлагает богатую коллекцию специальных типов матриц, которые позволяют быстро выполнять вычисления с помощью специализированных процедур, разработанных специально для определенных типов матриц.

Следующие таблицы обобщают типы специальных матриц, которые были реализованы в Julia, а также наличие хуков для различных оптимизированных методов для них в LAPACK.

TypeDescription
SymmetricSymmetric matrix
HermitianHermitian matrix
UpperTriangularUpper triangular matrix
UnitUpperTriangularUpper triangular matrix with unit diagonal
LowerTriangularLower triangular matrix
UnitLowerTriangularLower triangular matrix with unit diagonal
UpperHessenbergUpper Hessenberg matrix
TridiagonalTridiagonal matrix
SymTridiagonalSymmetric tridiagonal matrix
BidiagonalUpper/lower bidiagonal matrix
DiagonalDiagonal matrix
UniformScalingUniform scaling operator

Elementary operations

Matrix type+-*\Other functions with optimized methods
SymmetricMVinv, sqrt, cbrt, exp
HermitianMVinv, sqrt, cbrt, exp
UpperTriangularMVMVinv, det, logdet
UnitUpperTriangularMVMVinv, det, logdet
LowerTriangularMVMVinv, det, logdet
UnitLowerTriangularMVMVinv, det, logdet
UpperHessenbergMMinv, det
SymTridiagonalMMMSMVeigmax, eigmin
TridiagonalMMMSMV
BidiagonalMMMSMV
DiagonalMMMVMVinv, det, logdet, /
UniformScalingMMMVSMVS/

Легенда:

KeyDescription
M (matrix)An optimized method for matrix-matrix operations is available
V (vector)An optimized method for matrix-vector operations is available
S (scalar)An optimized method for matrix-scalar operations is available

Matrix factorizations

Matrix typeLAPACKeigeneigvalseigvecssvdsvdvals
SymmetricSYARI
HermitianHEARI
UpperTriangularTRAAA
UnitUpperTriangularTRAAA
LowerTriangularTRAAA
UnitLowerTriangularTRAAA
SymTridiagonalSTAARIAV
TridiagonalGT
BidiagonalBDAA
DiagonalDIA

Легенда:

KeyDescriptionExample
A (all)An optimized method to find all the characteristic values and/or vectors is availablee.g. eigvals(M)
R (range)An optimized method to find the ilth through the ihth characteristic values are availableeigvals(M, il, ih)
I (interval)An optimized method to find the characteristic values in the interval [vl, vh] is availableeigvals(M, vl, vh)
V (vectors)An optimized method to find the characteristic vectors corresponding to the characteristic values x=[x1, x2,...] is availableeigvecs(M, x)

The uniform scaling operator

Оператор UniformScaling представляет собой скаляр, умноженный на оператор единицы, λ*I. Оператор единицы I определяется как константа и является экземпляром UniformScaling. Размеры этих операторов являются обобщенными и соответствуют другим матрицам в бинарных операциях +, -, * и \. Для A+I и A-I это означает, что A должно быть квадратным. Умножение на оператор единицы I является неоперацией (за исключением проверки, что коэффициент масштабирования равен одному) и, следовательно, почти без накладных расходов.

Чтобы увидеть оператор UniformScaling в действии:

julia> U = UniformScaling(2);

julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> a + U
2×2 Matrix{Int64}:
 3  2
 3  6

julia> a * U
2×2 Matrix{Int64}:
 2  4
 6  8

julia> [a U]
2×4 Matrix{Int64}:
 1  2  2  0
 3  4  0  2

julia> b = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
 1  2  3
 4  5  6

julia> b - U
ERROR: DimensionMismatch: matrix is not square: dimensions are (2, 3)
Stacktrace:
[...]

Если вам нужно решить множество систем вида (A+μI)x = b для одного и того же A и разных μ, может быть полезно сначала вычислить факторизацию Хессенберга F для A с помощью функции hessenberg. Учитывая F, Julia использует эффективный алгоритм для (F+μ*I) \ b (эквивалентный (A+μ*I)x \ b) и связанных операций, таких как определители.

Matrix factorizations

Matrix factorizations (a.k.a. matrix decompositions) вычисление факторизации матрицы в произведение матриц и является одной из центральных концепций в (численной) линейной алгебре.

Следующая таблица суммирует типы разложений матриц, которые были реализованы в Julia. Подробности о связанных с ними методах можно найти в разделе Standard functions документации по линейной алгебре.

TypeDescription
BunchKaufmanBunch-Kaufman factorization
CholeskyCholesky factorization
CholeskyPivotedPivoted Cholesky factorization
LDLtLDL(T) factorization
LULU factorization
QRQR factorization
QRCompactWYCompact WY form of the QR factorization
QRPivotedPivoted QR factorization
LQQR factorization of transpose(A)
HessenbergHessenberg decomposition
EigenSpectral decomposition
GeneralizedEigenGeneralized spectral decomposition
SVDSingular value decomposition
GeneralizedSVDGeneralized SVD
SchurSchur decomposition
GeneralizedSchurGeneralized Schur decomposition

Адъюнкты и транспонирования объектов Factorization лениво оборачиваются в объекты AdjointFactorization и TransposeFactorization, соответственно. В общем случае, транспонирование действительных Factorization оборачивается как AdjointFactorization.

Orthogonal matrices (AbstractQ)

Некоторые разложения матриц генерируют ортогональные/унитарные "факторы матрицы". Эти разложения включают разложения, связанные с QR, полученные из вызовов к qr, т.е. QR, QRCompactWY и QRPivoted, разложение Гессенберга, полученное из вызовов к hessenberg, и разложение LQ, полученное из lq. Хотя эти ортогональные/унитарные факторы допускают матричное представление, их внутреннее представление, по причинам производительности и памяти, отличается. Следовательно, их следует рассматривать скорее как линейные операторы на основе матриц, поддерживаемые функциями. В частности, чтение, например, столбца их матричного представления требует выполнения кода умножения "матрица"-вектор, а не простого считывания данных из памяти (возможно, заполняя части вектора структурными нулями). Еще одно четкое отличие от других, нетреугольных типов матриц заключается в том, что основной код умножения позволяет модификацию на месте во время умножения. Более того, объекты конкретных подтипов AbstractQ, созданные через 4d61726b646f776e2e436f64652822222c202271722229_40726566, 4d61726b646f776e2e436f64652822222c202268657373656e626572672229_40726566 и 4d61726b646f776e2e436f64652822222c20226c712229_40726566, могут вести себя как квадратная или прямоугольная матрица в зависимости от контекста:

julia> using LinearAlgebra

julia> Q = qr(rand(3,2)).Q
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}

julia> Matrix(Q)
3×2 Matrix{Float64}:
 -0.320597   0.865734
 -0.765834  -0.475694
 -0.557419   0.155628

julia> Q*I
3×3 Matrix{Float64}:
 -0.320597   0.865734  -0.384346
 -0.765834  -0.475694  -0.432683
 -0.557419   0.155628   0.815514

julia> Q*ones(2)
3-element Vector{Float64}:
  0.5451367118802273
 -1.241527373086654
 -0.40179067589600226

julia> Q*ones(3)
3-element Vector{Float64}:
  0.16079054743832022
 -1.674209978965636
  0.41372375588835797

julia> ones(1,2) * Q'
1×3 Matrix{Float64}:
 0.545137  -1.24153  -0.401791

julia> ones(1,3) * Q'
1×3 Matrix{Float64}:
 0.160791  -1.67421  0.413724

Из-за этого отличия от плотных или структурированных матриц абстрактный тип AbstractQ не является подтипом AbstractMatrix, а вместо этого имеет свою собственную иерархию типов. Пользовательские типы, которые являются подтипами AbstractQ, могут полагаться на универсальные резервные варианты, если соблюдается следующий интерфейс. Например, для

struct MyQ{T} <: LinearAlgebra.AbstractQ{T}
    # required fields
end

предоставить перегрузки для

Base.size(Q::MyQ) # size of corresponding square matrix representation
Base.convert(::Type{AbstractQ{T}}, Q::MyQ) # eltype promotion [optional]
LinearAlgebra.lmul!(Q::MyQ, x::AbstractVecOrMat) # left-multiplication
LinearAlgebra.rmul!(A::AbstractMatrix, Q::MyQ) # right-multiplication

Если продвижение eltype не является интересным, метод convert не нужен, так как по умолчанию convert(::Type{AbstractQ{T}}, Q::AbstractQ{T}) возвращает сам Q. Сопряженные объекты типа AbstractQ лениво оборачиваются в тип-обертку AdjointQ, который требует своих собственных методов LinearAlgebra.lmul! и LinearAlgebra.rmul!. Учитывая этот набор методов, любой Q::MyQ может использоваться как матрица, предпочтительно в контексте умножения: умножение через * со скалярами, векторами и матрицами слева и справа, получение матричного представления Q через Matrix(Q) (или Q*I) и индексация в матричном представлении работают. В отличие от этого, сложение и вычитание, а также более общее широковещательное применение к элементам в матричном представлении не работают, так как это было бы крайне неэффективно. Для таких случаев рассмотрите возможность вычисления матричного представления заранее и кэширования его для будущего использования.

Pivoting Strategies

Несколько из matrix factorizations поддерживают pivoting, что может быть использовано для улучшения их численной устойчивости. На самом деле, некоторые разложения матриц, такие как разложение LU, могут потерпеть неудачу без пивотирования.

In pivoting, first, a pivot element with good numerical properties is chosen based on a pivoting strategy. Next, the rows and columns of the original matrix are permuted to bring the chosen element in place for subsequent computation. Furthermore, the process is repeated for each stage of the factorization.

Следовательно, помимо обычных матричных факторов, выходы схем поворотной факторизации также включают матрицы перестановок.

В следующем кратко описаны стратегии поворота, реализованные в Julia. Обратите внимание, что не все разложения матриц могут их поддерживать. Обратитесь к документации соответствующего matrix factorization для получения подробной информации о поддерживаемых стратегиях поворота.

См. также LinearAlgebra.ZeroPivotException.

LinearAlgebra.NoPivotType
NoPivot

Пивотирование не выполняется. Факторизации матриц, такие как LU-факторизация, могут потерпеть неудачу без пивотирования и также могут быть численно нестабильными для матриц с плавающей запятой в условиях округления. Эта стратегия пивотирования в основном полезна в учебных целях.

source
LinearAlgebra.RowNonZeroType
RowNonZero

Первый ненулевой элемент в оставшихся строках выбирается в качестве опорного элемента.

Имейте в виду, что для матриц с плавающей запятой полученный алгоритм LU численно нестабилен — эта стратегия в основном полезна для сравнения с ручными расчетами (которые обычно используют эту стратегию) или для других алгебраических типов (например, рациональных чисел), не подверженных ошибкам округления. В противном случае следует предпочесть стратегию опорного элемента RowMaximum в методе Гаусса.

Обратите внимание, что тип элемента матрицы должен допускать метод iszero.

source
LinearAlgebra.RowMaximumType
RowMaximum

Максимальный по модулю элемент в оставшихся строках выбирается в качестве опорного элемента. Это стратегия по умолчанию для LU-разложения матриц с плавающей запятой и иногда называется алгоритмом "частичного выбора опорного элемента".

Обратите внимание, что тип элемента матрицы должен поддерживать метод abs, результат которого должен поддерживать метод <.

source
LinearAlgebra.ColumnNormType
ColumnNorm

Столбец с максимальной нормой используется для последующих вычислений. Это используется для поворотной QR-факторизации.

Обратите внимание, что тип элемента матрицы должен поддерживать методы norm и abs, типы результатов которых должны поддерживать метод <.

source

Standard functions

Линейная алгебра в Julia в основном реализована с помощью вызова функций из LAPACK. Факторизации разреженных матриц вызывают функции из SuiteSparse. Другие разреженные решатели доступны в виде пакетов Julia.

Base.:*Method
*(A::AbstractMatrix, B::AbstractMatrix)

Умножение матриц.

Примеры

julia> [1 1; 0 1] * [1 0; 1 1]
2×2 Matrix{Int64}:
 2  1
 1  1
source
Base.:*Method
*(A, B::AbstractMatrix, C)
A * B * C * D

Цепное умножение 3 или 4 матриц выполняется в наиболее эффективной последовательности, основываясь на размерах массивов. То есть, количество скалярных умножений, необходимых для (A * B) * C (с 3 плотными матрицами), сравнивается с количеством для A * (B * C), чтобы выбрать, какое из этих выражений выполнять.

Если последний множитель — это вектор, или первый — транспонированный вектор, то эффективно сначала обрабатывать эти случаи. В частности, x' * B * y означает (x' * B) * y для обычной матрицы столбцового порядка B::Matrix. В отличие от dot(x, B, y), это выделяет промежуточный массив.

Если первый или последний множитель — это число, это будет объединено с умножением матриц, используя 5-аргументный mul!.

См. также muladd, dot.

Julia 1.7

Эти оптимизации требуют как минимум Julia 1.7.

source
Base.:\Method
\(A, B)

Деление матриц с использованием полиалгоритма. Для входных матриц A и B результат X таков, что A*X == B, когда A является квадратной. Используемый решатель зависит от структуры A. Если A является верхней или нижней треугольной (или диагональной), факторизация A не требуется, и система решается с помощью прямой или обратной подстановки. Для неквадратных квадратных матриц используется LU-факторизация.

Для прямоугольной A результатом является решение наименьших квадратов с минимальной нормой, вычисленное с помощью пивотированной QR-факторизации A и оценки ранга A на основе фактора R.

Когда A разреженная, используется аналогичный полиалгоритм. Для неопределенных матриц факторизация LDLt не использует пивотирование во время численной факторизации, и, следовательно, процедура может завершиться неудачей даже для обратимых матриц.

См. также: factorize, pinv.

Примеры

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
source
Base.:/Method
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
source
LinearAlgebra.SingularExceptionType
SingularException

Исключение, выбрасываемое, когда входная матрица имеет одно или несколько собственных значений, равных нулю, и не является обратимой. Линейное решение, связанное с такой матрицей, не может быть вычислено. Поле info указывает на местоположение (одного из) сингулярных значений.

source
LinearAlgebra.PosDefExceptionType
PosDefException

Исключение, выбрасываемое, когда входная матрица не является положительно определенной. Некоторые функции линейной алгебры и факторизации применимы только к положительно определенным матрицам. Поле info указывает на местоположение (одного из) собственных значений, которые меньше или равны 0.

source
LinearAlgebra.ZeroPivotExceptionType
ZeroPivotException <: Exception

Исключение, выбрасываемое, когда факторизация/решение матрицы сталкивается с нулем в позиции пивота (диагонали) и не может продолжить. Это не обязательно означает, что матрица сингулярна: может быть полезно переключиться на другую факторизацию, такую как пивотированная LU, которая может переупорядочить переменные, чтобы устранить ложные нулевые пивоты. Поле info указывает на местоположение (одного из) нулевых пивотов.

source
LinearAlgebra.RankDeficientExceptionType
RankDeficientException

Исключение, выбрасываемое, когда входная матрица является рангово недостаточной. Некоторые функции линейной алгебры, такие как разложение Холецкого, применимы только к матрицам, которые не являются рангово недостаточными. Поле info указывает вычисленный ранг матрицы.

source
LinearAlgebra.LAPACKExceptionType
LAPACKException

Общее исключение LAPACK, выбрасываемое либо во время прямых вызовов к функциям LAPACK, либо во время вызовов других функций, которые используют функции LAPACK внутри, но не имеют специализированной обработки ошибок. Поле info содержит дополнительную информацию о возникшей ошибке и зависит от вызванной функции LAPACK.

source
LinearAlgebra.dotFunction
dot(x, y)
x ⋅ y

Вычислите скалярное произведение между двумя векторами. Для комплексных векторов первый вектор конъюгирован.

dot также работает с произвольными итерируемыми объектами, включая массивы любой размерности, при условии, что dot определен для элементов.

dot семантически эквивалентен sum(dot(vx,vy) for (vx,vy) in zip(x, y)), с добавленным ограничением, что аргументы должны иметь равные длины.

x ⋅ y (где можно ввести, используя автозаполнение \cdot в REPL) является синонимом для dot(x, y).

Примеры

julia> dot([1; 1], [2; 3])
5

julia> dot([im; im], [1; 1])
0 - 2im

julia> dot(1:5, 2:6)
70

julia> x = fill(2., (5,5));

julia> y = fill(3., (5,5));

julia> dot(x, y)
150.0
source
LinearAlgebra.dotMethod
dot(x, A, y)

Вычисляет обобщенное скалярное произведение dot(x, A*y) между двумя векторами x и y, не сохраняя промежуточный результат A*y. Как и в случае с двухаргументным dot(_,_), это действует рекурсивно. Более того, для комплексных векторов первый вектор сопряжен.

Julia 1.4

Трехаргументный 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
source
LinearAlgebra.crossFunction
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
source
LinearAlgebra.axpy!Function
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
source
LinearAlgebra.axpby!Function
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
source
LinearAlgebra.rotate!Function
rotate!(x, y, c, s)

Перезаписывает x как c*x + s*y и y как -conj(s)*x + c*y. Возвращает x и y.

Julia 1.5

rotate! требует как минимум Julia 1.5.

source
LinearAlgebra.reflect!Function
reflect!(x, y, c, s)

Перезаписывает x значением c*x + s*y и y значением conj(s)*x - c*y. Возвращает x и y.

Julia 1.5

reflect! требует как минимум Julia 1.5.

source
LinearAlgebra.factorizeFunction
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 проверит, что A уже факторизована
5×5 Bidiagonal{Float64, Vector{Float64}}:
 1.0  1.0   ⋅    ⋅    ⋅
  ⋅   1.0  1.0   ⋅    ⋅
  ⋅    ⋅   1.0  1.0   ⋅
  ⋅    ⋅    ⋅   1.0  1.0
  ⋅    ⋅    ⋅    ⋅   1.0

Это возвращает 5×5 Bidiagonal{Float64}, который теперь можно передать другим функциям линейной алгебры (например, решателям собственных значений), которые будут использовать специализированные методы для типов Bidiagonal.

source
LinearAlgebra.DiagonalType
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
Note

Матрица с одной колонкой не рассматривается как вектор, а вместо этого вызывает метод Diagonal(A::AbstractMatrix), который извлекает 1-элементный diag(A):

julia> A = transpose([7.0 13.0])
2×1 transpose(::Matrix{Float64}) with eltype Float64:
  7.0
 13.0

julia> Diagonal(A)
1×1 Diagonal{Float64, Vector{Float64}}:
 7.0
source
Diagonal(A::AbstractMatrix)

Построить матрицу из главной диагонали A. Входная матрица A может быть прямоугольной, но выходная будет квадратной.

Примеры

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> D = Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
 1  ⋅
 ⋅  4

julia> A = [1 2 3; 4 5 6]
2×3 Matrix{Int64}:
 1  2  3
 4  5  6

julia> Diagonal(A)
2×2 Diagonal{Int64, Vector{Int64}}:
 1  ⋅
 ⋅  5
source
Diagonal{T}(undef, n)

Создает неинициализированный Diagonal{T} длины n. См. undef.

source
LinearAlgebra.BidiagonalType
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 находится на первой супердиагонали
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  7  ⋅  ⋅
 ⋅  2  8  ⋅
 ⋅  ⋅  3  9
 ⋅  ⋅  ⋅  4

julia> Bl = Bidiagonal(dv, ev, :L) # ev находится на первой поддиагонали
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  ⋅  ⋅  ⋅
 7  2  ⋅  ⋅
 ⋅  8  3  ⋅
 ⋅  ⋅  9  4
source
Bidiagonal(A, uplo::Symbol)

Создает матрицу Bidiagonal из главной диагонали A и ее первой супер- (если uplo=:U) или поддиагонали (если uplo=:L).

Примеры

julia> A = [1 1 1 1; 2 2 2 2; 3 3 3 3; 4 4 4 4]
4×4 Matrix{Int64}:
 1  1  1  1
 2  2  2  2
 3  3  3  3
 4  4  4  4

julia> Bidiagonal(A, :U) # содержит главную диагональ и первую супердиагональ A
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  1  ⋅  ⋅
 ⋅  2  2  ⋅
 ⋅  ⋅  3  3
 ⋅  ⋅  ⋅  4

julia> Bidiagonal(A, :L) # содержит главную диагональ и первую поддиагональ A
4×4 Bidiagonal{Int64, Vector{Int64}}:
 1  ⋅  ⋅  ⋅
 2  2  ⋅  ⋅
 ⋅  3  3  ⋅
 ⋅  ⋅  4  4
source
LinearAlgebra.SymTridiagonalType
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  4
source
SymTridiagonal(A::AbstractMatrix)

Создает симметричную тридиагональную матрицу из диагонали и первой наддиагонали симметричной матрицы A.

Примеры

julia> A = [1 2 3; 2 4 5; 3 5 6]
3×3 Matrix{Int64}:
 1  2  3
 2  4  5
 3  5  6

julia> SymTridiagonal(A)
3×3 SymTridiagonal{Int64, Vector{Int64}}:
 1  2  ⋅
 2  4  5
 ⋅  5  6

julia> B = reshape([[1 2; 2 3], [1 2; 3 4], [1 3; 2 4], [1 2; 2 3]], 2, 2);

julia> SymTridiagonal(B)
2×2 SymTridiagonal{Matrix{Int64}, Vector{Matrix{Int64}}}:
 [1 2; 2 3]  [1 3; 2 4]
 [1 2; 3 4]  [1 2; 2 3]
source
LinearAlgebra.TridiagonalType
Tridiagonal(dl::V, d::V, du::V) where V <: AbstractVector

Построить тридиагональную матрицу из первого поддиагонального, диагонального и первого наддиагонального элементов соответственно. Результат имеет тип Tridiagonal и предоставляет эффективные специализированные линейные решатели, но может быть преобразован в обычную матрицу с помощью convert(Array, _) (или Array(_) для краткости). Длины dl и du должны быть на единицу меньше длины d.

Note

Поддиагональный элемент dl и наддиагональный элемент du не должны ссылаться друг на друга. Если будет обнаружено, что они ссылаются друг на друга, конструктор использует копию du в качестве своего аргумента.

Примеры

julia> dl = [1, 2, 3];

julia> du = [4, 5, 6];

julia> d = [7, 8, 9, 0];

julia> Tridiagonal(dl, d, du)
4×4 Tridiagonal{Int64, Vector{Int64}}:
 7  4  ⋅  ⋅
 1  8  5  ⋅
 ⋅  2  9  6
 ⋅  ⋅  3  0
source
Tridiagonal(A)

Построить тридиагональную матрицу из первой поддиагонали, диагонали и первой наддиагонали матрицы A.

Примеры

julia> A = [1 2 3 4; 1 2 3 4; 1 2 3 4; 1 2 3 4]
4×4 Matrix{Int64}:
 1  2  3  4
 1  2  3  4
 1  2  3  4
 1  2  3  4

julia> Tridiagonal(A)
4×4 Tridiagonal{Int64, Vector{Int64}}:
 1  2  ⋅  ⋅
 1  2  3  ⋅
 ⋅  2  3  4
 ⋅  ⋅  3  4
source
LinearAlgebra.SymmetricType
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)).

source
LinearAlgebra.HermitianType
Гермицианская(A::AbstractMatrix, uplo::Symbol=:U)

Создает представление Гермицианская верхнего (если uplo = :U) или нижнего (если uplo = :L) треугольника матрицы A.

Чтобы вычислить гермицианскую часть A, используйте hermitianpart.

Примеры

julia> A = [1 2+2im 3-3im; 4 5 6-6im; 7 8+8im 9]
3×3 Matrix{Complex{Int64}}:
 1+0im  2+2im  3-3im
 4+0im  5+0im  6-6im
 7+0im  8+8im  9+0im

julia> Hupper = Hermitian(A)
3×3 Hermitian{Complex{Int64}, Matrix{Complex{Int64}}}:
 1+0im  2+2im  3-3im
 2-2im  5+0im  6-6im
 3+3im  6+6im  9+0im

julia> Hlower = Hermitian(A, :L)
3×3 Hermitian{Complex{Int64}, Matrix{Complex{Int64}}}:
 1+0im  4+0im  7+0im
 4+0im  5+0im  8-8im
 7+0im  8+8im  9+0im

julia> hermitianpart(A)
3×3 Hermitian{ComplexF64, Matrix{ComplexF64}}:
 1.0+0.0im  3.0+1.0im  5.0-1.5im
 3.0-1.0im  5.0+0.0im  7.0-7.0im
 5.0+1.5im  7.0+7.0im  9.0+0.0im

Обратите внимание, что Hupper не будет равен Hlower, если только A не является гермицианской (например, если A == adjoint(A)).

Все невещественные части диагонали будут проигнорированы.

Hermitian(fill(complex(1,1), 1, 1)) == fill(1, 1, 1)
source
LinearAlgebra.LowerTriangularType
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
source
LinearAlgebra.UpperTriangularType
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
source
LinearAlgebra.UnitLowerTriangularType
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
source
LinearAlgebra.UnitUpperTriangularType
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
source
LinearAlgebra.UpperHessenbergType
UpperHessenberg(A::AbstractMatrix)

Создает представление UpperHessenberg матрицы A. Элементы A, находящиеся ниже первой поддиагонали, игнорируются.

Julia 1.3

Этот тип был добавлен в 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
source
LinearAlgebra.UniformScalingType
UniformScaling{T<:Number}

Генерически размерный оператор равномерного масштабирования, определяемый как скаляр, умноженный на оператор единичной матрицы, λ*I. Хотя у него нет явного size, он действует аналогично матрице во многих случаях и поддерживает некоторую индексацию. См. также I.

Julia 1.6

Индексация с использованием диапазонов доступна начиная с 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
source
LinearAlgebra.IConstant
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
source
LinearAlgebra.UniformScalingMethod
(I::UniformScaling)(n::Integer)

Создает матрицу Diagonal из UniformScaling.

Julia 1.2

Этот метод доступен начиная с 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
source
LinearAlgebra.LUType
LU <: Factorization

Тип разложения матрицы для разложения LU квадратной матрицы A. Это тип возвращаемого значения функции lu, соответствующей функции разложения матрицы.

Индивидуальные компоненты разложения F::LU можно получить с помощью getproperty:

КомпонентОписание
F.LL (единичная нижняя треугольная) часть LU
F.UU (верхняя треугольная) часть LU
F.p(правое) перестановочное Vector
F.P(правое) перестановочное Matrix

Итерация по разложению производит компоненты F.L, F.U и F.p.

Примеры

julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
 4  3
 6  3

julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L factor:
2×2 Matrix{Float64}:
 1.0       0.0
 0.666667  1.0
U factor:
2×2 Matrix{Float64}:
 6.0  3.0
 0.0  1.0

julia> F.L * F.U == A[F.p, :]
true

julia> l, u, p = lu(A); # деструктуризация через итерацию

julia> l == F.L && u == F.U && p == F.p
true
source
LinearAlgebra.luFunction
lu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU

Вычисляет LU-разложение разреженной матрицы A.

Для разреженной A с элементами типа real или complex, возвращаемый тип F — это UmfpackLU{Tv, Ti}, где Tv = Float64 или ComplexF64 соответственно, а Ti — это целочисленный тип (Int32 или Int64).

Когда check = true, возникает ошибка, если разложение не удалось. Когда check = false, ответственность за проверку корректности разложения (через issuccess) лежит на пользователе.

Перестановка q может быть либо вектором перестановки, либо nothing. Если вектор перестановки не предоставлен или q равно nothing, используется значение по умолчанию UMFPACK. Если перестановка не основана на нуле, создается копия, основанная на нуле.

Вектор control по умолчанию соответствует конфигурации по умолчанию пакета Julia SparseArrays для UMFPACK (NB: это изменено из значений по умолчанию UMFPACK для отключения итеративной доработки), но может быть изменен путем передачи вектора длиной UMFPACK_CONTROL, см. руководство UMFPACK для возможных конфигураций. Например, чтобы повторно включить итеративную доработку:

umfpack_control = SparseArrays.UMFPACK.get_umfpack_control(Float64, Int64) # прочитать конфигурацию по умолчанию Julia для разреженной матрицы Float64
SparseArrays.UMFPACK.show_umf_ctrl(umfpack_control) # необязательно - отобразить значения
umfpack_control[SparseArrays.UMFPACK.JL_UMFPACK_IRSTEP] = 2.0 # повторно включить итеративную доработку (2 - это максимальное количество итеративных шагов по умолчанию UMFPACK)

Alu = lu(A; control = umfpack_control)
x = Alu \ b   # решить Ax = b, включая итеративную доработку UMFPACK

Индивидуальные компоненты разложения F могут быть доступны через индексацию:

КомпонентОписание
LL (нижняя треугольная) часть LU
UU (верхняя треугольная) часть LU
pправая перестановка Vector
qлевая перестановка Vector
RsVector коэффициентов масштабирования
:компоненты (L,U,p,q,Rs)

Связь между F и A следующая:

F.L*F.U == (F.Rs .* A)[F.p, F.q]

F также поддерживает следующие функции:

См. также lu!

Note

lu(A::AbstractSparseMatrixCSC) использует библиотеку UMFPACK[ACM832], которая является частью SuiteSparse. Поскольку эта библиотека поддерживает только разреженные матрицы с элементами Float64 или ComplexF64, lu преобразует A в копию, которая имеет тип SparseMatrixCSC{Float64} или SparseMatrixCSC{ComplexF64} в зависимости от ситуации.

source
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.LL (нижняя треугольная) часть LU
F.UU (верхняя треугольная) часть LU
F.p(правое) перестановка Vector
F.P(правое) перестановка Matrix

Итерация по разложению производит компоненты F.L, F.U и F.p.

Связь между F и A такова:

F.L*F.U == A[F.p, :]

F дополнительно поддерживает следующие функции:

Поддерживаемая функцияLULU{T,Tridiagonal{T}}
/
\
inv
det
logdet
logabsdet
size
Julia 1.11

Аргумент ключевого слова allowsingular был добавлен в Julia 1.11.

Примеры

julia> A = [4 3; 6 3]
2×2 Matrix{Int64}:
 4  3
 6  3

julia> F = lu(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L фактор:
2×2 Matrix{Float64}:
 1.0       0.0
 0.666667  1.0
U фактор:
2×2 Matrix{Float64}:
 6.0  3.0
 0.0  1.0

julia> F.L * F.U == A[F.p, :]
true

julia> l, u, p = lu(A); # деструктуризация через итерацию

julia> l == F.L && u == F.U && p == F.p
true

julia> lu([1 2; 1 2], allowsingular = true)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L фактор:
2×2 Matrix{Float64}:
 1.0  0.0
 1.0  1.0
U фактор (с недостаточным рангом):
2×2 Matrix{Float64}:
 1.0  2.0
 0.0  0.0
source
LinearAlgebra.lu!Function
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

Note

lu!(F::UmfpackLU, A::AbstractSparseMatrixCSC) использует библиотеку UMFPACK, которая является частью SuiteSparse. Поскольку эта библиотека поддерживает только разреженные матрицы с элементами Float64 или ComplexF64, lu! автоматически преобразует типы в те, которые установлены LU-разложением или SparseMatrixCSC{ComplexF64} по мере необходимости.

Julia 1.5

lu! для UmfpackLU требует как минимум Julia 1.5.

Примеры

julia> A = sparse(Float64[1.0 2.0; 0.0 3.0]);

julia> F = lu(A);

julia> B = sparse(Float64[1.0 1.0; 0.0 1.0]);

julia> lu!(F, B);

julia> F \ ones(2)
2-element Vector{Float64}:
 0.0
 1.0
source
lu!(A, pivot = RowMaximum(); check = true, allowsingular = false) -> LU

lu! такой же, как lu, но экономит место, перезаписывая входные данные A, вместо создания копии. Исключение InexactError выбрасывается, если факторизация производит число, которое не может быть представлено типом элемента A, например, для целочисленных типов.

Julia 1.11

Аргумент ключевого слова allowsingular был добавлен в Julia 1.11.

Примеры

julia> A = [4. 3.; 6. 3.]
2×2 Matrix{Float64}:
 4.0  3.0
 6.0  3.0

julia> F = lu!(A)
LU{Float64, Matrix{Float64}, Vector{Int64}}
L фактор:
2×2 Matrix{Float64}:
 1.0       0.0
 0.666667  1.0
U фактор:
2×2 Matrix{Float64}:
 6.0  3.0
 0.0  1.0

julia> iA = [4 3; 6 3]
2×2 Matrix{Int64}:
 4  3
 6  3

julia> lu!(iA)
ERROR: InexactError: Int64(0.6666666666666666)
Stacktrace:
[...]
source
LinearAlgebra.CholeskyType
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; # деструктуризация через итерацию

julia> l == C.L && u == C.U
true
source
LinearAlgebra.CholeskyPivotedType
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 фактор с рангом 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
 4.0  2.0  3.0  1.0
  ⋅   0.0  6.0  2.0
  ⋅    ⋅   9.0  3.0
  ⋅    ⋅    ⋅   1.0
перестановка:
4-элементный вектор{Int64}:
 4
 2
 3
 1

julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true

julia> l, u = C; # деструктуризация через итерацию

julia> l == C.L && u == C.U
true
source
LinearAlgebra.choleskyFunction
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 фактор:
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
source
cholesky(A, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

Вычисляет разложение по методу Холецкого с учетом перестановок для плотной симметричной положительно полупределенной матрицы A и возвращает разложение CholeskyPivoted. Матрица A может быть либо Symmetric, либо Hermitian AbstractMatrix или совершенно симметричной или эрмитовой AbstractMatrix.

Треугольный фактор Холецкого можно получить из разложения F с помощью F.L и F.U, а перестановку — с помощью F.p, где A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr' с Ur = F.U[1:F.rank, :] и Lr = F.L[:, 1:F.rank], или альтернативно A ≈ Up' * Up ≈ Lp * Lp' с Up = F.U[1:F.rank, invperm(F.p)] и Lp = F.L[invperm(F.p), 1:F.rank].

Следующие функции доступны для объектов CholeskyPivoted: size, \, inv, det и rank.

Аргумент tol определяет допустимую погрешность для определения ранга. Для отрицательных значений допустимая погрешность равна машинной точности.

Если у вас есть матрица A, которая слегка не является эрмитовой из-за ошибок округления при ее построении, оберните ее в Hermitian(A) перед передачей в cholesky, чтобы рассматривать ее как совершенно эрмитовую.

Когда check = true, возникает ошибка, если разложение не удалось. Когда check = false, ответственность за проверку корректности разложения (с помощью issuccess) лежит на пользователе.

Примеры

julia> X = [1.0, 2.0, 3.0, 4.0];

julia> A = X * X';

julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U фактор с рангом 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
 4.0  2.0  3.0  1.0
  ⋅   0.0  6.0  2.0
  ⋅    ⋅   9.0  3.0
  ⋅    ⋅    ⋅   1.0
перестановка:
4-элементный вектор Vector{Int64}:
 4
 2
 3
 1

julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true

julia> l, u = C; # деструктуризация через итерацию

julia> l == C.L && u == C.U
true
source
cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor

Вычисляет разложение Холецкого разреженной положительно определенной матрицы A. A должна быть SparseMatrixCSC или Symmetric/Hermitian представлением SparseMatrixCSC. Обратите внимание, что даже если у A нет типа, она все равно должна быть симметричной или эрмитовой. Если perm не задан, используется перестановка, уменьшающая заполнение. F = cholesky(A) чаще всего используется для решения систем уравнений с F\b, но также методы diag, det и logdet определены для F. Вы также можете извлечь отдельные факторы из F, используя F.L. Однако, поскольку поворот включен по умолчанию, разложение внутренне представлено как A == P'*L*L'*P с матрицей перестановки P; использование только L без учета P даст неправильные ответы. Чтобы учесть эффекты перестановки, обычно предпочтительно извлекать "комбинированные" факторы, такие как PtL = F.PtL (эквивалент P'*L) и LtP = F.UP (эквивалент L'*P).

Когда check = true, возникает ошибка, если разложение не удалось. Когда check = false, ответственность за проверку действительности разложения (через issuccess) лежит на пользователе.

Установка необязательного аргумента ключевого слова shift вычисляет разложение A+shift*I вместо A. Если аргумент perm предоставлен, он должен быть перестановкой 1:size(A,1), задающей порядок, который следует использовать (вместо стандартного порядка AMD от CHOLMOD).

Примеры

В следующем примере используемая перестановка, уменьшающая заполнение, равна [3, 2, 1]. Если perm установлен на 1:3, чтобы не применять перестановку, количество ненулевых элементов в факторе равно 6.

julia> A = [2 1 1; 1 2 0; 1 0 2]
3×3 Matrix{Int64}:
 2  1  1
 1  2  0
 1  0  2

julia> C = cholesky(sparse(A))
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type:    LLt
method:  simplicial
maxnnz:  5
nnz:     5
success: true

julia> C.p
3-element Vector{Int64}:
 3
 2
 1

julia> L = sparse(C.L);

julia> Matrix(L)
3×3 Matrix{Float64}:
 1.41421   0.0       0.0
 0.0       1.41421   0.0
 0.707107  0.707107  1.0

julia> L * L' ≈ A[C.p, C.p]
true

julia> P = sparse(1:3, C.p, ones(3))
3×3 SparseMatrixCSC{Float64, Int64} with 3 stored entries:
  ⋅    ⋅   1.0
  ⋅   1.0   ⋅
 1.0   ⋅    ⋅

julia> P' * L * L' * P ≈ A
true

julia> C = cholesky(sparse(A), perm=1:3)
SparseArrays.CHOLMOD.Factor{Float64, Int64}
type:    LLt
method:  simplicial
maxnnz:  6
nnz:     6
success: true

julia> L = sparse(C.L);

julia> Matrix(L)
3×3 Matrix{Float64}:
 1.41421    0.0       0.0
 0.707107   1.22474   0.0
 0.707107  -0.408248  1.1547

julia> L * L' ≈ A
true
Note

Этот метод использует библиотеку CHOLMOD[ACM887][DavisHager2009] из SuiteSparse. CHOLMOD поддерживает только действительные или комплексные типы в одинарной или двойной точности. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в эти типы по мере необходимости.

Многие другие функции из CHOLMOD обернуты, но не экспортированы из модуля Base.SparseArrays.CHOLMOD.

source
LinearAlgebra.cholesky!Function
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:
[...]
source
cholesky!(A::AbstractMatrix, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

То же самое, что и cholesky, но экономит место, перезаписывая входной A, вместо создания копии. Исключение InexactError выбрасывается, если факторизация производит число, которое не может быть представлено типом элемента A, например, для целочисленных типов.

source
cholesky!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor

Вычисляет разложение Холецкого ($LL'$) матрицы A, повторно используя символическое разложение F. A должна быть SparseMatrixCSC или Symmetric/ Hermitian представлением SparseMatrixCSC. Обратите внимание, что даже если у A нет типа, она все равно должна быть симметричной или эрмитовой.

Смотрите также cholesky.

Note

Этот метод использует библиотеку CHOLMOD из SuiteSparse, которая поддерживает только вещественные или комплексные типы в одинарной или двойной точности. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в эти типы по мере необходимости.

source
LinearAlgebra.lowrankupdateFunction
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) операций.

source
lowrankupdate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor

Получите LDLt факторизацию A + C*C', учитывая LDLt или LLt факторизацию F для A.

Возвращаемый фактор всегда является LDLt факторизацией.

Смотрите также lowrankupdate!, lowrankdowndate, lowrankdowndate!.

source
LinearAlgebra.lowrankdowndateFunction
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) операций.

source
lowrankdowndate(F::CHOLMOD.Factor, C::AbstractArray) -> FF::CHOLMOD.Factor

Получите LDLt факторизацию A + C*C', учитывая LDLt или LLt факторизацию F от A.

Возвращаемый фактор всегда является LDLt факторизацией.

Смотрите также lowrankdowndate!, lowrankupdate, lowrankupdate!.

source
LinearAlgebra.lowrankupdate!Function
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 уничтожается во время вычисления.

source
lowrankupdate!(F::CHOLMOD.Factor, C::AbstractArray)

Обновляет LDLt или LLt факторизацию F матрицы A до факторизации матрицы A + C*C'.

Факторизации LLt преобразуются в LDLt.

Смотрите также lowrankupdate, lowrankdowndate, lowrankdowndate!.

source
LinearAlgebra.lowrankdowndate!Function
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 уничтожается во время вычисления.

source
lowrankdowndate!(F::CHOLMOD.Factor, C::AbstractArray)

Обновляет разложение LDLt или LLt F матрицы A до разложения матрицы A - C*C'.

Разложения LLt преобразуются в LDLt.

Смотрите также lowrankdowndate, lowrankupdate, lowrankupdate!.

source
LinearAlgebra.LDLtType
LDLt <: Factorization

Тип разложения матрицы LDLt для вещественной SymTridiagonal матрицы S, такая что S = L*Diagonal(d)*L', где L — это матрица UnitLowerTriangular, а d — вектор. Основное применение разложения LDLt F = ldlt(S) — решение системы линейных уравнений Sx = b с помощью F\b. Это тип возвращаемого значения функции ldlt, соответствующей функции разложения матрицы.

Индивидуальные компоненты разложения F::LDLt можно получить с помощью getproperty:

КомпонентОписание
F.LL (единичная нижняя треугольная) часть LDLt
F.DD (диагональная) часть LDLt
F.LtLt (единичная верхняя треугольная) часть LDLt
F.dдиагональные значения D в виде Vector

Примеры

julia> S = SymTridiagonal([3., 4., 5.], [1., 2.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 3.0  1.0   ⋅
 1.0  4.0  2.0
  ⋅   2.0  5.0

julia> F = ldlt(S)
LDLt{Float64, SymTridiagonal{Float64, Vector{Float64}}}
L фактор:
3×3 UnitLowerTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}:
 1.0        ⋅         ⋅
 0.333333  1.0        ⋅
 0.0       0.545455  1.0
D фактор:
3×3 Diagonal{Float64, Vector{Float64}}:
 3.0   ⋅        ⋅
  ⋅   3.66667   ⋅
  ⋅    ⋅       3.90909
source
LinearAlgebra.ldltFunction
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.3488372093023255
source
ldlt(A::SparseMatrixCSC; shift = 0.0, check = true, perm=nothing) -> CHOLMOD.Factor

Вычисляет факторизацию $LDL'$ разреженной матрицы A. A должна быть SparseMatrixCSC или Symmetric/Hermitian представлением SparseMatrixCSC. Обратите внимание, что даже если у A нет типа, она все равно должна быть симметричной или эрмитовой. Используется перестановка, уменьшающая заполнение. F = ldlt(A) чаще всего используется для решения систем уравнений A*x = b с помощью F\b. Возвращаемый объект факторизации F также поддерживает методы diag, det, logdet и inv. Вы можете извлечь отдельные факторы из F, используя F.L. Однако, поскольку поворот включен по умолчанию, факторизация внутренне представлена как A == P'*L*D*L'*P с матрицей перестановки P; использование только L без учета P даст неправильные ответы. Чтобы учесть эффекты перестановки, обычно предпочтительно извлекать "комбинированные" факторы, такие как PtL = F.PtL (эквивалент P'*L) и LtP = F.UP (эквивалент L'*P). Полный список поддерживаемых факторов: :L, :PtL, :D, :UP, :U, :LD, :DU, :PtLD, :DUP.

Когда check = true, возникает ошибка, если разложение не удалось. Когда check = false, ответственность за проверку действительности разложения (через issuccess) лежит на пользователе.

Установка необязательного аргумента shift вычисляет факторизацию A+shift*I вместо A. Если аргумент perm предоставлен, он должен быть перестановкой 1:size(A,1), задающей порядок, который следует использовать (вместо стандартного порядка AMD от CHOLMOD).

Note

Этот метод использует библиотеку CHOLMOD[ACM887][DavisHager2009] из SuiteSparse. CHOLMOD поддерживает только действительные или комплексные типы в одинарной или двойной точности. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в эти типы по мере необходимости.

Многие другие функции из CHOLMOD обернуты, но не экспортированы из модуля Base.SparseArrays.CHOLMOD.

source
LinearAlgebra.ldlt!Function
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.90909
source
ldlt!(F::CHOLMOD.Factor, A::SparseMatrixCSC; shift = 0.0, check = true) -> CHOLMOD.Factor

Вычисляет разложение $LDL'$ матрицы A, повторно используя символическое разложение F. A должна быть SparseMatrixCSC или Symmetric/Hermitian представлением SparseMatrixCSC. Обратите внимание, что даже если у A нет типа, она все равно должна быть симметричной или эрмитовой.

См. также ldlt.

Note

Этот метод использует библиотеку CHOLMOD из SuiteSparse, которая поддерживает только вещественные или комплексные типы в одинарной или двойной точности. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в эти типы по мере необходимости.

source
LinearAlgebra.QRType
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) для объекта QR F.
    • Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, где $v_i$ — это $i$-й столбец матрицы V = I + tril(F.factors, -1).
  • τ — это вектор длины min(m,n), содержащий коэффициенты $au_i$.

source
LinearAlgebra.QRCompactWYType
QRCompactWY <: Factorization

QR-матричная факторизация, хранящаяся в компактном блочном формате, обычно получаемая из qr. Если $A$ — это матрица размером m×n, то

\[A = Q R\]

где $Q$ — это ортогональная/унитарная матрица, а $R$ — верхняя треугольная матрица. Это похоже на формат QR, за исключением того, что ортогональная/унитарная матрица $Q$ хранится в формате Compact WY [Schreiber1989]. Для размера блока $n_b$ он хранится как матрица $V$ размером m×n в нижнем трапециевидном формате и матрица $T = (T_1 \; T_2 \; ... \; T_{b-1} \; T_b')$, состоящая из $b = \lceil \min(m,n) / n_b \rceil$ верхних треугольных матриц $T_j$ размером $n_b$×$n_b$ ($j = 1, ..., b-1$) и верхней трапециевидной матрицы $T_b'$ размером $n_b$×$\min(m,n) - (b-1) n_b$ ($j=b$), верхняя квадратная часть которой обозначается как $T_b$, удовлетворяющая

\[Q = \prod_{i=1}^{\min(m,n)} (I - \tau_i v_i v_i^T) = \prod_{j=1}^{b} (I - V_j T_j V_j^T)\]

так что $v_i$ — это $i$-й столбец матрицы $V$, $\tau_i$ — это $i$-й элемент из [diag(T_1); diag(T_2); …; diag(T_b)], а $(V_1 \; V_2 \; ... \; V_b)$ — это левый блок размером m×min(m, n) матрицы $V$. При построении с использованием qr размер блока задается как $n_b = \min(m, n, 36)$.

Итерация разложения производит компоненты Q и R.

Объект имеет два поля:

  • factors, как в типе QR, является матрицей размером m×n.

    • Верхняя треугольная часть содержит элементы $R$, то есть R = triu(F.factors) для объекта QR F.
    • Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, так что V = I + tril(F.factors, -1).
  • T — это матрица размером $n_b$ на $\min(m,n)$, как описано выше. Поддиагональные элементы для каждой треугольной матрицы $T_j$ игнорируются.

Note

Этот формат не следует путать с более старым представлением WY [Bischof1987].

source
LinearAlgebra.QRPivotedType
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) для объекта QR F.
    • Поддиагональная часть содержит отражатели $v_i$, хранящиеся в упакованном формате, где $v_i$ — это $i$-й столбец матрицы V = I + tril(F.factors, -1).
  • τ — это вектор длины min(m,n), содержащий коэффициенты $au_i$.

  • jpvt — это целочисленный вектор длины n, соответствующий перестановке $P$.

source
LinearAlgebra.qrFunction
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].

Note

qr(A::SparseMatrixCSC) использует библиотеку SPQR, которая является частью SuiteSparse. Поскольку эта библиотека поддерживает только разреженные матрицы с элементами Float64 или ComplexF64, начиная с Julia v1.4 qr преобразует A в копию, которая имеет тип SparseMatrixCSC{Float64} или SparseMatrixCSC{ComplexF64} в зависимости от ситуации.

Примеры

julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} с 4 сохраненными элементами:
 1.0   ⋅
 1.0   ⋅
  ⋅   1.0
  ⋅   1.0

julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q фактор:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R фактор:
2×2 SparseMatrixCSC{Float64, Int64} с 2 сохраненными элементами:
 -1.41421    ⋅
   ⋅       -1.41421
Перестановка строк:
4-элементный вектор{Int64}:
 1
 3
 4
 2
Перестановка столбцов:
2-элементный вектор{Int64}:
 1
 2
source
qr(A, pivot = NoPivot(); blocksize) -> F

Вычисляет QR-разложение матрицы A: ортогональная (или унитарная, если A имеет комплексные значения) матрица Q и верхняя треугольная матрица R, такая что

\[A = Q R\]

Возвращаемый объект F хранит разложение в упакованном формате:

  • если pivot == ColumnNorm(), то F является объектом QRPivoted,
  • в противном случае, если элемент типа A является типом BLAS (Float32, Float64, ComplexF32 или ComplexF64), то F является объектом QRCompactWY,
  • в противном случае F является объектом QR.

Индивидуальные компоненты разложения F могут быть получены через доступ к свойствам:

  • F.Q: ортогональная/унитарная матрица Q
  • F.R: верхняя треугольная матрица R
  • F.p: вектор перестановки пивота (QRPivoted только)
  • F.P: матрица перестановки пивота (QRPivoted только)
Note

Каждая ссылка на верхнюю треугольную фактор через F.R выделяет новый массив. Поэтому рекомендуется кэшировать этот массив, например, с помощью R = F.R и продолжать работать с R.

Итерация разложения производит компоненты Q, R, и если существует, p.

Следующие функции доступны для объектов QR: inv, size, и \. Когда A является прямоугольной, \ вернет решение наименьших квадратов, и если решение не уникально, будет возвращено решение с наименьшей нормой. Когда A не полного ранга, требуется разложение с (колонным) пивотом для получения решения с минимальной нормой.

Умножение относительно полной/квадратной или неполной/квадратной Q разрешено, т.е. поддерживаются как F.Q*F.R, так и F.Q*A. Матрицу Q можно преобразовать в обычную матрицу с помощью Matrix. Эта операция возвращает "тонкий" Q-фактор, т.е. если A имеет размер m×n с m>=n, то Matrix(F.Q) дает матрицу размером m×n с ортонормированными столбцами. Чтобы получить "полный" Q-фактор, ортогональную матрицу размером m×m, используйте F.Q*I или collect(F.Q). Если m<=n, то Matrix(F.Q) дает ортогональную матрицу размером m×m.

Размер блока для QR-разложения можно указать с помощью аргумента blocksize :: Integer, когда pivot == NoPivot() и A isa StridedMatrix{<:BlasFloat}. Он игнорируется, когда blocksize > minimum(size(A)). См. QRCompactWY.

Julia 1.4

Аргумент ключевого слова blocksize требует Julia 1.4 или более поздней версии.

Примеры

julia> A = [3.0 -6.0; 4.0 -8.0; 0.0 1.0]
3×2 Matrix{Float64}:
 3.0  -6.0
 4.0  -8.0
 0.0   1.0

julia> F = qr(A)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q фактор: 3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R фактор:
2×2 Matrix{Float64}:
 -5.0  10.0
  0.0  -1.0

julia> F.Q * F.R == A
true
Note

qr возвращает несколько типов, потому что LAPACK использует несколько представлений, которые минимизируют требования к памяти для хранения произведений элементарных отражателей Хаусхолдера, так что матрицы Q и R могут храниться компактно, а не как две отдельные плотные матрицы.

source
LinearAlgebra.qr!Function
qr!(A, pivot = NoPivot(); blocksize)

qr! такое же, как qr, когда A является подтипом AbstractMatrix, но экономит место, перезаписывая входной A, вместо создания копии. Исключение InexactError выбрасывается, если факторизация производит число, которое не может быть представлено типом элемента A, например, для целочисленных типов.

Julia 1.4

Аргумент ключевого слова blocksize требует Julia 1.4 или более поздней версии.

Примеры

julia> a = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> qr!(a)
LinearAlgebra.QRCompactWY{Float64, Matrix{Float64}, Matrix{Float64}}
Q фактор: 2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}
R фактор:
2×2 Matrix{Float64}:
 -3.16228  -4.42719
  0.0      -0.632456

julia> a = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> qr!(a)
ERROR: InexactError: Int64(3.1622776601683795)
Stacktrace:
[...]
source
LinearAlgebra.LQType
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 фактор:
2×2 Matrix{Float64}:
 -8.60233   0.0
  4.41741  -0.697486
Q фактор: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}

julia> S.L * S.Q
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> l, q = S; # деструктуризация через итерацию

julia> l == S.L &&  q == S.Q
true
source
LinearAlgebra.lqFunction
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 фактор:
2×2 Matrix{Float64}:
 -8.60233   0.0
  4.41741  -0.697486
Q фактор: 2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}

julia> S.L * S.Q
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> l, q = S; # деструктуризация через итерацию

julia> l == S.L &&  q == S.Q
true
source
LinearAlgebra.lq!Function
lq!(A) -> LQ

Вычислите LQ факторизацию A, используя входную матрицу в качестве рабочего пространства. См. также lq.

source
LinearAlgebra.BunchKaufmanType
BunchKaufman <: Factorization

Тип матричной факторизации Bunch-Kaufman для симметричной или эрмитовой матрицы A в виде P'UDU'P или P'LDL'P, в зависимости от того, хранится ли верхний (по умолчанию) или нижний треугольник в A. Если A является комплексно симметричной, то U' и L' обозначают неконъюгированные транспонированные матрицы, т.е. transpose(U) и transpose(L) соответственно. Это тип возвращаемого значения функции bunchkaufman, соответствующей функции матричной факторизации.

Если S::BunchKaufman является объектом факторизации, компоненты можно получить через S.D, S.U или S.L в зависимости от значения S.uplo, и S.p.

Итерация по разложению производит компоненты S.D, S.U или S.L в зависимости от значения S.uplo, и S.p.

Примеры

julia> A = Float64.([1 2; 2 3])
2×2 Matrix{Float64}:
 1.0  2.0
 2.0  3.0

julia> S = bunchkaufman(A) # A оборачивается внутренне в Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D фактор:
2×2 Тридиагональная{Float64, Vector{Float64}}:
 -0.333333  0.0
  0.0       3.0
U фактор:
2×2 ЕдиничнаяВерхняяТреугольная{Float64, Matrix{Float64}}:
 1.0  0.666667
  ⋅   1.0
перестановка:
2-элементный Vector{Int64}:
 1
 2

julia> d, u, p = S; # деструктуризация через итерацию

julia> d == S.D && u == S.U && p == S.p
true

julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D фактор:
2×2 Тридиагональная{Float64, Vector{Float64}}:
 3.0   0.0
 0.0  -0.333333
L фактор:
2×2 ЕдиничнаяНижняяТреугольная{Float64, Matrix{Float64}}:
 1.0        ⋅
 0.666667  1.0
перестановка:
2-элементный Vector{Int64}:
 2
 1
source
LinearAlgebra.bunchkaufmanFunction
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 оборачивается внутренне в Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D фактор:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 -0.333333  0.0
  0.0       3.0
U фактор:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.666667
  ⋅   1.0
перестановка:
2-element Vector{Int64}:
 1
 2

julia> d, u, p = S; # деструктуризация через итерацию

julia> d == S.D && u == S.U && p == S.p
true

julia> S.U*S.D*S.U' - S.P*A*S.P'
2×2 Matrix{Float64}:
 0.0  0.0
 0.0  0.0

julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D фактор:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 3.0   0.0
 0.0  -0.333333
L фактор:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
 1.0        ⋅
 0.666667  1.0
перестановка:
2-element Vector{Int64}:
 2
 1

julia> S.L*S.D*S.L' - A[S.p, S.p]
2×2 Matrix{Float64}:
 0.0  0.0
 0.0  0.0
source
LinearAlgebra.bunchkaufman!Function
bunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufman

bunchkaufman! то же самое, что и bunchkaufman, но экономит место, перезаписывая входные данные A, вместо создания копии.

source
LinearAlgebra.EigenType
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; # деструктуризация через итерацию

julia> vals == F.values && vecs == F.vectors
true
source
LinearAlgebra.GeneralizedEigenType
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; # деструктуризация через итерацию

julia> vals == F.values && vecs == F.vectors
true
source
LinearAlgebra.eigvalsFunction
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
source

Для скалярного входа eigvals вернет скаляр.

Примеры

julia> eigvals(-2)
-2
source
eigvals(A, B) -> значения

Вычислите обобщенные собственные значения A и B.

Примеры

julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
 1   0
 0  -1

julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
 0  1
 1  0

julia> eigvals(A,B)
2-element Vector{ComplexF64}:
 0.0 - 1.0im
 0.0 + 1.0im
source
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values

Возвращает собственные значения A. Возможно вычислить только подмножество собственных значений, указав UnitRange irange, охватывающее индексы отсортированных собственных значений, например, от 2-го до 8-го собственных значений.

Примеры

julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 1.0  2.0   ⋅
 2.0  2.0  3.0
  ⋅   3.0  1.0

julia> eigvals(A, 2:2)
1-element Vector{Float64}:
 0.9999999999999996

julia> eigvals(A)
3-element Vector{Float64}:
 -2.1400549446402604
  1.0000000000000002
  5.140054944640259
source
eigvals(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values

Возвращает собственные значения A. Возможно вычислить только подмножество собственных значений, указав пару vl и vu для нижней и верхней границ собственных значений.

Примеры

julia> A = SymTridiagonal([1.; 2.; 1.], [2.; 3.])
3×3 SymTridiagonal{Float64, Vector{Float64}}:
 1.0  2.0   ⋅
 2.0  2.0  3.0
  ⋅   3.0  1.0

julia> eigvals(A, -1, 2)
1-element Vector{Float64}:
 1.0000000000000009

julia> eigvals(A)
3-element Vector{Float64}:
 -2.1400549446402604
  1.0000000000000002
  5.140054944640259
source
LinearAlgebra.eigvals!Function
eigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values

То же самое, что и eigvals, но экономит место, перезаписывая входной A, вместо создания копии. Ключевые слова permute, scale и sortby такие же, как для eigen.

Note

Входная матрица A не будет содержать свои собственные собственные значения после вызова eigvals! - A используется как рабочее пространство.

Примеры

julia> A = [1. 2.; 3. 4.]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> eigvals!(A)
2-element Vector{Float64}:
 -0.3722813232690143
  5.372281323269014

julia> A
2×2 Matrix{Float64}:
 -0.372281  -1.0
  0.0        5.37228
source
eigvals!(A, B; sortby) -> values

То же самое, что и eigvals, но экономит место, перезаписывая входные данные AB), вместо создания копий.

Note

Входные матрицы A и B не будут содержать свои собственные собственные значения после вызова eigvals!. Они используются как рабочие пространства.

Примеры

julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
 0.0  1.0
 1.0  0.0

julia> eigvals!(A, B)
2-element Vector{ComplexF64}:
 0.0 - 1.0im
 0.0 + 1.0im

julia> A
2×2 Matrix{Float64}:
 -0.0  -1.0
  1.0  -0.0

julia> B
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
source
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> values

То же самое, что и eigvals, но экономит место, перезаписывая входные данные A, вместо создания копии. irange - это диапазон индексов собственных значений для поиска - например, от 2-го до 8-го собственных значений.

source
eigvals!(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> values

То же самое, что и eigvals, но экономит место, перезаписывая входные данные A, вместо создания копии. vl — это нижняя граница интервала для поиска собственных значений, а vu — верхняя граница.

source
LinearAlgebra.eigmaxFunction
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` не может иметь комплексные собственные значения.
Stacktrace:
[...]
source
LinearAlgebra.eigminFunction
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` не может иметь комплексные собственные значения.
Stacktrace:
[...]
source
LinearAlgebra.eigvecsFunction
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.5547001962252291
source
eigvecs(A; permute::Bool=true, scale::Bool=true, `sortby`) -> Matrix

Возвращает матрицу M, столбцы которой являются собственными векторами A. (k-й собственный вектор можно получить из среза M[:, k].) Ключевые слова permute, scale и sortby такие же, как для eigen.

Примеры

julia> eigvecs([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
3×3 Matrix{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0
source
eigvecs(A, B) -> Matrix

Возвращает матрицу M, столбцы которой являются обобщенными собственными векторами A и B. (k-й собственный вектор можно получить из среза M[:, k].)

Примеры

julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
 1   0
 0  -1

julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
 0  1
 1  0

julia> eigvecs(A, B)
2×2 Matrix{ComplexF64}:
  0.0+1.0im   0.0-1.0im
 -1.0+0.0im  -1.0-0.0im
source
LinearAlgebra.eigenFunction
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; # деструктуризация через итерацию

julia> vals == F.values && vecs == F.vectors
true
source
eigen(A, B; sortby) -> GeneralizedEigen

Вычисляет обобщенное разложение собственных значений для A и B, возвращая объект факторизации GeneralizedEigen F, который содержит обобщенные собственные значения в F.values и обобщенные собственные векторы в столбцах матрицы F.vectors. Это соответствует решению задачи обобщенного собственного значения вида Ax = λBx, где A, B — матрицы, x — собственный вектор, а λ — собственное значение. (k-й обобщенный собственный вектор можно получить из среза F.vectors[:, k].)

Итерация разложения производит компоненты F.values и F.vectors.

По умолчанию собственные значения и векторы сортируются лексикографически по (real(λ),imag(λ)). Можно передать другую функцию сравнения by(λ) в sortby, или можно передать sortby=nothing, чтобы оставить собственные значения в произвольном порядке.

Примеры

julia> A = [1 0; 0 -1]
2×2 Matrix{Int64}:
 1   0
 0  -1

julia> B = [0 1; 1 0]
2×2 Matrix{Int64}:
 0  1
 1  0

julia> F = eigen(A, B);

julia> F.values
2-element Vector{ComplexF64}:
 0.0 - 1.0im
 0.0 + 1.0im

julia> F.vectors
2×2 Matrix{ComplexF64}:
  0.0+1.0im   0.0-1.0im
 -1.0+0.0im  -1.0-0.0im

julia> vals, vecs = F; # деструктуризация через итерацию

julia> vals == F.values && vecs == F.vectors
true
source
eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, irange::UnitRange) -> Eigen

Вычисляет разложение собственных значений матрицы A, возвращая объект факторизации Eigen F, который содержит собственные значения в F.values и собственные векторы в столбцах матрицы F.vectors. (k-й собственный вектор можно получить из среза F.vectors[:, k].)

Итерация по разложению производит компоненты F.values и F.vectors.

Следующие функции доступны для объектов Eigen: inv, det и isposdef.

UnitRange irange указывает индексы отсортированных собственных значений, которые нужно искать.

Note

Если irange не равен 1:n, где n — это размерность A, то возвращаемая факторизация будет усеченной факторизацией.

source
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 — верхняя граница.

Note

Если [vl, vu] не содержит всех собственных значений матрицы A, то возвращаемая факторизация будет усеченной факторизацией.

source
LinearAlgebra.eigen!Function
eigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)

То же самое, что и eigen, но экономит место, перезаписывая входные данные AB), вместо создания копии.

source
LinearAlgebra.HessenbergType
Hessenberg <: Факторизация

Объект Hessenberg представляет собой факторизацию Хессенберга QHQ' квадратной матрицы или сдвиг Q(H+μI)Q' от нее, который создается функцией hessenberg.

source
LinearAlgebra.hessenbergFunction
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 фактор: 3×3 LinearAlgebra.HessenbergQ{Float64, Matrix{Float64}, Vector{Float64}, false}
H фактор:
3×3 UpperHessenberg{Float64, Matrix{Float64}}:
  4.0      -11.3137       -1.41421
 -5.65685    5.0           2.0
   ⋅        -8.88178e-16   1.0

julia> F.Q * F.H * F.Q'
3×3 Matrix{Float64}:
 4.0  9.0  7.0
 4.0  4.0  1.0
 4.0  3.0  2.0

julia> q, h = F; # деструктуризация через итерацию

julia> q == F.Q && h == F.H
true
source
LinearAlgebra.hessenberg!Function
hessenberg!(A) -> Гессенберг

hessenberg! то же самое, что и hessenberg, но экономит место, перезаписывая входные данные A, вместо создания копии.

source
LinearAlgebra.SchurType
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 фактор:
2×2 Matrix{Float64}:
 3.0   9.0
 0.0  -2.0
Z фактор:
2×2 Matrix{Float64}:
  0.961524  0.274721
 -0.274721  0.961524
собственные значения:
2-element Vector{Float64}:
  3.0
 -2.0

julia> F.vectors * F.Schur * F.vectors'
2×2 Matrix{Float64}:
  5.0   7.0
 -2.0  -4.0

julia> t, z, vals = F; # деструктуризация через итерацию

julia> t == F.T && z == F.Z && vals == F.values
true
source
LinearAlgebra.GeneralizedSchurType
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.β.

source
LinearAlgebra.schurFunction
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; # деструктуризация через итерацию

julia> t == F.T && z == F.Z && vals == F.values
true
source
schur(A, B) -> F::GeneralizedSchur

Вычисляет обобщенную факторизацию Шура (или QZ) матриц A и B. (квази) треугольные факторы Шура можно получить из объекта Schur F с помощью F.S и F.T, левые унитарные/ортогональные векторы Шура можно получить с помощью F.left или F.Q, а правые унитарные/ортогональные векторы Шура можно получить с помощью F.right или F.Z, так что A=F.left*F.S*F.right' и B=F.left*F.T*F.right'. Обобщенные собственные значения A и B можно получить с помощью F.α./F.β.

Итерация разложения производит компоненты F.S, F.T, F.Q, F.Z, F.α и F.β.

source
LinearAlgebra.schur!Function
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 фактор:
2×2 Matrix{Float64}:
 3.0   9.0
 0.0  -2.0
Z фактор:
2×2 Matrix{Float64}:
  0.961524  0.274721
 -0.274721  0.961524
собственные значения:
2-элементный Vector{Float64}:
  3.0
 -2.0

julia> A
2×2 Matrix{Float64}:
 3.0   9.0
 0.0  -2.0
source
schur!(A::StridedMatrix, B::StridedMatrix) -> F::GeneralizedSchur

То же самое, что и schur, но использует входные матрицы A и B в качестве рабочего пространства.

source
LinearAlgebra.ordschurFunction
ordschur(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur

Переставляет факторизацию Шура F матрицы A = Z*T*Z' в соответствии с логическим массивом select, возвращая переупорядоченную факторизацию объекта F. Выбранные собственные значения появляются на главной диагонали F.Schur, а соответствующие ведущие столбцы F.vectors образуют ортогональное/унитарное основание соответствующего правого инвариантного подпространства. В реальном случае пара комплексно-сопряженных собственных значений должна быть либо полностью включена, либо полностью исключена через select.

source
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.β.

source
LinearAlgebra.ordschur!Function
ordschur!(F::Schur, select::Union{Vector{Bool},BitVector}) -> F::Schur

То же самое, что и ordschur, но перезаписывает факторизацию F.

source
ordschur!(F::GeneralizedSchur, select::Union{Vector{Bool},BitVector}) -> F::GeneralizedSchur

То же самое, что и ordschur, но перезаписывает факторизацию F.

source
LinearAlgebra.SVDType
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
сингулярные значения:
4-element Vector{Float64}:
 3.0
 2.23606797749979
 2.0
 0.0
Vt factor:
4×5 Matrix{Float64}:
 -0.0        0.0  1.0  -0.0  0.0
  0.447214   0.0  0.0   0.0  0.894427
  0.0       -1.0  0.0   0.0  0.0
  0.0        0.0  0.0   1.0  0.0

julia> F.U * Diagonal(F.S) * F.Vt
4×5 Matrix{Float64}:
 1.0  0.0  0.0  0.0  2.0
 0.0  0.0  3.0  0.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  2.0  0.0  0.0  0.0

julia> u, s, v = F; # деструктуризация через итерацию

julia> u == F.U && s == F.S && v == F.V
true
source
LinearAlgebra.GeneralizedSVDType
GeneralizedSVD <: Factorization

Тип матричной факторизации обобщенного сингулярного разложения (SVD) двух матриц A и B, так что A = F.U*F.D1*F.R0*F.Q' и B = F.V*F.D2*F.R0*F.Q'. Это тип возвращаемого значения функции svd(_, _), соответствующей функции матричной факторизации.

Для матрицы A размером M на N и матрицы B размером P на N,

  • U — это ортогональная матрица размером M на M,
  • V — это ортогональная матрица размером P на P,
  • Q — это ортогональная матрица размером N на N,
  • D1 — это диагональная матрица размером M на (K+L) с единицами в первых K элементах,
  • D2 — это матрица размером P на (K+L), у которой верхний правый блок размером L на L является диагональным,
  • R0 — это матрица размером (K+L) на N, у которой правый блок размером (K+L) на (K+L) является невырожденной верхней блочной треугольной матрицей,

K+L — это эффективный числовой ранг матрицы [A; B].

Итерация разложения производит компоненты U, V, Q, D1, D2 и R0.

Элементы F.D1 и F.D2 взаимосвязаны, как объясняется в документации LAPACK для обобщенного SVD и процедуры xGGSVD3, которая вызывается под капотом (в LAPACK 3.6.0 и новее).

Примеры

julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
 0.0  1.0
 1.0  0.0

julia> F = svd(A, B)
GeneralizedSVD{Float64, Matrix{Float64}, Float64, Vector{Float64}}
U factor:
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
V factor:
2×2 Matrix{Float64}:
 -0.0  -1.0
  1.0   0.0
Q factor:
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0
D1 factor:
2×2 Matrix{Float64}:
 0.707107  0.0
 0.0       0.707107
D2 factor:
2×2 Matrix{Float64}:
 0.707107  0.0
 0.0       0.707107
R0 factor:
2×2 Matrix{Float64}:
 1.41421   0.0
 0.0      -1.41421

julia> F.U*F.D1*F.R0*F.Q'
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> F.V*F.D2*F.R0*F.Q'
2×2 Matrix{Float64}:
 -0.0  1.0
  1.0  0.0
source
LinearAlgebra.svdFunction
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().

Julia 1.3

Аргумент ключевого слова alg требует Julia 1.3 или более поздней версии.

Примеры

julia> A = rand(4,3);

julia> F = svd(A); # Сохранить объект разложения

julia> A ≈ F.U * Diagonal(F.S) * F.Vt
true

julia> U, S, V = F; # деструктуризация через итерацию

julia> A ≈ U * Diagonal(S) * V'
true

julia> Uonly, = svd(A); # Сохранить только U

julia> Uonly == U
true
source
svd(A, B) -> GeneralizedSVD

Вычисляет обобщенное SVD матриц A и B, возвращая объект факторизации GeneralizedSVD F, такой что [A;B] = [F.U * F.D1; F.V * F.D2] * F.R0 * F.Q'

  • U — ортогональная матрица размером M на M,
  • V — ортогональная матрица размером P на P,
  • Q — ортогональная матрица размером N на N,
  • D1 — диагональная матрица размером M на (K+L) с единицами в первых K элементах,
  • D2 — матрица размером P на (K+L), верхний правый блок которой размером L на L является диагональным,
  • R0 — матрица размером (K+L) на N, правый блок размером (K+L) на (K+L) которой является невырожденной верхней блочной треугольной матрицей,

K+L — эффективный числовой ранг матрицы [A; B].

Итерация разложения производит компоненты U, V, Q, D1, D2 и R0.

Обобщенное SVD используется в приложениях, таких как сравнение того, сколько принадлежит A, а сколько принадлежит B, например, в сравнении генома человека и дрожжей, или сигнала и шума, или между кластерами и внутри кластеров. (См. обсуждение Эдельмана и Вана: https://arxiv.org/abs/1901.00485)

Оно разлагает [A; B] на [UC; VS]H, где [UC; VS] является естественным ортогональным базисом для столбцового пространства [A; B], а H = RQ' — естественным неортогональным базисом для строкового пространства [A;B], где верхние строки в наибольшей степени относятся к матрице A, а нижние — к матрице B. Матрцы многоугольного косинуса/синуса C и S предоставляют многомерную меру того, сколько A по сравнению с тем, сколько B, а U и V предоставляют направления, в которых это измеряется.

Примеры

julia> A = randn(3,2); B=randn(4,2);

julia> F = svd(A, B);

julia> U,V,Q,C,S,R = F;

julia> H = R*Q';

julia> [A; B] ≈ [U*C; V*S]*H
true

julia> [A; B] ≈ [F.U*F.D1; F.V*F.D2]*F.R0*F.Q'
true

julia> Uonly, = svd(A,B);

julia> U == Uonly
true
source
LinearAlgebra.svd!Function
svd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD

svd! такой же, как svd, но экономит место, перезаписывая входные данные A, вместо создания копии. См. документацию по svd для получения подробной информации.

source
svd!(A, B) -> ОбобщённоеSVD

svd! то же самое, что и svd, но изменяет аргументы A и B на месте, вместо того чтобы создавать их копии. См. документацию по svd для получения подробной информации.

source
LinearAlgebra.svdvalsFunction
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.0
source
svdvals(A, B)

Возвращает обобщенные сингулярные значения из обобщенного сингулярного разложения A и B. См. также svd.

Примеры

julia> A = [1. 0.; 0. -1.]
2×2 Matrix{Float64}:
 1.0   0.0
 0.0  -1.0

julia> B = [0. 1.; 1. 0.]
2×2 Matrix{Float64}:
 0.0  1.0
 1.0  0.0

julia> svdvals(A, B)
2-element Vector{Float64}:
 1.0
 1.0
source
LinearAlgebra.svdvals!Function
svdvals!(A)

Возвращает сингулярные значения A, экономя место, перезаписывая входные данные. См. также svdvals и svd.

source
svdvals!(A, B)

Возвращает обобщенные сингулярные значения из обобщенного сингулярного разложения A и B, экономя место, перезаписывая A и B. См. также svd и svdvals.

source
LinearAlgebra.GivensType
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.

source
LinearAlgebra.givensFunction
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.

source
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.

source
givens(x::AbstractVector, i1::Integer, i2::Integer) -> (G::Givens, r)

Вычисляет вращение Гивенса G и скаляр r, так что результат умножения

B = G*x

имеет свойство, что

B[i1] = r
B[i2] = 0

См. также LinearAlgebra.Givens.

source
LinearAlgebra.triuFunction
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.0
source
triu(M, k::Integer)

Возвращает верхний треугольник M, начиная с k-й наддиагонали.

Примеры

julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> triu(a,3)
4×4 Matrix{Float64}:
 0.0  0.0  0.0  1.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0

julia> triu(a,-3)
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
source
LinearAlgebra.triu!Function
triu!(M)

Верхний треугольник матрицы, перезаписывая M в процессе. См. также triu.

source
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
source
LinearAlgebra.trilFunction
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.0
source
tril(M, k::Integer)

Возвращает нижний треугольник M, начиная с k-й наддиагонали.

Примеры

julia> a = fill(1.0, (4,4))
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> tril(a,3)
4×4 Matrix{Float64}:
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0
 1.0  1.0  1.0  1.0

julia> tril(a,-3)
4×4 Matrix{Float64}:
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  0.0
 1.0  0.0  0.0  0.0
source
LinearAlgebra.tril!Function
tril!(M)

Нижний треугольник матрицы, перезаписывая M в процессе. См. также tril.

source
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
source
LinearAlgebra.diagindFunction
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)
Julia 1.11

Указание IndexStyle требует как минимум Julia 1.11.

source
LinearAlgebra.diagFunction
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
source
LinearAlgebra.diagmFunction
diagm(kv::Pair{<:Integer,<:AbstractVector}...)
diagm(m::Integer, n::Integer, kv::Pair{<:Integer,<:AbstractVector}...)

Создает матрицу из Pair диагоналей и векторов. Вектор kv.second будет размещен на диагонали kv.first. По умолчанию матрица квадратная, и ее размер определяется из kv, но можно указать прямоугольный размер m×n (дополняя нулями по мере необходимости), передав m,n в качестве первых аргументов. Для повторяющихся индексов диагоналей kv.first значения в соответствующих векторах kv.second будут складываться.

diagm создает полную матрицу; если вам нужны версии с эффективным хранением и быстрой арифметикой, смотрите Diagonal, Bidiagonal Tridiagonal и SymTridiagonal.

Примеры

julia> diagm(1 => [1,2,3])
4×4 Matrix{Int64}:
 0  1  0  0
 0  0  2  0
 0  0  0  3
 0  0  0  0

julia> diagm(1 => [1,2,3], -1 => [4,5])
4×4 Matrix{Int64}:
 0  1  0  0
 4  0  2  0
 0  5  0  3
 0  0  0  0

julia> diagm(1 => [1,2,3], 1 => [1,2,3])
4×4 Matrix{Int64}:
 0  2  0  0
 0  0  4  0
 0  0  0  6
 0  0  0  0
source
diagm(v::AbstractVector)
diagm(m::Integer, n::Integer, v::AbstractVector)

Создает матрицу с элементами вектора в качестве диагональных элементов. По умолчанию матрица квадратная, и ее размер задается length(v), но можно указать прямоугольный размер m×n, передав m,n в качестве первых аргументов.

Примеры

julia> diagm([1,2,3])
3×3 Matrix{Int64}:
 1  0  0
 0  2  0
 0  0  3
source
LinearAlgebra.rankFunction
rank(::QRSparse{Tv,Ti}) -> Ti

Возвращает ранг QR-разложения

source
rank(S::SparseMatrixCSC{Tv,Ti}; [tol::Real]) -> Ti

Вычисляет ранг S, вычисляя его QR-факторизацию. Значения меньше tol считаются нулевыми. См. руководство SPQR.

source
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.

Note

Численный ранг может быть чувствительной и неточной характеристикой плохо обусловленных матриц с сингулярными значениями, близкими к предельному допуску max(atol, rtol*σ₁). В таких случаях небольшие изменения в вычислении сингулярных значений или в самой матрице могут изменить результат rank, переместив одно или несколько сингулярных значений через порог. Эти вариации могут даже происходить из-за изменений в ошибках с плавающей запятой между различными версиями Julia, архитектурами, компиляторами или операционными системами.

Julia 1.1

Аргументы ключевых слов 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
source
LinearAlgebra.normFunction
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)
true
source
norm(x::Number, p::Real=2)

Для чисел верните $\left( |x|^p \right)^{1/p}$.

Примеры

julia> norm(2, 1)
2.0

julia> norm(-2, 1)
2.0

julia> norm(2, 2)
2.0

julia> norm(-2, 2)
2.0

julia> norm(2, Inf)
2.0

julia> norm(-2, Inf)
2.0
source
LinearAlgebra.opnormFunction
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.0
source
opnorm(x::Number, p::Real=2)

Для чисел вернуть $\left( |x|^p \right)^{1/p}$. Это эквивалентно norm.

source
opnorm(A::Adjoint{<:Any,<:AbstractVector}, q::Real=2)
opnorm(A::Transpose{<:Any,<:AbstractVector}, q::Real=2)

Для векторов, обернутых в Adjoint/Transpose, возвращает операторную $q$-норму A, которая эквивалентна p-норме со значением p = q/(q-1). Они совпадают при p = q = 2. Используйте norm, чтобы вычислить p норму A как вектора.

Разница в норме между векторным пространством и его двойственным возникает для сохранения взаимосвязи между двойственностью и скалярным произведением, и результат согласуется с операторной p-нормой матрицы 1 × n.

Примеры

julia> v = [1; im];

julia> vc = v';

julia> opnorm(vc, 1)
1.0

julia> norm(vc, 1)
2.0

julia> norm(v, 1)
2.0

julia> opnorm(vc, 2)
1.4142135623730951

julia> norm(vc, 2)
1.4142135623730951

julia> norm(v, 2)
1.4142135623730951

julia> opnorm(vc, Inf)
2.0

julia> norm(vc, Inf)
1.0

julia> norm(v, Inf)
1.0
source
LinearAlgebra.normalize!Function
normalize!(a::AbstractArray, p::Real=2)

Нормализуйте массив a на месте так, чтобы его p-норма равнялась единице, т.е. norm(a, p) == 1. См. также normalize и norm.

source
LinearAlgebra.normalizeFunction
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
source
LinearAlgebra.condFunction
cond(M, p::Real=2)

Число обусловленности матрицы M, вычисляемое с использованием оператора p-нормы. Допустимые значения для p1, 2 (по умолчанию) или Inf.

source
LinearAlgebra.condskeelFunction
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}\]

Число обусловленности Скела $\kappa_S$ матрицы M, опционально относительно вектора x, вычисляемое с использованием оператора p-нормы. $\left\vert M \right\vert$ обозначает матрицу (поэлементных) абсолютных значений $M$; $\left\vert M \right\vert_{ij} = \left\vert M_{ij} \right\vert$. Допустимые значения для p1, 2 и Inf (по умолчанию).

Эта величина также известна в литературе как число обусловленности Бауэра, относительное число обусловленности или компонентное относительное число обусловленности.

source
LinearAlgebra.trFunction
tr(M)

След матрицы. Суммирует диагональные элементы M.

Примеры

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> tr(A)
5
source
LinearAlgebra.detFunction
det(M)

Определитель матрицы.

Смотрите также: logdet и logabsdet.

Примеры

julia> M = [1 0; 2 2]
2×2 Matrix{Int64}:
 1  0
 2  2

julia> det(M)
2.0
source
LinearAlgebra.logdetFunction
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
source
LinearAlgebra.logabsdetFunction
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)
source
Base.invMethod
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
source
LinearAlgebra.pinvFunction
pinv(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
pinv(M, rtol::Real) = pinv(M; rtol=rtol) # будет устаревшим в Julia 2.0

Вычисляет псдониверс Мура-Пенроуза.

Для матриц M с элементами с плавающей точкой удобно вычислять псдониверс, инвертируя только сингулярные значения, превышающие max(atol, rtol*σ₁), где σ₁ — это наибольшее сингулярное значение M.

Оптимальный выбор абсолютной (atol) и относительной точности (rtol) варьируется как в зависимости от значения M, так и от предполагаемого применения псдониверса. Значение относительной точности по умолчанию равно n*ϵ, где n — это размер наименьшего измерения M, а ϵ — это eps типа элементов M.

Для инверсии плотных плохо обусловленных матриц в смысле наименьших квадратов рекомендуется использовать rtol = sqrt(eps(real(float(oneunit(eltype(M)))))).

Для получения дополнительной информации см. [issue8859], [B96], [S84], [KY88].

Примеры

julia> M = [1.5 1.3; 1.2 1.9]
2×2 Matrix{Float64}:
 1.5  1.3
 1.2  1.9

julia> N = pinv(M)
2×2 Matrix{Float64}:
  1.47287   -1.00775
 -0.930233   1.16279

julia> M * N
2×2 Matrix{Float64}:
 1.0          -2.22045e-16
 4.44089e-16   1.0
source
LinearAlgebra.nullspaceFunction
nullspace(M; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
nullspace(M, rtol::Real) = nullspace(M; rtol=rtol) # будет устаревшим в Julia 2.0

Вычисляет базис для нулевого пространства `M`, включая сингулярные векторы `M`, чьи сингулярные значения имеют величину меньше, чем `max(atol, rtol*σ₁)`, где `σ₁` — это наибольшее сингулярное значение `M`.

По умолчанию относительная точность `rtol` равна `n*ϵ`, где `n` — это размер наименьшего измерения `M`, а `ϵ` — это [`eps`](@ref) типа элементов `M`.

# Примеры

jldoctest julia> M = [1 0 0; 0 1 0; 0 0 0] 3×3 Matrix{Int64}: 1 0 0 0 1 0 0 0 0

julia> nullspace(M) 3×1 Matrix{Float64}: 0.0 0.0 1.0

julia> nullspace(M, rtol=3) 3×3 Matrix{Float64}: 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.0 1.0

julia> nullspace(M, atol=0.95) 3×1 Matrix{Float64}: 0.0 0.0 1.0 ```

source
Base.kronFunction
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
source
Base.kron!Function
kron!(C, A, B)

Вычисляет произведение Кронекера A и B и сохраняет результат в C, перезаписывая существующее содержимое C. Это версия с изменением на месте для kron.

Julia 1.6

Эта функция требует Julia 1.6 или более поздней версии.

source
Base.expMethod
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
source
Base.cisMethod
cis(A::AbstractMatrix)

Более эффективный метод для exp(im*A) квадратной матрицы A (особенно если A является Гермицианской или вещественной Симметричной).

См. также cispi, sincos, exp.

Julia 1.7

Поддержка использования cis с матрицами была добавлена в Julia 1.7.

Примеры

julia> cis([π 0; 0 π]) ≈ -I
true
source
Base.:^Method
^(A::AbstractMatrix, p::Number)

Степень матрицы, эквивалентная $\exp(p\log(A))$

Примеры

julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
 1  26
 0  27
source
Base.:^Method
^(b::Number, A::AbstractMatrix)

Матрица экспонента, эквивалентная $\exp(\log(b)A)$.

Julia 1.1

Поддержка возведения 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
source
Base.logMethod
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
source
Base.sqrtMethod
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 находится ниже разрыва
0.0 - 9.0im

julia> .√(1:4)
4-element Vector{Float64}:
 1.0
 1.4142135623730951
 1.7320508075688772
 2.0
source
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
source
Base.Math.cbrtMethod
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
source
Base.cosMethod
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
source
Base.sinMethod
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
source
Base.Math.sincosMethod
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
source
Base.tanMethod
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
source
Base.Math.secMethod
sec(A::AbstractMatrix)

Вычисляет секанту матрицы для квадратной матрицы A.

source
Base.Math.cscMethod
csc(A::AbstractMatrix)

Вычисляет косекант матрицы для квадратной матрицы A.

source
Base.Math.cotMethod
cot(A::AbstractMatrix)

Вычисляет матричный котангенс квадратной матрицы A.

source
Base.coshMethod
cosh(A::AbstractMatrix)

Вычисляет гиперболический косинус матрицы для квадратной матрицы A.

source
Base.sinhMethod
sinh(A::AbstractMatrix)

Вычисляет гиперболический синус матрицы для квадратной матрицы A.

source
Base.tanhMethod
tanh(A::AbstractMatrix)

Вычисляет гиперболический тангенс матрицы для квадратной матрицы A.

source
Base.Math.sechMethod
sech(A::AbstractMatrix)

Вычисляет гиперболический секанс матрицы квадратной матрицы A.

source
Base.Math.cschMethod
csch(A::AbstractMatrix)

Вычисляет гиперболический косекант матрицы квадратной матрицы A.

source
Base.Math.cothMethod
coth(A::AbstractMatrix)

Вычисляет гиперболический котангенс матрицы квадратной матрицы A.

source
Base.acosMethod
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
source
Base.asinMethod
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
source
Base.atanMethod
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
source
Base.Math.asecMethod
asec(A::AbstractMatrix)

Вычисляет обратную матрицу секанта A.

source
Base.Math.acscMethod
acsc(A::AbstractMatrix)

Вычисляет обратную матрицу косеканта A.

source
Base.Math.acotMethod
acot(A::AbstractMatrix)

Вычисляет обратную матрицу котангенса A.

source
Base.acoshMethod
acosh(A::AbstractMatrix)

Вычисляет обратный гиперболический косинус матрицы A. Для теории и логарифмических формул, используемых для вычисления этой функции, см. [AH16_4].

source
Base.asinhMethod
asinh(A::AbstractMatrix)

Вычисляет обратную гиперболическую матричную синус квадратной матрицы A. Для теории и логарифмических формул, используемых для вычисления этой функции, см. [AH16_5].

source
Base.atanhMethod
atanh(A::AbstractMatrix)

Вычисляет обратную гиперболическую матричную тангенс квадратной матрицы A. Для теории и логарифмических формул, используемых для вычисления этой функции, см. [AH16_6].

source
Base.Math.asechMethod
asech(A::AbstractMatrix)

Вычисляет гиперболический секанс обратной матрицы A.

source
Base.Math.acschMethod
acsch(A::AbstractMatrix)

Вычисляет обратную матричную гиперболическую коскосеканту A.

source
Base.Math.acothMethod
acoth(A::AbstractMatrix)

Вычисляет обратную матричную гиперболическую котангенсу A.

source
LinearAlgebra.lyapFunction
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
source
LinearAlgebra.sylvesterFunction
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
source
LinearAlgebra.issuccessFunction
issuccess(F::Factorization)

Проверьте, что факторизация матрицы удалась.

Julia 1.6

issuccess(::CholeskyPivoted) требует Julia 1.6 или новее.

Примеры

julia> F = cholesky([1 0; 0 1]);

julia> issuccess(F)
true
source
issuccess(F::LU; allowsingular = false)

Проверьте, что LU-разложение матрицы прошло успешно. По умолчанию разложение, которое производит действительное, но недостаточно ранговое U, считается неудачным. Это можно изменить, передав allowsingular = true.

Julia 1.11

Аргумент ключевого слова allowsingular был добавлен в Julia 1.11.

Примеры

julia> F = lu([1 2; 1 2], check = false);

julia> issuccess(F)
false

julia> issuccess(F, allowsingular = true)
true
source
LinearAlgebra.issymmetricFunction
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
source
LinearAlgebra.isposdefFunction
isposdef(A) -> Bool

Проверьте, является ли матрица положительно определенной (и эрмитовой), пытаясь выполнить разложение Холецкого для A.

Смотрите также isposdef!, cholesky.

Примеры

julia> A = [1 2; 2 50]
2×2 Matrix{Int64}:
 1   2
 2  50

julia> isposdef(A)
true
source
LinearAlgebra.isposdef!Function
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
source
LinearAlgebra.istrilFunction
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
source
LinearAlgebra.istriuFunction
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
source
LinearAlgebra.isdiagFunction
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
source
LinearAlgebra.ishermitianFunction
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
source
Base.transposeFunction
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 # транспозиция транспозиции разворачивает родителя
true

julia> Transpose(B) # однако, конструктор всегда оборачивает свой аргумент
2×2 transpose(transpose(::Matrix{Int64})) with eltype Int64:
 3  2
 0  0

julia> B[1,2] = 4; # изменение B автоматически изменит A

julia> A
2×2 Matrix{Int64}:
 3  2
 4  0

Для комплексных матриц операция adjoint эквивалентна сопряженной транспозиции.

julia> A = reshape([Complex(x, x) for x in 1:4], 2, 2)
2×2 Matrix{Complex{Int64}}:
 1+1im  3+3im
 2+2im  4+4im

julia> adjoint(A) == conj(transpose(A))
true

Транспозиция AbstractVector является строковым вектором:

julia> v = [1,2,3]
3-element Vector{Int64}:
 1
 2
 3

julia> transpose(v) # возвращает строковый вектор
1×3 transpose(::Vector{Int64}) with eltype Int64:
 1  2  3

julia> transpose(v) * v # вычисление скалярного произведения
14

Для матрицы матриц отдельные блоки обрабатываются рекурсивно:

julia> C = [1 3; 2 4]
2×2 Matrix{Int64}:
 1  3
 2  4

julia> D = reshape([C, 2C, 3C, 4C], 2, 2) # построение блочной матрицы
2×2 Matrix{Matrix{Int64}}:
 [1 3; 2 4]  [3 9; 6 12]
 [2 6; 4 8]  [4 12; 8 16]

julia> transpose(D) # блоки рекурсивно транспонируются
2×2 transpose(::Matrix{Matrix{Int64}}) with eltype Transpose{Int64, Matrix{Int64}}:
 [1 2; 3 4]   [2 4; 6 8]
 [3 6; 9 12]  [4 8; 12 16]
source
transpose(F::Factorization)

Ленивая транспонирование факторизации F. По умолчанию возвращает TransposeFactorization, за исключением Factorization с действительным eltype, в этом случае возвращает AdjointFactorization.

source
LinearAlgebra.transpose!Function
transpose!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}

Транспонирует матрицу A и сохраняет её в матрице X. size(X) должен быть равен size(transpose(A)). Дополнительная память не выделяется, кроме изменения размера rowval и nzval X, если это необходимо.

См. halfperm!

source
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
source
LinearAlgebra.TransposeType
Транспонирование

Ленивая обертка для представления транспонированного вида основного объекта линейной алгебры, обычно 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
source
LinearAlgebra.TransposeFactorizationType
TransposeFactorization

Ленивая обертка для транспонированного объекта Factorization. Обычно конструктор TransposeFactorization не следует вызывать напрямую, вместо этого используйте transpose(:: Factorization).

source
Base.adjointFunction
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' # эквивалентно adjoint(A)
2×2 adjoint(::Matrix{Complex{Int64}}) with eltype Complex{Int64}:
 3-2im  0+0im
 9-2im  0+0im

julia> B isa Adjoint
true

julia> adjoint(B) === A # сопряженное значение от сопряженного значения разворачивает родителя
true

julia> Adjoint(B) # однако, конструктор всегда оборачивает свой аргумент
2×2 adjoint(adjoint(::Matrix{Complex{Int64}})) with eltype Complex{Int64}:
 3+2im  9+2im
 0+0im  0+0im

julia> B[1,2] = 4 + 5im; # изменение B автоматически изменит A

julia> A
2×2 Matrix{Complex{Int64}}:
 3+2im  9+2im
 4-5im  0+0im

Для вещественных матриц операция adjoint эквивалентна transpose.

julia> A = reshape([x for x in 1:4], 2, 2)
2×2 Matrix{Int64}:
 1  3
 2  4

julia> A'
2×2 adjoint(::Matrix{Int64}) with eltype Int64:
 1  2
 3  4

julia> adjoint(A) == transpose(A)
true

Сопряженное значение AbstractVector - это строковый вектор:

julia> x = [3, 4im]
2-element Vector{Complex{Int64}}:
 3 + 0im
 0 + 4im

julia> x'
1×2 adjoint(::Vector{Complex{Int64}}) with eltype Complex{Int64}:
 3+0im  0-4im

julia> x'x # вычислить скалярное произведение, эквивалентно x' * x
25 + 0im

Для матрицы матриц отдельные блоки обрабатываются рекурсивно:

julia> A = reshape([x + im*x for x in 1:4], 2, 2)
2×2 Matrix{Complex{Int64}}:
 1+1im  3+3im
 2+2im  4+4im

julia> C = reshape([A, 2A, 3A, 4A], 2, 2)
2×2 Matrix{Matrix{Complex{Int64}}}:
 [1+1im 3+3im; 2+2im 4+4im]  [3+3im 9+9im; 6+6im 12+12im]
 [2+2im 6+6im; 4+4im 8+8im]  [4+4im 12+12im; 8+8im 16+16im]

julia> C'
2×2 adjoint(::Matrix{Matrix{Complex{Int64}}}) with eltype Adjoint{Complex{Int64}, Matrix{Complex{Int64}}}:
 [1-1im 2-2im; 3-3im 4-4im]    [2-2im 4-4im; 6-6im 8-8im]
 [3-3im 6-6im; 9-9im 12-12im]  [4-4im 8-8im; 12-12im 16-16im]
source
adjoint(F::Factorization)

Ленивая адъюнктная функция факторизации F. По умолчанию возвращает обертку AdjointFactorization.

source
LinearAlgebra.adjoint!Function
adjoint!(X::AbstractSparseMatrixCSC{Tv,Ti}, A::AbstractSparseMatrixCSC{Tv,Ti}) where {Tv,Ti}

Транспонирует матрицу A и сохраняет адъюнкт элементов в матрице X. size(X) должен быть равен size(transpose(A)). Дополнительная память не выделяется, кроме изменения размера rowval и nzval матрицы X, если это необходимо.

См. halfperm!

source
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
source
LinearAlgebra.AdjointType
Сопряженный

Ленивая обертка для сопряженного представления основного объекта линейной алгебры, обычно это 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
source
LinearAlgebra.AdjointFactorizationType
AdjointFactorization

Ленивая обертка для адъюнкта основного объекта Factorization. Обычно конструктор AdjointFactorization не следует вызывать напрямую, вместо этого используйте adjoint(:: Factorization).

source
Base.copyMethod
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
source
LinearAlgebra.stride1Function
stride1(A) -> Int

Вернуть расстояние между последовательными элементами массива в размерности 1 в единицах размера элемента.

Примеры

julia> A = [1,2,3,4]
4-element Vector{Int64}:
 1
 2
 3
 4

julia> LinearAlgebra.stride1(A)
1

julia> B = view(A, 2:2:4)
2-element view(::Vector{Int64}, 2:2:4) with eltype Int64:
 2
 4

julia> LinearAlgebra.stride1(B)
2
source
LinearAlgebra.checksquareFunction
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
source
LinearAlgebra.peakflopsFunction
LinearAlgebra.peakflops(n::Integer=4096; eltype::DataType=Float64, ntrials::Integer=3, parallel::Bool=false)

peakflops вычисляет пиковую скорость операций с плавающей запятой (flop) компьютера, используя двойную точность gemm!. По умолчанию, если не указаны аргументы, он умножает две матрицы Float64 размером n x n, где n = 4096. Если используемая BLAS поддерживает многопоточность, достигаются более высокие скорости flop. Количество потоков BLAS можно установить с помощью BLAS.set_num_threads(n).

Если указан аргумент ключевого слова eltype, peakflops создаст матрицы с элементами типа eltype для вычисления пикового значения flop.

По умолчанию peakflops будет использовать лучшее время из 3 испытаний. Если указан аргумент ключевого слова ntrials, peakflops будет использовать указанное количество испытаний для выбора лучшего времени.

Если аргумент ключевого слова parallel установлен в true, peakflops выполняется параллельно на всех рабочих процессорах. Возвращается скорость flop всего параллельного компьютера. При выполнении в параллельном режиме используется только 1 поток BLAS. Аргумент n по-прежнему относится к размеру задачи, которая решается на каждом процессоре.

Julia 1.1

Эта функция требует как минимум Julia 1.1. В Julia 1.0 она доступна из стандартной библиотеки InteractiveUtils.

source
LinearAlgebra.hermitianpartFunction
hermitianpart(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian

Возвращает гермитову часть квадратной матрицы A, определяемую как (A + A') / 2, в виде матрицы Hermitian. Для вещественных матриц A это также известно как симметрическая часть A; это также иногда называют "действительной частью оператора". Необязательный аргумент uplo управляет соответствующим аргументом представления Hermitian. Для вещественных матриц последнее эквивалентно представлению Symmetric.

Смотрите также hermitianpart! для соответствующей операции на месте.

Julia 1.10

Эта функция требует Julia 1.10 или более поздней версии.

source
LinearAlgebra.hermitianpart!Function
hermitianpart!(A::AbstractMatrix, uplo::Symbol=:U) -> Hermitian

Перезапишите квадратную матрицу A на месте с её гермитовой частью (A + A') / 2 и верните Hermitian(A, uplo). Для вещественных матриц A это также известно как симметричная часть A.

Смотрите также hermitianpart для соответствующей операции вне места.

Julia 1.10

Эта функция требует Julia 1.10 или более поздней версии.

source
LinearAlgebra.copy_adjoint!Function
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).

source
LinearAlgebra.copy_transpose!Function
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).

source
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!.

source

Low-level matrix operations

Во многих случаях существуют версии операций с матрицами, которые выполняются на месте и позволяют вам предоставить заранее выделенный вектор или матрицу для вывода. Это полезно при оптимизации критически важного кода, чтобы избежать накладных расходов на повторные выделения. Эти операции на месте имеют суффикс ! ниже (например, mul!) в соответствии с обычной конвенцией Julia.

LinearAlgebra.mul!Function
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

Реализация

Для пользовательских типов матриц и векторов рекомендуется реализовать mul! с 5 аргументами, а не реализовывать mul! с 3 аргументами напрямую, если это возможно.

source
mul!(C, A, B, α, β) -> C

Совместное умножение-сложение матриц или векторов $A B α + C β$ с изменением на месте. Результат сохраняется в C, перезаписывая его. Обратите внимание, что C не должен быть алиасом ни для A, ни для B.

Julia 1.3

Функция mul! с пятью аргументами требует как минимум Julia 1.3.

Примеры

julia> A = [1.0 2.0; 3.0 4.0]; B = [1.0 1.0; 1.0 1.0]; C = [1.0 2.0; 3.0 4.0];

julia> α, β = 100.0, 10.0;

julia> mul!(C, A, B, α, β) === C
true

julia> C
2×2 Matrix{Float64}:
 310.0  320.0
 730.0  740.0

julia> C_original = [1.0 2.0; 3.0 4.0]; # Копия оригинального значения C

julia> C == A * B * α + C_original * β
true
source
LinearAlgebra.lmul!Function
lmul!(a::Number, B::AbstractArray)

Масштабирует массив B на скаляр a, перезаписывая B на месте. Используйте rmul!, чтобы умножить скаляр справа. Операция масштабирования уважает семантику умножения * между a и элементом B. В частности, это также относится к умножению, включающему конечные числа, такие как NaN и ±Inf.

Julia 1.1

До Julia 1.1 записи NaN и ±Inf в B обрабатывались непоследовательно.

Примеры

julia> B = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> lmul!(2, B)
2×2 Matrix{Int64}:
 2  4
 6  8

julia> lmul!(0.0, [Inf])
1-element Vector{Float64}:
 NaN
source
lmul!(A, B)

Вычисляет произведение матриц $AB$, перезаписывая B, и возвращает результат. Здесь A должен быть специальным типом матрицы, например, Diagonal, UpperTriangular или LowerTriangular, или некоторым ортогональным типом, см. QR.

Примеры

julia> B = [0 1; 1 0];

julia> A = UpperTriangular([1 2; 0 3]);

julia> lmul!(A, B);

julia> B
2×2 Matrix{Int64}:
 2  1
 3  0

julia> B = [1.0 2.0; 3.0 4.0];

julia> F = qr([0 1; -1 0]);

julia> lmul!(F.Q, B)
2×2 Matrix{Float64}:
 3.0  4.0
 1.0  2.0
source
LinearAlgebra.rmul!Function
rmul!(A::AbstractArray, b::Number)

Масштабирует массив A на скаляр b, перезаписывая A на месте. Используйте lmul!, чтобы умножить скаляр слева. Операция масштабирования уважает семантику умножения * между элементом A и b. В частности, это также относится к умножению, включающему конечные числа, такие как NaN и ±Inf.

Julia 1.1

До Julia 1.1 записи NaN и ±Inf в A обрабатывались непоследовательно.

Примеры

julia> A = [1 2; 3 4]
2×2 Matrix{Int64}:
 1  2
 3  4

julia> rmul!(A, 2)
2×2 Matrix{Int64}:
 2  4
 6  8

julia> rmul!([NaN], 0.0)
1-element Vector{Float64}:
 NaN
source
rmul!(A, B)

Вычисляет произведение матриц $AB$, перезаписывая A, и возвращает результат. Здесь B должен быть специальным типом матрицы, например, Diagonal, UpperTriangular или LowerTriangular, или некоторым ортогональным типом, см. QR.

Примеры

julia> A = [0 1; 1 0];

julia> B = UpperTriangular([1 2; 0 3]);

julia> rmul!(A, B);

julia> A
2×2 Matrix{Int64}:
 0  3
 1  2

julia> A = [1.0 2.0; 3.0 4.0];

julia> F = qr([0 1; -1 0]);

julia> rmul!(A, F.Q)
2×2 Matrix{Float64}:
 2.0  1.0
 4.0  3.0
source
LinearAlgebra.ldiv!Function
ldiv!(Y, A, B) -> Y

Вычисляет A \ B на месте и сохраняет результат в Y, возвращая результат.

Аргумент A не должен быть матрицей. Вместо матриц он должен быть объектом факторизации (например, полученным с помощью factorize или cholesky). Причина в том, что факторизация сама по себе является затратной и обычно выделяет память (хотя ее также можно выполнить на месте с помощью, например, lu!), и в ситуациях, критичных к производительности, требующих ldiv!, обычно также требуется тонкий контроль над факторизацией A.

Note

Определенные структурированные типы матриц, такие как 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
source
ldiv!(A, B)

Вычисляет A \ B на месте, перезаписывая B, чтобы сохранить результат.

Аргумент A не должен быть матрицей. Вместо матриц он должен быть объектом факторизации (например, созданным с помощью factorize или cholesky). Причина этого заключается в том, что факторизация сама по себе является дорогостоящей и обычно требует выделения памяти (хотя это также можно сделать на месте с помощью, например, lu!), и в ситуациях, критически важных для производительности, требующих ldiv!, обычно также требуется тонкий контроль над факторизацией A.

Note

Некоторые структурированные типы матриц, такие как 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
source
ldiv!(a::Number, B::AbstractArray)

Разделите каждую запись в массиве B на скаляр a, перезаписывая B на месте. Используйте rdiv!, чтобы разделить скаляр справа.

Примеры

julia> B = [1.0 2.0; 3.0 4.0]
2×2 Matrix{Float64}:
 1.0  2.0
 3.0  4.0

julia> ldiv!(2.0, B)
2×2 Matrix{Float64}:
 0.5  1.0
 1.5  2.0
source
ldiv!(A::Tridiagonal, B::AbstractVecOrMat) -> B

Вычисляет A \ B на месте с помощью гауссовского исключения с частичным выбором и сохраняет результат в B, возвращая результат. В процессе диагонали A также перезаписываются.

Julia 1.11

ldiv! для левых частей Tridiagonal требует как минимум Julia 1.11.

source
LinearAlgebra.rdiv!Function
rdiv!(A, B)

Вычисляет A / B на месте, перезаписывая A для хранения результата.

Аргумент B не должен быть матрицей. Вместо матриц он должен быть объектом факторизации (например, созданным с помощью factorize или cholesky). Причина этого заключается в том, что факторизация сама по себе является дорогостоящей и обычно выделяет память (хотя это также можно сделать на месте с помощью, например, lu!), и в ситуациях, критически важных для производительности, требующих rdiv!, обычно также требуется тонкий контроль над факторизацией B.

Note

Определенные структурированные типы матриц, такие как Diagonal и UpperTriangular, разрешены, так как они уже находятся в факторизованной форме.

source
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
source

BLAS functions

В Julia (как и во многих научных вычислениях) операции с плотной линейной алгеброй основаны на LAPACK library, который, в свою очередь, построен на основе основных строительных блоков линейной алгебры, известных как BLAS. Существуют высоко оптимизированные реализации BLAS для каждой архитектуры компьютера, и иногда в высокопроизводительных рутинных операциях линейной алгебры полезно вызывать функции BLAS напрямую.

LinearAlgebra.BLAS предоставляет обертки для некоторых функций BLAS. Те функции BLAS, которые перезаписывают один из входных массивов, имеют названия, заканчивающиеся на '!'. Обычно для функции BLAS определено четыре метода для массивов Float32, Float64, ComplexF32 и ComplexF64.

BLAS character arguments

Многие функции BLAS принимают аргументы, которые определяют, нужно ли транспонировать аргумент (trans), какую треугольную часть матрицы использовать (uplo или ul), можно ли считать диагональ треугольной матрицы равной единице (dA) или с какой стороны умножения матриц находится входной аргумент (side). Возможности следующие:

Multiplication order

sideMeaning
'L'The argument goes on the left side of a matrix-matrix operation.
'R'The argument goes on the right side of a matrix-matrix operation.

Triangle referencing

uplo/ulMeaning
'U'Only the upper triangle of the matrix will be used.
'L'Only the lower triangle of the matrix will be used.

Transposition operation

trans/tXMeaning
'N'The input matrix X is not transposed or conjugated.
'T'The input matrix X will be transposed.
'C'The input matrix X will be conjugated and transposed.

Unit diagonal

diag/dXMeaning
'N'The diagonal values of the matrix X will be read.
'U'The diagonal of the matrix X is assumed to be all ones.
LinearAlgebra.BLAS.set_num_threadsFunction
set_num_threads(n::Integer)
set_num_threads(::Nothing)

Установите количество потоков, которые библиотека BLAS должна использовать, равным n::Integer.

Также принимает nothing, в этом случае julia пытается угадать количество потоков по умолчанию. Передача nothing не рекомендуется и в основном существует по историческим причинам.

source
LinearAlgebra.BLAS.get_num_threadsFunction
get_num_threads()

Получите количество потоков, которые использует библиотека BLAS.

Julia 1.6

get_num_threads требует как минимум Julia 1.6.

source

Функции BLAS можно разделить на три группы, также называемые тремя уровнями, в зависимости от того, когда они были впервые предложены, типа входных параметров и сложности операции.

Level 1 BLAS functions

Функции уровня 1 BLAS были впервые предложены в [(Lawson, 1979)][Lawson-1979] и определяют операции между скалярами и векторами.

[Lawson-1979]: https://dl.acm.org/doi/10.1145/355841.355847

LinearAlgebra.BLAS.rot!Function
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.

Julia 1.5

rot! требует как минимум Julia 1.5.

source
LinearAlgebra.BLAS.scal!Function
scal!(n, a, X, incx)
scal!(a, X)

Перезаписывает X как a*X для первых n элементов массива X с шагом incx. Возвращает X.

Если n и incx не указаны, используются length(X) и stride(X,1).

source
LinearAlgebra.BLAS.scalFunction
scal(n, a, X, incx)
scal(a, X)

Возвращает X, масштабированный на a для первых n элементов массива X с шагом incx.

Если n и incx не указаны, используются length(X) и stride(X,1).

source
LinearAlgebra.BLAS.blascopy!Function
blascopy!(n, X, incx, Y, incy)

Копирует n элементов массива X с шагом incx в массив Y с шагом incy. Возвращает Y.

source
LinearAlgebra.BLAS.dotFunction
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
source
LinearAlgebra.BLAS.dotuFunction
dotu(n, X, incx, Y, incy)

Функция Dot для двух комплексных векторов, состоящих из n элементов массива X с шагом incx и n элементов массива Y с шагом incy.

Примеры

julia> BLAS.dotu(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
-10.0 + 10.0im
source
LinearAlgebra.BLAS.dotcFunction
dotc(n, X, incx, U, incy)

Функция Dot для двух комплексных векторов, состоящих из n элементов массива X с шагом incx и n элементов массива U с шагом incy, конъюгируя первый вектор.

Примеры

julia> BLAS.dotc(10, fill(1.0im, 10), 1, fill(1.0+im, 20), 2)
10.0 - 10.0im
source
LinearAlgebra.BLAS.nrm2Function
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
source
LinearAlgebra.BLAS.asumFunction
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
source
LinearAlgebra.BLAS.iamaxFunction
iamax(n, dx, incx)
iamax(dx)

Найдите индекс элемента dx с максимальным абсолютным значением. n — это длина dx, а incx — это шаг. Если n и incx не указаны, они принимают значения по умолчанию: n=length(dx) и incx=stride1(dx).

source

Level 2 BLAS functions

Функции уровня 2 BLAS были опубликованы в [(Dongarra, 1988)][Dongarra-1988] и определяют операции матрица-вектор.

[Dongarra-1988]: https://dl.acm.org/doi/10.1145/42288.42291

вернуть вектор

LinearAlgebra.BLAS.gemv!Function
gemv!(tA, alpha, A, x, beta, y)

Обновите вектор y как alpha*A*x + beta*y или alpha*A'x + beta*y в зависимости от tA. alpha и beta являются скалярами. Верните обновленный y.

source
LinearAlgebra.BLAS.gemvMethod
gemv(tA, alpha, A, x)

Возвращает alpha*A*x или alpha*A'x в зависимости от tA. alpha является скаляром.

source
LinearAlgebra.BLAS.gbmv!Function
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.

source
LinearAlgebra.BLAS.gbmvFunction
gbmv(trans, m, kl, ku, alpha, A, x)

Возвращает alpha*A*x или alpha*A'*x в зависимости от trans. Матрица A является общей ленточной матрицей размером m на size(A,2) с kl поддиагоналями и ku наддиагоналями, а alpha является скаляром.

source
LinearAlgebra.BLAS.hemv!Function
hemv!(ul, alpha, A, x, beta, y)

Обновите вектор y как alpha*A*x + beta*y. A предполагается как эрмитова. Используется только ul треугольник A. alpha и beta являются скалярами. Верните обновленный y.

source
LinearAlgebra.BLAS.hemvMethod
hemv(ul, alpha, A, x)

Возвращает alpha*A*x. Предполагается, что A является эрмитовой. Используется только ul треугольник A. alpha является скаляром.

source
LinearAlgebra.BLAS.hemvMethod
hemv(ul, A, x)

Возвращает A*x. Предполагается, что A является эрмитовым. Используется только ul треугольник A.

source
LinearAlgebra.BLAS.hpmv!Function
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.

Julia 1.5

hpmv! требует как минимум Julia 1.5.

source
LinearAlgebra.BLAS.symv!Function
symv!(ul, alpha, A, x, beta, y)

Обновите вектор y как alpha*A*x + beta*y. A предполагается симметричным. Используется только ul треугольник A. alpha и beta являются скалярами. Верните обновленный y.

source
LinearAlgebra.BLAS.symvMethod
symv(ul, alpha, A, x)

Возвращает alpha*A*x. Предполагается, что A является симметричной. Используется только ul треугольник A. alpha является скаляром.

source
LinearAlgebra.BLAS.symvMethod
symv(ul, A, x)

Возвращает A*x. Предполагается, что A является симметричной. Используется только ul треугольник A.

source
LinearAlgebra.BLAS.sbmv!Function
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.

source
LinearAlgebra.BLAS.sbmvMethod
sbmv(uplo, k, alpha, A, x)

Возвращает alpha*A*x, где A является симметричной ленточной матрицей порядка size(A,2) с k наддиагоналями, хранящимися в аргументе A. Используется только uplo треугольник матрицы A.

source
LinearAlgebra.BLAS.sbmvMethod
sbmv(uplo, k, A, x)

Возвращает A*x, где A является симметричной ленточной матрицей порядка size(A,2) с k наддиагоналями, хранящимися в аргументе A. Используется только треугольник uplo матрицы A.

source
LinearAlgebra.BLAS.spmv!Function
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.

Julia 1.5

spmv! требует как минимум Julia 1.5.

source
LinearAlgebra.BLAS.trmv!Function
trmv!(ul, tA, dA, A, b)

Возвращает op(A)*b, где op определяется tA. Используется только ul треугольник A. dA определяет, читаются ли диагональные значения или предполагается, что они все равны единице. Умножение происходит на месте в b.

source
LinearAlgebra.BLAS.trmvFunction
trmv(ul, tA, dA, A, b)

Возвращает op(A)*b, где op определяется tA. Используется только ul треугольник матрицы A. dA определяет, читаются ли диагональные значения или предполагается, что они все равны единице.

source
LinearAlgebra.BLAS.trsv!Function
trsv!(ul, tA, dA, A, b)

Перезапишите b с решением уравнения A*x = b или одного из двух других вариантов, определяемых tA и ul. dA определяет, читаются ли диагональные значения или предполагается, что они все равны единице. Верните обновленное b.

source
LinearAlgebra.BLAS.trsvFunction
trsv(ul, tA, dA, A, b)

Возвращает решение уравнения A*x = b или один из двух других вариантов, определяемых tA и ul. dA определяет, считываются ли диагональные значения или предполагается, что они все равны единице.

source

вернуть матрицу

LinearAlgebra.BLAS.ger!Function
ger!(alpha, x, y, A)

Ранг-1 обновление матрицы A с векторами x и y в виде alpha*x*y' + A.

source
LinearAlgebra.BLAS.her!Function
her!(uplo, alpha, x, A)

Методы только для комплексных массивов. Ранг-1 обновление эрмитовой матрицы A с вектором x как alpha*x*x' + A. uplo управляет тем, какая треугольная часть A обновляется. Возвращает A.

source
LinearAlgebra.BLAS.syr!Function
syr!(uplo, alpha, x, A)

Ранг-1 обновление симметричной матрицы A с вектором x как alpha*x*transpose(x) + A. uplo управляет тем, какая треугольная часть A обновляется. Возвращает A.

source
LinearAlgebra.BLAS.spr!Function
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.

Julia 1.8

spr! требует как минимум Julia 1.8.

source

Level 3 BLAS functions

Функции уровня 3 BLAS были опубликованы в [(Dongarra, 1990)][Dongarra-1990] и определяют операции матрица-матрица.

[Dongarra-1990]: https://dl.acm.org/doi/10.1145/77626.79170

LinearAlgebra.BLAS.gemmt!Function
gemmt!(uplo, tA, tB, alpha, A, B, beta, C)

Обновите нижнюю или верхнюю треугольную часть, указанную uplo, матрицы C как alpha*A*B + beta*C или другие варианты в зависимости от tA и tB. Верните обновленную матрицу C.

Julia 1.11

gemmt! требует как минимум Julia 1.11.

source
LinearAlgebra.BLAS.gemmtMethod
gemmt(uplo, tA, tB, alpha, A, B)

Возвращает нижнюю или верхнюю треугольную часть, указанную uplo, от A*B или других трех вариантов в зависимости от tA и tB.

Julia 1.11

gemmt требует как минимум Julia 1.11.

source
LinearAlgebra.BLAS.gemmtMethod
gemmt(uplo, tA, tB, A, B)

Возвращает нижнюю или верхнюю треугольную часть, указанную uplo, от A*B или другие три варианта в зависимости от tA и tB.

Julia 1.11

gemmt требует как минимум Julia 1.11.

source
LinearAlgebra.BLAS.gemm!Function
gemm!(tA, tB, alpha, A, B, beta, C)

Обновите C как alpha*A*B + beta*C или другие три варианта в зависимости от tA и tB. Верните обновленный C.

source
LinearAlgebra.BLAS.gemmMethod
gemm(tA, tB, alpha, A, B)

Возвращает alpha*A*B или другие три варианта в зависимости от tA и tB.

source
LinearAlgebra.BLAS.gemmMethod
gemm(tA, tB, A, B)

Возвращает A*B или другие три варианта в зависимости от tA и tB.

source
LinearAlgebra.BLAS.symm!Function
symm!(side, ul, alpha, A, B, beta, C)

Обновите C как alpha*A*B + beta*C или alpha*B*A + beta*C в зависимости от side. Предполагается, что A является симметричной. Используется только ul треугольник A. Верните обновленный C.

source
LinearAlgebra.BLAS.symmMethod
symm(side, ul, alpha, A, B)

Возвращает alpha*A*B или alpha*B*A в зависимости от side. Предполагается, что A является симметричной. Используется только ul треугольник A.

source
LinearAlgebra.BLAS.symmMethod
symm(side, ul, A, B)

Возвращает A*B или B*A в зависимости от side. Предполагается, что A является симметричной. Используется только ul треугольник A.

source
LinearAlgebra.BLAS.hemm!Function
hemm!(side, ul, alpha, A, B, beta, C)

Обновите C как alpha*A*B + beta*C или alpha*B*A + beta*C в зависимости от side. Предполагается, что A является эрмитовой. Используется только ul треугольник A. Верните обновленный C.

source
LinearAlgebra.BLAS.hemmMethod
hemm(side, ul, alpha, A, B)

Возвращает alpha*A*B или alpha*B*A в зависимости от side. Предполагается, что A является эрмитовой. Используется только треугольник ul матрицы A.

source
LinearAlgebra.BLAS.hemmMethod
hemm(side, ul, A, B)

Возвращает A*B или B*A в зависимости от side. Предполагается, что A является эрмитовым. Используется только ul треугольник A.

source
LinearAlgebra.BLAS.syrk!Function
syrk!(uplo, trans, alpha, A, beta, C)

Ранговое обновление симметричной матрицы C как alpha*A*transpose(A) + beta*C или alpha*transpose(A)*A + beta*C в зависимости от trans. Используется только uplo треугольник C. Возвращает C.

source
LinearAlgebra.BLAS.syrkFunction
syrk(uplo, trans, alpha, A)

Возвращает либо верхний треугольник, либо нижний треугольник матрицы A, в зависимости от uplo, от alpha*A*transpose(A) или alpha*transpose(A)*A, в зависимости от trans.

source
LinearAlgebra.BLAS.herk!Function
herk!(uplo, trans, alpha, A, beta, C)

Методы только для комплексных массивов. Обновление ранга-k эрмитовой матрицы C как alpha*A*A' + beta*C или alpha*A'*A + beta*C в зависимости от trans. Обновляется только uplo треугольник C. Возвращает C.

source
LinearAlgebra.BLAS.herkFunction
herk(uplo, trans, alpha, A)

Методы только для комплексных массивов. Возвращает uplo треугольник alpha*A*A' или alpha*A'*A, в зависимости от trans.

source
LinearAlgebra.BLAS.syr2k!Function
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.

source
LinearAlgebra.BLAS.syr2kFunction
syr2k(uplo, trans, alpha, A, B)

Возвращает треугольник uplo от alpha*A*transpose(B) + alpha*B*transpose(A) или alpha*transpose(A)*B + alpha*transpose(B)*A, в зависимости от trans.

source
syr2k(uplo, trans, A, B)

Возвращает треугольник uplo матрицы A*transpose(B) + B*transpose(A) или transpose(A)*B + transpose(B)*A, в зависимости от trans.

source
LinearAlgebra.BLAS.her2k!Function
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.

source
LinearAlgebra.BLAS.her2kFunction
her2k(uplo, trans, alpha, A, B)

Возвращает uplo треугольник alpha*A*B' + alpha*B*A' или alpha*A'*B + alpha*B'*A, в зависимости от trans.

source
her2k(uplo, trans, A, B)

Возвращает uplo треугольник A*B' + B*A' или A'*B + B'*A, в зависимости от trans.

source
LinearAlgebra.BLAS.trmm!Function
trmm!(сторона, ul, tA, dA, alpha, A, B)

Обновите B как alpha*A*B или один из трех других вариантов, определяемых side и tA. Используется только ul треугольник A. dA определяет, читаются ли диагональные значения или предполагается, что все они равны единице. Верните обновленный B.

source
LinearAlgebra.BLAS.trmmFunction
trmm(side, ul, tA, dA, alpha, A, B)

Возвращает alpha*A*B или один из других трех вариантов, определяемых side и tA. Используется только ul треугольник матрицы A. dA определяет, читаются ли диагональные значения или предполагается, что они все равны единице.

source
LinearAlgebra.BLAS.trsm!Function
trsm!(сторона, ul, tA, dA, альфа, A, B)

Перезаписывает B решением уравнения A*X = альфа*B или одного из трех других вариантов, определяемых сторона и tA. Используется только ul треугольник матрицы A. dA определяет, читаются ли диагональные значения или предполагается, что они все равны единице. Возвращает обновленное B.

source
LinearAlgebra.BLAS.trsmFunction
trsm(side, ul, tA, dA, alpha, A, B)

Возвращает решение уравнения A*X = alpha*B или один из трех других вариантов, определяемых side и tA. Используется только ul треугольник матрицы A. dA определяет, считываются ли диагональные значения или предполагается, что они все равны единице.

source

LAPACK functions

LinearAlgebra.LAPACK предоставляет обертки для некоторых функций LAPACK для линейной алгебры. Функции, которые перезаписывают один из входных массивов, имеют названия, заканчивающиеся на '!'.

Обычно функция имеет 4 метода, определенных для Float64, Float32, массивов ComplexF64 и ComplexF32.

Обратите внимание, что API LAPACK, предоставляемый Julia, может измениться в будущем. Поскольку этот API не предназначен для пользователей, нет обязательств по поддержке/устареванию этого конкретного набора функций в будущих релизах.

LinearAlgebra.LAPACK.gbtrf!Function
gbtrf!(kl, ku, m, AB) -> (AB, ipiv)

Вычисляет LU-разложение ленточной матрицы AB. kl — это первая поддиагональ, содержащая ненулевую полосу, ku — последняя наддиагональ, содержащая одну, а m — это первое измерение матрицы AB. Возвращает LU-разложение на месте и ipiv, вектор пивотов, используемых.

source
LinearAlgebra.LAPACK.gbtrs!Function
gbtrs!(trans, kl, ku, m, AB, ipiv, B)

Решите уравнение AB * X = B. trans определяет ориентацию AB. Это может быть N (без транспонирования), T (транспонирование) или C (сопряженное транспонирование). kl - это первая поддиагональ, содержащая ненулевую полосу, ku - последняя наддиагональ, содержащая одну, а m - это первое измерение матрицы AB. ipiv - это вектор пивотов, возвращаемый из gbtrf!. Возвращает вектор или матрицу X, перезаписывая B на месте.

source
LinearAlgebra.LAPACK.gebal!Function
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 содержит информацию о выполненных масштабировании/перестановках.

source
LinearAlgebra.LAPACK.gebak!Function
gebak!(job, side, ilo, ihi, scale, V)

Преобразует собственные векторы V матрицы, сбалансированной с помощью gebal!, в несмасштабированные/неперемешанные собственные векторы оригинальной матрицы. Модифицирует V на месте. side может быть L (преобразуются левые собственные векторы) или R (преобразуются правые собственные векторы).

source
LinearAlgebra.LAPACK.gebrd!Function
gebrd!(A) -> (A, d, e, tauq, taup)

Сокращает A на месте до бидиагональной формы A = QBP'. Возвращает A, содержащую бидиагональную матрицу B; d, содержащий диагональные элементы B; e, содержащий недиагональные элементы B; tauq, содержащий элементарные отражатели, представляющие Q; и taup, содержащий элементарные отражатели, представляющие P.

source
LinearAlgebra.LAPACK.gelqf!Function
gelqf!(A, tau)

Вычисляет LQ факторизацию A, A = LQ. tau содержит скаляры, которые параметризуют элементарные отражатели факторизации. tau должен иметь длину, большую или равную наименьшему размеру A.

Возвращает A и tau, измененные на месте.

source
gelqf!(A) -> (A, tau)

Вычисляет LQ факторизацию A, A = LQ.

Возвращает A, измененный на месте, и tau, который содержит скаляры, параметризующие элементарные отражатели факторизации.

source
LinearAlgebra.LAPACK.geqlf!Function
geqlf!(A, tau)

Вычисляет QL факторизацию A, A = QL. tau содержит скаляры, которые параметризуют элементарные отражатели факторизации. tau должен иметь длину, большую или равную наименьшему размеру A.

Возвращает A и tau, измененные на месте.

source
geqlf!(A) -> (A, tau)

Вычисляет QL факторизацию A, A = QL.

Возвращает A, измененный на месте, и tau, который содержит скаляры, параметризующие элементарные отражатели факторизации.

source
LinearAlgebra.LAPACK.geqrf!Function
geqrf!(A, tau)

Вычисляет QR факторизацию A, A = QR. tau содержит скаляры, которые параметризуют элементарные отражатели факторизации. tau должен иметь длину, большую или равную наименьшему размеру A.

Возвращает A и tau, измененные на месте.

source
geqrf!(A) -> (A, tau)

Вычисляет QR факторизацию A, A = QR.

Возвращает A, изменённую на месте, и tau, который содержит скаляры, параметризующие элементарные отражатели факторизации.

source
LinearAlgebra.LAPACK.geqp3!Function
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 изменяются на месте.

source
LinearAlgebra.LAPACK.gerqf!Function
gerqf!(A, tau)

Вычисляет RQ факторизацию A, A = RQ. tau содержит скаляры, которые параметризуют элементарные отражатели факторизации. Длина tau должна быть больше или равна наименьшему размеру A.

Возвращает A и tau, измененные на месте.

source
gerqf!(A) -> (A, tau)

Вычисляет RQ факторизацию A, A = RQ.

Возвращает A, измененный на месте, и tau, который содержит скаляры, параметризующие элементарные отражатели факторизации.

source
LinearAlgebra.LAPACK.geqrt!Function
geqrt!(A, T)

Вычисляет блочную QR факторизацию A, A = QR. T содержит верхние треугольные блочные отражатели, которые параметризуют элементарные отражатели факторизации. Первая размерность T задает размер блока и должна быть между 1 и n. Вторая размерность T должна быть равна наименьшей размерности A.

Возвращает A и T, измененные на месте.

source
geqrt!(A, nb) -> (A, T)

Вычисляет блочную QR факторизацию A, A = QR. nb задает размер блока и должен быть между 1 и n, вторым измерением A.

Возвращает A, измененный на месте, и T, который содержит верхние треугольные блочные отражатели, которые параметризуют элементарные отражатели факторизации.

source
LinearAlgebra.LAPACK.geqrt3!Function
geqrt3!(A, T)

Рекурсивно вычисляет блочную QR факторизацию A, A = QR. T содержит верхние треугольные блочные отражатели, которые параметризуют элементарные отражатели факторизации. Первая размерность T задает размер блока и должна быть между 1 и n. Вторая размерность T должна быть равна наименьшей размерности A.

Возвращает A и T, измененные на месте.

source
geqrt3!(A) -> (A, T)

Рекурсивно вычисляет блочную QR факторизацию A, A = QR.

Возвращает A, изменённую на месте, и T, который содержит верхние треугольные блочные отражатели, которые параметризуют элементарные отражатели факторизации.

source
LinearAlgebra.LAPACK.getrf!Function
getrf!(A, ipiv) -> (A, ipiv, info)

Вычисляет разложение LU с учетом перестановок для A, A = LU. ipiv содержит информацию о перестановках, а info — код, который указывает на успех (info = 0), сингулярное значение в U (info = i, в этом случае U[i,i] сингулярно) или код ошибки (info < 0).

source
getrf!(A) -> (A, ipiv, info)

Вычисляет разложение LU с учетом перестановок для A, A = LU.

Возвращает A, измененный на месте, ipiv, информацию о перестановках, и код info, который указывает на успех (info = 0), сингулярное значение в U (info = i, в этом случае U[i,i] сингулярно) или код ошибки (info < 0).

source
LinearAlgebra.LAPACK.tzrzf!Function
tzrzf!(A) -> (A, tau)

Преобразует верхнюю трапециевидную матрицу A в верхнюю треугольную форму на месте. Возвращает A и tau, скалярные параметры для элементарных отражателей преобразования.

source
LinearAlgebra.LAPACK.ormrz!Function
ormrz!(side, trans, A, tau, C)

Умножает матрицу C на Q из преобразования, предоставленного tzrzf!. В зависимости от side или trans умножение может быть с левой стороны (side = L, Q*C) или с правой стороны (side = R, C*Q), и Q может быть неизменным (trans = N), транспонированным (trans = T) или сопряженно транспонированным (trans = C). Возвращает матрицу C, которая изменяется на месте с результатом умножения.

source
LinearAlgebra.LAPACK.gels!Function
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.

source
LinearAlgebra.LAPACK.gesv!Function
gesv!(A, B) -> (B, A, ipiv)

Решает линейное уравнение A * X = B, где A является квадратной матрицей, используя LU факторизацию A. A перезаписывается своей LU факторизацией, а B перезаписывается решением X. ipiv содержит информацию о перестановках для LU факторизации A.

source
LinearAlgebra.LAPACK.getrs!Function
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 (сопряженно-транспонированная).

source
LinearAlgebra.LAPACK.getri!Function
getri!(A, ipiv)

Вычисляет обратную матрицу A, используя ее LU факторизацию, найденную с помощью getrf!. ipiv — это информация о пивотах, а A содержит LU факторизацию из getrf!. A перезаписывается своей обратной матрицей.

source
LinearAlgebra.LAPACK.gesvx!Function
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, обратный фактор роста пивота.

source
gesvx!(A, B)

Упрощение gesvx! без эквивалентности и без транспонирования.

source
LinearAlgebra.LAPACK.gelsd!Function
gelsd!(A, B, rcond) -> (B, rnk)

Вычисляет решение с наименьшей нормой уравнения A * X = B, находя факторизацию SVD матрицы A, а затем решая задачу методом деления и завоевания. B перезаписывается решением X. Сингулярные значения ниже rcond будут рассматриваться как ноль. Возвращает решение в B и эффективный ранг A в rnk.

source
LinearAlgebra.LAPACK.gelsy!Function
gelsy!(A, B, rcond) -> (B, rnk)

Вычисляет решение с наименьшей нормой уравнения A * X = B, находя полную QR факторизацию A, а затем решая задачу методом деления и завоевания. B перезаписывается решением X. Сингулярные значения ниже rcond будут рассматриваться как ноль. Возвращает решение в B и эффективный ранг A в rnk.

source
LinearAlgebra.LAPACK.gglse!Function
gglse!(A, c, B, d) -> (X,res)

Решает уравнение A * x = c, где x подчиняется равенству B * x = d. Использует формулу ||c - A*x||^2 = 0 для решения. Возвращает X и сумму квадратов остатков.

source
LinearAlgebra.LAPACK.geev!Function
geev!(jobvl, jobvr, A) -> (W, VL, VR)

Находит собственную систему матрицы A. Если jobvl = N, левые собственные векторы матрицы A не вычисляются. Если jobvr = N, правые собственные векторы матрицы A не вычисляются. Если jobvl = V или jobvr = V, соответствующие собственные векторы вычисляются. Возвращает собственные значения в W, правые собственные векторы в VR и левые собственные векторы в VL.

source
LinearAlgebra.LAPACK.gesdd!Function
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'.

source
LinearAlgebra.LAPACK.gesvd!Function
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.

source
LinearAlgebra.LAPACK.ggsvd!Function
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.

source
LinearAlgebra.LAPACK.ggsvd3!Function
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.

source
LinearAlgebra.LAPACK.geevx!Function
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, правые и левые собственные векторы должны быть вычислены.

source
LinearAlgebra.LAPACK.ggev!Function
ggev!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)

Находит обобщенное собственное разложение матриц A и B. Если jobvl = N, левые собственные векторы не вычисляются. Если jobvr = N, правые собственные векторы не вычисляются. Если jobvl = V или jobvr = V, соответствующие собственные векторы вычисляются.

source
LinearAlgebra.LAPACK.ggev3!Function
ggev3!(jobvl, jobvr, A, B) -> (alpha, beta, vl, vr)

Находит обобщенное собственное разложение A и B с использованием блочной алгоритма. Если jobvl = N, левые собственные векторы не вычисляются. Если jobvr = N, правые собственные векторы не вычисляются. Если jobvl = V или jobvr = V, соответствующие собственные векторы вычисляются. Эта функция требует LAPACK 3.6.0.

source
LinearAlgebra.LAPACK.gtsv!Function
gtsv!(dl, d, du, B)

Решает уравнение A * X = B, где A — это тридиагональная матрица с dl на поддиагонали, d на диагонали и du на наддиагонали.

Перезаписывает B решением X и возвращает его.

source
LinearAlgebra.LAPACK.gttrf!Function
gttrf!(dl, d, du) -> (dl, d, du, du2, ipiv)

Находит LU факторизацию тридиагональной матрицы с dl на поддиагонали, d на диагонали и du на наддиагонали.

Модифицирует dl, d и du на месте и возвращает их, а также вторую наддиагональ du2 и вектор перестановок ipiv.

source
LinearAlgebra.LAPACK.gttrs!Function
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.

source
LinearAlgebra.LAPACK.orglq!Function
orglq!(A, tau, k = length(tau))

Явно находит матрицу Q разложения LQ после вызова gelqf! на A. Использует вывод gelqf!. A перезаписывается Q.

source
LinearAlgebra.LAPACK.orgqr!Function
orgqr!(A, tau, k = length(tau))

Явно находит матрицу Q разложения QR после вызова geqrf! на A. Использует вывод geqrf!. A перезаписывается Q.

source
LinearAlgebra.LAPACK.orgql!Function
orgql!(A, tau, k = length(tau))

Явно находит матрицу Q разложения QL после вызова geqlf! на A. Использует вывод geqlf!. A перезаписывается на Q.

source
LinearAlgebra.LAPACK.orgrq!Function
orgrq!(A, tau, k = length(tau))

Явно находит матрицу Q разложения RQ после вызова gerqf! на A. Использует вывод gerqf!. A перезаписывается на Q.

source
LinearAlgebra.LAPACK.ormlq!Function
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 перезаписывается.

source
LinearAlgebra.LAPACK.ormqr!Function
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 перезаписывается.

source
LinearAlgebra.LAPACK.ormql!Function
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 перезаписывается.

source
LinearAlgebra.LAPACK.ormrq!Function
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 перезаписывается.

source
LinearAlgebra.LAPACK.gemqrt!Function
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 перезаписывается.

source
LinearAlgebra.LAPACK.posv!Function
posv!(uplo, A, B) -> (A, B)

Находит решение уравнения A * X = B, где A является симметричной или эрмитовой положительно определенной матрицей. Если uplo = U, вычисляется верхняя разложение Холецкого матрицы A. Если uplo = L, вычисляется нижняя разложение Холецкого матрицы A. A перезаписывается своим разложением Холецкого. B перезаписывается решением X.

source
LinearAlgebra.LAPACK.potrf!Function
potrf!(uplo, A)

Вычисляет разложение Холецкого (верхнее, если uplo = U, нижнее, если uplo = L) положительно определенной матрицы A. A перезаписывается и возвращается с кодом информации.

source
LinearAlgebra.LAPACK.potri!Function
potri!(uplo, A)

Вычисляет обратную матрицу положительно определенной матрицы A после вызова potrf! для нахождения ее (верхней, если uplo = U, нижней, если uplo = L) разложения Холецкого.

A перезаписывается своей обратной матрицей и возвращается.

source
LinearAlgebra.LAPACK.potrs!Function
potrs!(uplo, A, B)

Находит решение уравнения A * X = B, где A является симметричной или эрмитовой положительно определенной матрицей, для которой разложение Холецкого было вычислено с помощью potrf!. Если uplo = U, то было вычислено верхнее разложение Холецкого матрицы A. Если uplo = L, то было вычислено нижнее разложение Холецкого матрицы A. B перезаписывается решением X.

source
LinearAlgebra.LAPACK.pstrf!Function
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 является неопределенной или имеет недостаточный ранг.

source
LinearAlgebra.LAPACK.ptsv!Function
ptsv!(D, E, B)

Решает уравнение A * X = B для положительно определенной тридиагональной матрицы A. D — это диагональ A, а E — это вне диагонали. B перезаписывается решением X и возвращается.

source
LinearAlgebra.LAPACK.pttrf!Function
pttrf!(D, E)

Вычисляет факторизацию LDLt положительно определенной тридиагональной матрицы с D в качестве диагонали и E в качестве вне диагонали. D и E перезаписываются и возвращаются.

source
LinearAlgebra.LAPACK.pttrs!Function
pttrs!(D, E, B)

Решает уравнение A * X = B для положительно определенной тридиагональной матрицы A с диагональю D и вне диагональными элементами E после вычисления LDLt факторизации A с использованием pttrf!. B перезаписывается решением X.

source
LinearAlgebra.LAPACK.trtri!Function
trtri!(uplo, diag, A)

Находит обратную матрицу (верхнюю, если uplo = U, нижнюю, если uplo = L) треугольной матрицы A. Если diag = N, у A есть ненормированные диагональные элементы. Если diag = U, все диагональные элементы A равны единице. A перезаписывается своим обратным значением.

source
LinearAlgebra.LAPACK.trtrs!Function
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.

source
LinearAlgebra.LAPACK.trcon!Function
trcon!(norm, uplo, diag, A)

Находит обратное число обусловленности (верхнее, если uplo = U, нижнее, если uplo = L) треугольной матрицы A. Если diag = N, у A есть ненормированные диагональные элементы. Если diag = U, все диагональные элементы A равны единице. Если norm = I, число обусловленности находится в бесконечной норме. Если norm = O или 1, число обусловленности находится в одной норме.

source
LinearAlgebra.LAPACK.trevc!Function
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.

source
LinearAlgebra.LAPACK.trrfs!Function
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 — ошибка обратного хода, каждая по компонентам.

source
LinearAlgebra.LAPACK.stev!Function
stev!(job, dv, ev) -> (dv, Zmat)

Вычисляет собственную систему для симметричной тридиагональной матрицы с dv в качестве диагонали и ev в качестве вне диагонали. Если job = N, то находят только собственные значения и возвращают их в dv. Если job = V, то также находят собственные векторы и возвращают их в Zmat.

source
LinearAlgebra.LAPACK.stebz!Function
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 может быть установлен как допустимая погрешность для сходимости.

source
LinearAlgebra.LAPACK.stegr!Function
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.

source
LinearAlgebra.LAPACK.stein!Function
stein!(dv, ev_in, w_in, iblock_in, isplit_in)

Вычисляет собственные векторы для симметричной тридиагональной матрицы с dv в качестве диагонали и ev_in в качестве внедиагональных элементов. w_in указывает входные собственные значения, для которых необходимо найти соответствующие собственные векторы. iblock_in указывает подматрицы, соответствующие собственным значениям в w_in. isplit_in указывает точки разбиения между блоками подматриц.

source
LinearAlgebra.LAPACK.syconv!Function
syconv!(uplo, A, ipiv) -> (A, work)

Преобразует симметричную матрицу A (которая была факторизована в треугольную матрицу) в две матрицы L и D. Если uplo = U, A является верхней треугольной. Если uplo = L, она является нижней треугольной. ipiv — это вектор пивотов из треугольной факторизации. A перезаписывается L и D.

source
LinearAlgebra.LAPACK.sysv!Function
sysv!(uplo, A, B) -> (B, A, ipiv)

Находит решение уравнения A * X = B для симметричной матрицы A. Если uplo = U, то верхняя половина A хранится. Если uplo = L, то хранится нижняя половина. B перезаписывается решением X. A перезаписывается его факторизацией Банч-Кауфмана. ipiv содержит информацию о перестановках для факторизации.

source
LinearAlgebra.LAPACK.sytrf!Function
sytrf!(uplo, A) -> (A, ipiv, info)

Вычисляет факторизацию Банч-Кауфмана симметричной матрицы A. Если uplo = U, верхняя половина A хранится. Если uplo = L, хранится нижняя половина.

Возвращает A, перезаписанную факторизацией, вектор перестановок ipiv и код ошибки info, который является неотрицательным целым числом. Если info положительно, матрица сингулярна, и диагональная часть факторизации точно равна нулю в позиции info.

source
sytrf!(uplo, A, ipiv) -> (A, ipiv, info)

Вычисляет факторизацию Банч-Кауфмана симметричной матрицы A. Если uplo = U, верхняя половина A хранится. Если uplo = L, хранится нижняя половина.

Возвращает A, перезаписанную факторизацией, вектор перестановок ipiv и код ошибки info, который является неотрицательным целым числом. Если info положительно, матрица сингулярна, и диагональная часть факторизации точно равна нулю в позиции info.

source
LinearAlgebra.LAPACK.sytri!Function
sytri!(uplo, A, ipiv)

Вычисляет обратную матрицу симметричной матрицы A, используя результаты sytrf!. Если uplo = U, верхняя половина A хранится. Если uplo = L, хранится нижняя половина. A перезаписывается своей обратной.

source
LinearAlgebra.LAPACK.sytrs!Function
sytrs!(uplo, A, ipiv, B)

Решает уравнение A * X = B для симметричной матрицы A, используя результаты sytrf!. Если uplo = U, то верхняя половина A хранится. Если uplo = L, то хранится нижняя половина. B перезаписывается решением X.

source
LinearAlgebra.LAPACK.hesv!Function
hesv!(uplo, A, B) -> (B, A, ipiv)

Находит решение уравнения A * X = B для эрмитовой матрицы A. Если uplo = U, то хранится верхняя половина A. Если uplo = L, то хранится нижняя половина. B перезаписывается решением X. A перезаписывается его факторизацией Банч-Кауфмана. ipiv содержит информацию о перестановках для факторизации.

source
LinearAlgebra.LAPACK.hetrf!Function
hetrf!(uplo, A) -> (A, ipiv, info)

Вычисляет факторизацию Банч-Кауфмана для эрмитовой матрицы A. Если uplo = U, то верхняя половина A хранится. Если uplo = L, то хранится нижняя половина.

Возвращает A, перезаписанную факторизацией, вектор перестановок ipiv и код ошибки info, который является неотрицательным целым числом. Если info положительно, матрица сингулярна, и диагональная часть факторизации точно равна нулю в позиции info.

source
hetrf!(uplo, A, ipiv) -> (A, ipiv, info)

Вычисляет факторизацию Банч-Кауфмана для эрмитовой матрицы A. Если uplo = U, то верхняя половина A хранится. Если uplo = L, то хранится нижняя половина.

Возвращает A, перезаписанную факторизацией, вектор перестановок ipiv и код ошибки info, который является неотрицательным целым числом. Если info положительно, матрица сингулярна, и диагональная часть факторизации точно равна нулю в позиции info.

source
LinearAlgebra.LAPACK.hetri!Function
hetri!(uplo, A, ipiv)

Вычисляет обратную матрицу для эрмитовой матрицы A, используя результаты sytrf!. Если uplo = U, то хранится верхняя половина A. Если uplo = L, то хранится нижняя половина. A перезаписывается своей обратной матрицей.

source
LinearAlgebra.LAPACK.hetrs!Function
hetrs!(uplo, A, ipiv, B)

Решает уравнение A * X = B для эрмитовой матрицы A, используя результаты sytrf!. Если uplo = U, то хранится верхняя половина A. Если uplo = L, то хранится нижняя половина. B перезаписывается решением X.

source
LinearAlgebra.LAPACK.syev!Function
syev!(jobz, uplo, A)

Находит собственные значения (jobz = N) или собственные значения и собственные векторы (jobz = V) симметричной матрицы A. Если uplo = U, используется верхний треугольник A. Если uplo = L, используется нижний треугольник A.

source
LinearAlgebra.LAPACK.syevr!Function
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.

source
LinearAlgebra.LAPACK.syevd!Function
syevd!(jobz, uplo, A)

Находит собственные значения (jobz = N) или собственные значения и собственные векторы (jobz = V) симметричной матрицы A. Если uplo = U, используется верхний треугольник A. Если uplo = L, используется нижний треугольник A.

Использует метод деления и завоевания, вместо итерации QR, используемой syev!, или нескольких относительно устойчивых представлений, используемых syevr!. См. James W. Demmel и др., SIAM J. Sci. Comput. 30, 3, 1508 (2008) для сравнения точности и производительности различных методов.

source
LinearAlgebra.LAPACK.sygvd!Function
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.

source
LinearAlgebra.LAPACK.bdsqr!Function
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.

source
LinearAlgebra.LAPACK.bdsdc!Function
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.

source
LinearAlgebra.LAPACK.gecon!Function
gecon!(normtype, A, anorm)

Находит обратное число обусловленности матрицы A. Если normtype = I, число обусловленности находится в бесконечной норме. Если normtype = O или 1, число обусловленности находится в одной норме. A должно быть результатом getrf!, а anorm — это норма A в соответствующей норме.

source
LinearAlgebra.LAPACK.gehrd!Function
gehrd!(ilo, ihi, A) -> (A, tau)

Преобразует матрицу A в форму Хессенберга. Если A сбалансирована с помощью gebal!, то ilo и ihi являются выходными данными gebal!. В противном случае они должны быть ilo = 1 и ihi = size(A,2). tau содержит элементарные отражатели факторизации.

source
LinearAlgebra.LAPACK.orghr!Function
orghr!(ilo, ihi, A, tau)

Явно находит Q, ортогональную/унитарную матрицу из gehrd!. ilo, ihi, A и tau должны соответствовать входным/выходным данным для gehrd!.

source
LinearAlgebra.LAPACK.gees!Function
gees!(jobvs, A) -> (A, vs, w)

Вычисляет собственные значения (jobvs = N) или собственные значения и векторы Шура (jobvs = V) матрицы A. A перезаписывается в своей форме Шура.

Возвращает A, vs, содержащий векторы Шура, и w, содержащий собственные значения.

source
LinearAlgebra.LAPACK.gges!Function
gges!(jobvsl, jobvsr, A, B) -> (A, B, alpha, beta, vsl, vsr)

Вычисляет обобщенные собственные значения, обобщенную форму Шура, левые векторы Шура (jobsvl = V) или правые векторы Шура (jobvsr = V) для A и B.

Обобщенные собственные значения возвращаются в alpha и beta. Левые векторы Шура возвращаются в vsl, а правые векторы Шура возвращаются в vsr.

source
LinearAlgebra.LAPACK.gges3!Function
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.

source
LinearAlgebra.LAPACK.trexc!Function
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.

source
LinearAlgebra.LAPACK.trsen!Function
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.

source
LinearAlgebra.LAPACK.tgsen!Function
tgsen!(select, S, T, Q, Z) -> (S, T, alpha, beta, Q, Z)

Переставляет векторы обобщенного разложения Шура. select указывает собственные значения в каждом кластере.

source
LinearAlgebra.LAPACK.trsyl!Function
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.

source
LinearAlgebra.LAPACK.hseqr!Function
hseqr!(job, compz, ilo, ihi, H, Z) -> (H, Z, w)

Вычисляет все собственные значения и (по желанию) факторизацию Шура матрицы, приведенной к форме Хессенберга. Если H сбалансирована с помощью gebal!, то ilo и ihi являются выходными значениями gebal!. В противном случае они должны быть ilo = 1 и ihi = size(H,2). tau содержит элементарные отражатели факторизации.

source
  • ACM832Дэвис, Тимоти А. (2004b). Алгоритм 832: UMFPACK V4.3–-метод многогранного разложения с нессиметричной структурой. ACM Trans. Math. Softw., 30(2), 196–199. doi:10.1145/992200.992206
  • ACM887Chen, Y., Davis, T. A., Hager, W. W., & Rajamanickam, S. (2008). Algorithm 887: CHOLMOD, Supernodal Sparse Cholesky Factorization and Update/Downdate. ACM Trans. Math. Softw., 35(3). doi:10.1145/1391989.1391995
  • DavisHager2009Davis, Timothy A., & Hager, W. W. (2009). Dynamic Supernodes in Sparse Cholesky Update/Downdate and Triangular Solves. ACM Trans. Math. Softw., 35(4). doi:10.1145/1462173.1462176
  • Bischof1987C Bischof и C Van Loan, "Представление WY для произведений матриц Хаусхолдера", SIAM J Sci Stat Comput 8 (1987), s2-s13. doi:10.1137/0908009
  • Schreiber1989R Schreiber и C Van Loan, "Эффективное по памяти представление WY для произведений преобразований Хаусхолдера", SIAM J Sci Stat Comput 10 (1989), 53-57. doi:10.1137/0910005
  • ACM933Foster, L. V., & Davis, T. A. (2013). Algorithm 933: Reliable Calculation of Numerical Rank, Null Space Bases, Pseudoinverse Solutions, and Basic Solutions Using SuitesparseQR. ACM Trans. Math. Softw., 40(1). doi:10.1145/2513109.2513116
  • Bunch1977J R Bunch и L Kaufman, Некоторые стабильные методы для вычисления инерции и решения симметричных линейных систем, Mathematics of Computation 31:137 (1977), 163-179. url.
  • issue8859Issue 8859, "Fix least squares", https://github.com/JuliaLang/julia/pull/8859
  • B96Åke Björck, "Numerical Methods for Least Squares Problems", SIAM Press, Philadelphia, 1996, "Other Titles in Applied Mathematics", Vol. 51. doi:10.1137/1.9781611971484
  • S84G. W. Stewart, "Rank Degeneracy", SIAM Journal on Scientific and Statistical Computing, 5(2), 1984, 403-413. doi:10.1137/0905030
  • KY88Konstantinos Konstantinides and Kung Yao, "Statistical analysis of effective singular values in matrix rank determination", IEEE Transactions on Acoustics, Speech and Signal Processing, 36(5), 1988, 757-763. doi:10.1109/29.1585
  • H05Nicholas J. Higham, "The squaring and scaling method for the matrix exponential revisited", SIAM Journal on Matrix Analysis and Applications, 26(4), 2005, 1179-1193. doi:10.1137/090768539
  • AH12Awad H. Al-Mohy и Nicholas J. Higham, "Улучшенные алгоритмы обратного масштабирования и квадратирования для матричного логарифма", SIAM Journal on Scientific Computing, 34(4), 2012, C153-C169. doi:10.1137/110852553
  • AHR13Awad H. Al-Mohy, Nicholas J. Higham и Samuel D. Relton, "Вычисление производной Фреше матричного логарифма и оценка числа обусловленности", SIAM Journal on Scientific Computing, 35(4), 2013, C394-C410. doi:10.1137/120885991
  • BH83Åke Björck и Sven Hammarling, "Метод Шура для квадратного корня матрицы", Линейная алгебра и её приложения, 52-53, 1983, 127-140. doi:10.1016/0024-3795(83)80010-X
  • H87Nicholas J. Higham, "Вычисление действительных квадратных корней действительной матрицы", Линейная алгебра и её приложения, 88-89, 1987, 405-430. doi:10.1016/0024-3795(87)90118-2
  • S03Мэтью I. Смит, "Алгоритм Шура для вычисления p-х корней матрицы", SIAM Journal on Matrix Analysis and Applications, том 24, 2003, стр. 971–989. doi:10.1137/S0895479801392697
  • AH16_1Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и гиперболические функции матрицы: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_2Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и гиперболические функции матрицы: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_3Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и обратные гиперболические функции матрицы: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_4Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и обратные гиперболические функции матриц: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_5Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и обратные гиперболические функции матриц: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577
  • AH16_6Мэри Апрахамян и Николас Дж. Хайам, "Обратные тригонометрические и обратные гиперболические функции матриц: теория и алгоритмы", MIMS EPrint: 2016.4. https://doi.org/10.1137/16M1057577