Линейная алгебра

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

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

julia> tr(A)
3

julia> det(A)
104.0

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

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

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

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

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

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

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

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

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

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

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

Здесь Julia удалось определить, что матрица B симметричная, и использовать более подходящее разложение. Когда известно, что матрица имеет определенные свойства, например является симметричной или трехдиагональной, для нее часто можно написать более эффективный код. В Julia доступен ряд особых типов, позволяющих «пометить» матрицу как имеющую такие свойства. Пример:

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

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

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

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

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

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

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

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

Особые матрицы

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

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

Тип Описание

Symmetric

Симметричная матрица

Hermitian

Эрмитова матрица

UpperTriangular

Верхняя треугольная матрица

UnitUpperTriangular

Верхняя треугольная матрица с единичной диагональю

LowerTriangular

Нижняя треугольная матрица

UnitLowerTriangular

Нижняя треугольная матрица с единичной диагональю

UpperHessenberg

Верхняя матрица Хессенберга

Tridiagonal

Трехдиагональная матрица

SymTridiagonal

Симметричная трехдиагональная матрица

Bidiagonal

Верхняя/нижняя бидиагональная матрица

Diagonal

Диагональная матрица

UniformScaling

Оператор равномерного масштабирования

Элементарные операции

Тип матрицы + - * \ Другие функции с оптимизированными методами

Symmetric

МВ

inv, sqrt, exp

Hermitian

МВ

inv, sqrt, exp

UpperTriangular

МВ

МВ

inv, det, logdet

UnitUpperTriangular

МВ

МВ

inv, det, logdet

LowerTriangular

МВ

МВ

inv, det, logdet

UnitLowerTriangular

МВ

МВ

inv, det, logdet

UpperHessenberg

ММ

inv, det

SymTridiagonal

М

М

МС

МВ

eigmax, eigmin

Tridiagonal

М

М

МС

МВ

Bidiagonal

М

М

МС

МВ

Diagonal

М

М

МВ

МВ

inv, det, logdet, /

UniformScaling

М

М

МВС

МВС

/

Условные обозначения

Знак Описание

М (матрица)

Доступен оптимизированный метод для операций над двумя матрицами.

В (вектор)

Доступен оптимизированный метод для операций над матрицей и вектором.

С (скаляр)

Доступен оптимизированный метод для операций над матрицей и скаляром.

Разложение матриц

Тип матрицы LAPACK eigen eigvals eigvecs svd svdvals

Symmetric

SY

ОДИ

Hermitian

HE

ОДИ

UpperTriangular

TR

Структурно

Структурно

Структурно

UnitUpperTriangular

TR

Структурно

Структурно

Структурно

LowerTriangular

TR

Структурно

Структурно

Структурно

UnitLowerTriangular

TR

Структурно

Структурно

Структурно

SymTridiagonal

ST

Структурно

ОДИ

ОВ

Tridiagonal

GT

Bidiagonal

BD

Структурно

Структурно

Diagonal

DI

Структурно

Условные обозначения

Знак Описание Пример

О (общий)

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

например eigvals(M)

Д (диапазон)

Доступен оптимизированный метод для нахождения собственных значений в диапазоне с il по ih.

eigvals(M, il, ih)

И (интервал)

Доступен оптимизированный метод для нахождения собственных значений в интервале [vl, vh].

eigvals(M, vl, vh)

В (векторы)

Доступен оптимизированный метод для нахождения собственных векторов, соответствующих собственным значениям x=[x1, x2,...].

eigvecs(M, x)

Оператор равномерного масштабирования

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

Пример работы оператора UniformScaling:

julia> U = UniformScaling(2);

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

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

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

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

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

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

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

Разложение матриц

Разложение (декомпозиция) матриц представляет собой преобразование матрицы в произведение матриц — один из центральных принципов линейной алгебры.

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

Тип Описание

BunchKaufman

Разложение Банча-Кауфман

Cholesky

Разложение Холецкого

CholeskyPivoted

Разложение Холецкого с выбором ведущего элемента

LDLt

LDL(T)-разложение

LU

LU-разложение

QR

QR-разложение

QRCompactWY

Компактная WY-форма QR-разложения

QRPivoted

QR-разложение с выбором ведущего элемента

LQ

QR-разложение для transpose(A)

Hessenberg

Разложение Хессенберга

Eigen

Спектральное разложение

GeneralizedEigen

Обобщенное спектральное разложение

SVD

Сингулярное разложение

GeneralizedSVD

Обобщенное сингулярное разложение

Schur

Разложение Шура

GeneralizedSchur

Обобщенное разложение Шура

Стандартные функции

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

# Base.:* — Method

*(A::AbstractMatrix, B::AbstractMatrix)

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

Примеры

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

# Base.:\Method

\(A, B)

Деление матриц с помощью полиалгоритма. Для входных матриц 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

# 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

# LinearAlgebra.SingularExceptionType

SingularException

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

# LinearAlgebra.PosDefExceptionType

PosDefException

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

# LinearAlgebra.ZeroPivotExceptionType

ZeroPivotException <: Exception

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

# LinearAlgebra.dotFunction

dot(x, y)
x ⋅ y

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

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

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

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

Примеры

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

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

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

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

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

julia> dot(x, y)
150.0

# LinearAlgebra.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

# 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

# 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

# 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

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

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

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

# LinearAlgebra.DiagonalType

Diagonal(V::AbstractVector)

Создает матрицу с V в качестве ее диагонали.

См. также описание diag и diagm.

Примеры

julia> 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
Diagonal(A::AbstractMatrix)

Создает матрицу из диагонали матрицы A.

Примеры

julia> A = permutedims(reshape(1:15, 5, 3))
3×5 Matrix{Int64}:
  1   2   3   4   5
  6   7   8   9  10
 11  12  13  14  15

julia> Diagonal(A)
3×3 Diagonal{Int64, Vector{Int64}}:
 1  ⋅   ⋅
 ⋅  7   ⋅
 ⋅  ⋅  13

julia> diag(A, 2)
3-element Vector{Int64}:
  3
  9
 15
Diagonal{T}(undef, n)

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

# 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
Bidiagonal(A, uplo::Symbol)

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

Примеры

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

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

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

# LinearAlgebra.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
SymTridiagonal(A::AbstractMatrix)

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

Примеры

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

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

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

julia> SymTridiagonal(B)
2×2 SymTridiagonal{Matrix{Int64}, Vector{Matrix{Int64}}}:
 [1 2; 2 3]  [1 3; 2 4]
 [1 2; 3 4]  [1 2; 2 3]

# LinearAlgebra.TridiagonalType

Tridiagonal(dl::V, d::V, du::V) where V <: AbstractVector

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

Примеры

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

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

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

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

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

Примеры

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

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

# LinearAlgebra.SymmetricType

Symmetric(A, uplo=:U)

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

Примеры

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

julia> Supper = Symmetric(A)
5×5 Symmetric{Int64, Matrix{Int64}}:
 1  0  2  0  3
 0  4  0  5  0
 2  0  7  0  8
 0  5  0  1  0
 3  0  8  0  4

julia> Slower = Symmetric(A, :L)
5×5 Symmetric{Int64, Matrix{Int64}}:
 1  0  6  0  2
 0  4  0  9  0
 6  0  7  0  3
 0  9  0  1  0
 2  0  3  0  4

Обратите внимание, что Supper не будет равен Slower, если матрица A сама по себе не является симметричной (например, если A == transpose(A)).

# LinearAlgebra.HermitianType

Hermitian(A, uplo=:U)

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

Примеры

julia> A = [1 0 2+2im 0 3-3im; 0 4 0 5 0; 6-6im 0 7 0 8+8im; 0 9 0 1 0; 2+2im 0 3-3im 0 4];

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

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

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

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

Hermitian(fill(complex(1,1), 1, 1)) == fill(1, 1, 1)

# 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

# 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

# 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

# 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

# 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

# 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

# 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

# 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

# LinearAlgebra.FactorizationType

LinearAlgebra.Factorization

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

# LinearAlgebra.LUType

LU <: Factorization

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

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

Компонент Описание

F.L

L (нижняя унитреугольная) часть LU

F.U

U (верхнетреугольная) часть LU

F.p

Vector (правой) перестановки

F.P

Matrix (правой) перестановки

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

Примеры

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

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

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

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

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

# LinearAlgebra.luFunction

lu(A::AbstractSparseMatrixCSC; check = true, q = nothing, control = get_umfpack_control()) -> F::UmfpackLU

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

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

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

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

Вектор control по умолчанию соответствует конфигурациям пакета по умолчанию для UMFPACK, но его можно изменить, передав вектор длины UMFPACK_CONTROL. Возможные конфигурации см. в руководстве по UMFPACK. Имена соответствующих переменных начинаются с JL_UMFPACK_, так как в Julia применяется индексирование с отсчетом от единицы.

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

Компонент Описание

L

L (нижнетреугольная) часть LU

U

U (верхнетреугольная) часть LU

p

Vector правой перестановки

q

Vector левой перестановки

Rs

Vector масштабирующих множителей

:

компоненты (L,U,p,q,Rs)

Между F и A существует следующее отношение:

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

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

См. также описание lu!.

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

lu(A, pivot = RowMaximum(); check = true) -> F::LU

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

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

В большинстве случаев, если A является подтипом S для AbstractMatrix{T} с типом элемента T, поддерживающим +, -, * и /, возвращаемый тип представляет собой LU{T,S{T}}.

Как правило, LU-разложение предполагает перестановку строк матрицы (что соответствует выходным данным F.p, описанным ниже), известную как «выбор главного элемента» (так как по сути выбирается строка, содержащая «главный элемент», то есть диагональный элемент F.U). С помощью необязательного аргумента pivot можно выбрать одну из следующих стратегий выбора главного элемента.

  • RowMaximum() (по умолчанию): стандартная стратегия выбора главного элемента; главный элемент соответствует элементу с максимальным абсолютным значением среди оставшихся строк, подлежащих разложению. Такая стратегия выбора главного элемента требует, чтобы тип элемента также поддерживал abs и <. (Это обычно единственный численно устойчивый вариант для матриц значений с плавающей запятой.)

  • RowNonZero(): главный элемент соответствует первому ненулевому элементу среди оставшихся строк, подлежащих разложению. (Это обычный вариант при вычислениях вручную. Он также полезен для более общих алгебраических числовых типов, которые поддерживают iszero, но не abs или <.)

  • NoPivot(): выбор главных элементов отключен (если встретится нулевой элемент, может произойти ошибка).

Доступ к отдельным компонентам разложения F можно получить с помощью функции getproperty.

Компонент Описание

F.L

L (нижнетреугольная) часть LU

F.U

U (верхнетреугольная) часть LU

F.p

Vector (правой) перестановки

F.P

Matrix (правой) перестановки

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

Между F и A существует следующее отношение:

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

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

Поддерживаемая функция LU LU{T,Tridiagonal{T}}

/

\

inv

det

logdet

logabsdet

size

Примеры

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

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

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

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

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

# LinearAlgebra.lu!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.

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
lu!(A, pivot = RowMaximum(); check = true) -> LU

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

Примеры

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

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

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

julia> lu!(iA)
ERROR: InexactError: Int64(0.6666666666666666)
Stacktrace:
[...]

# LinearAlgebra.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

# 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 factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
 4.0  2.0  3.0  1.0
  ⋅   0.0  6.0  2.0
  ⋅    ⋅   9.0  3.0
  ⋅    ⋅    ⋅   1.0
permutation:
4-element Vector{Int64}:
 4
 2
 3
 1

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

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

julia> l == C.L && u == C.U
true

# 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 factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
  2.0   ⋅    ⋅
  6.0  1.0   ⋅
 -8.0  5.0  3.0

julia> C.L * C.U == A
true
cholesky(A, RowMaximum(); tol = 0.0, check = true) -> CholeskyPivoted

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

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

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

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

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

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

Примеры

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

julia> A = X * X';

julia> C = cholesky(A, RowMaximum(), check = false)
CholeskyPivoted{Float64, Matrix{Float64}, Vector{Int64}}
U factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
 4.0  2.0  3.0  1.0
  ⋅   0.0  6.0  2.0
  ⋅    ⋅   9.0  3.0
  ⋅    ⋅    ⋅   1.0
permutation:
4-element Vector{Int64}:
 4
 2
 3
 1

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

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

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

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

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

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

Примеры

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

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

julia> C = cholesky(sparse(A))
SparseArrays.CHOLMOD.Factor{Float64}
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}
type:    LLt
method:  simplicial
maxnnz:  6
nnz:     6
success: true

julia> L = sparse(C.L);

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

julia> L * L' ≈ A
true

Этот метод использует библиотеку CHOLMOD[2][3] из SuiteSparse. CHOLMOD поддерживает только числа типа double или комплексные числа с элементами типа double. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в SparseMatrixCSC{Float64} или SparseMatrixCSC{ComplexF64} в зависимости от ситуации. Многие другие функции из CHOLMOD инкапсулированы, но не экспортированы из модуля Base.SparseArrays.CHOLMOD.

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

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

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

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

См. также описание cholesky.

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

# 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).

# 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).

# 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 уничтожается.

# 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 уничтожается.

# 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.L

L (нижняя унитреугольная) часть LDLt

F.D

D (диагональ) часть LDLt

F.Lt

Lt (верхняя унитреугольная) часть LDLt

F.d

значения диагонали D в виде Vector

Примеры

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

julia> F = ldlt(S)
LDLt{Float64, SymTridiagonal{Float64, Vector{Float64}}}
L factor:
3×3 UnitLowerTriangular{Float64, SymTridiagonal{Float64, Vector{Float64}}}:
 1.0        ⋅         ⋅
 0.333333  1.0        ⋅
 0.0       0.545455  1.0
D factor:
3×3 Diagonal{Float64, Vector{Float64}}:
 3.0   ⋅        ⋅
  ⋅   3.66667   ⋅
  ⋅    ⋅       3.90909

# LinearAlgebra.ldltFunction

ldlt(S::SymTridiagonal) -> LDLt

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

См. также описание bunchkaufman для аналогичного разложения с выбранным главным элементом для произвольных симметричных или эрмитовых матриц.

Примеры

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

julia> ldltS = ldlt(S);

julia> b = [6., 7., 8.];

julia> ldltS \ b
3-element Vector{Float64}:
 1.7906976744186047
 0.627906976744186
 1.3488372093023255

julia> S \ b
3-element Vector{Float64}:
 1.7906976744186047
 0.627906976744186
 1.3488372093023255
ldlt(A::SparseMatrixCSC; shift = 0.0, check = true, perm=nothing) -> CHOLMOD.Factor

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

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

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

Этот метод использует библиотеку CHOLMOD[2][3] из SuiteSparse. CHOLMOD поддерживает только числа типа double или комплексные числа с элементами типа double. Входные матрицы, не относящиеся к этим типам элементов, будут преобразованы в SparseMatrixCSC{Float64} или SparseMatrixCSC{ComplexF64} в зависимости от ситуации. Многие другие функции из CHOLMOD инкапсулированы, но не экспортированы из модуля Base.SparseArrays.CHOLMOD.

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

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

См. также описание ldlt.

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

# LinearAlgebra.QRType

QR <: Factorization

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

где  — это ортогональная или унитарная матрица, а  — верхняя треугольная. Матрица хранится как последовательность отражателей и коэффициентов , где:

При итерации декомпозиции создаются компоненты Q и R.

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

  • factors является матрицей m×n.

    • Верхнетреугольная часть содержит элементы , то есть R = triu(F.factors) для объекта QR F.

    • Часть поддиагонали содержит отражатели , хранящиеся в упакованном формате, где  — это -й столбец матрицы V = I + tril(F.factors, -1).

  • τ представляет собой вектор длиной min(m,n), содержащий коэффициенты .

# LinearAlgebra.QRCompactWYType

QRCompactWY <: Factorization

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

где  — это ортогональная или унитарная матрица, а  — верхняя треугольная. Это аналогично формату QR, за исключением того, что ортогональная или унитарная матрица хранится в формате Compact WY [4]. Для размера блока она хранится как нижняя трапецеидальная матрица m×n и матрица состоящаяиз верхних треугольных матриц размером ×$n_b$ ( ) и верхней трапецеидальной матрицы ×$\min(m,n) - (b-1) n_b$ ( ), верхняя квадратная часть которой, обозначенная , удовлетворяет выражению


так что является -м столбцом матрицы , является -м элементом [diag(T_1); diag(T_2); …; diag(T_b)], а является левым блоком m×min(m, n) матрицы . При создании с использованием qr размер блока задается с помощью .

При итерации декомпозиции создаются компоненты Q и R.

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

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

    • Верхнетреугольная часть содержит элементы , то есть R = triu(F.factors) для объекта QR F.

    • Часть поддиагонали содержит отражатели , хранящиеся в упакованном формате, так что V = I + tril(F.factors, -1).

  • T является матрицей на , как описано выше. Элементы поддиагонали для каждой треугольной матрицы игнорируются.

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

# LinearAlgebra.QRPivotedType

QRPivoted <: Factorization

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

где  — это перестановочная матрица,  — это ортогональная или унитарная матрица, а  — это верхняя треугольная. Матрица хранится как последовательность отражателей Хаусхолдера:

При итерации декомпозиции создаются компоненты Q, R и p.

Объект имеет три поля:

  • factors является матрицей m×n.

    • Верхнетреугольная часть содержит элементы , то есть R = triu(F.factors) для объекта QR F.

    • Часть поддиагонали содержит отражатели , хранящиеся в упакованном формате, где  — это -й столбец матрицы V = I + tril(F.factors, -1).

  • τ представляет собой вектор длиной min(m,n), содержащий коэффициенты .

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

# LinearAlgebra.qrFunction

qr(A, pivot = NoPivot(); blocksize) -> F

Вычисляет QR-разложение матрицы A на ортогональную (или унитарную, если 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)

При итерации декомпозиции создаются компоненты 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. Если 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 factor:
3×3 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}:
 -0.6   0.0   0.8
 -0.8   0.0  -0.6
  0.0  -1.0   0.0
R factor:
2×2 Matrix{Float64}:
 -5.0  10.0
  0.0  -1.0

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

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

qr(A::SparseMatrixCSC; tol=_default_tol(A), ordering=ORDERING_DEFAULT) -> QRSparse

Вычисляет QR-разложение разреженной матрицы A. Используются сокращающие заполнение перестановки строк и столбцов, так что F.R = F.Q'*A[F.prow,F.pcol]. Основным применением данного типа является решение задач методом наименьших квадратов или недоопределенных задач с \. Функция вызывает SPQR[6] библиотеки C.

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

Примеры

julia> A = sparse([1,2,3,4], [1,1,2,2], [1.0,1.0,1.0,1.0])
4×2 SparseMatrixCSC{Float64, Int64} with 4 stored entries:
 1.0   ⋅
 1.0   ⋅
  ⋅   1.0
  ⋅   1.0

julia> qr(A)
SparseArrays.SPQR.QRSparse{Float64, Int64}
Q factor:
4×4 SparseArrays.SPQR.QRSparseQ{Float64, Int64}
R factor:
2×2 SparseMatrixCSC{Float64, Int64} with 2 stored entries:
 -1.41421    ⋅
   ⋅       -1.41421
Row permutation:
4-element Vector{Int64}:
 1
 3
 4
 2
Column permutation:
2-element Vector{Int64}:
 1
 2

# LinearAlgebra.qr!Function

qr!(A, pivot = NoPivot(); blocksize)

Функция qr! аналогична функции qr, когда A является подтипом StridedMatrix, но позволяет экономить дисковое пространство, перезаписывая входную матрицу 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 factor:
2×2 LinearAlgebra.QRCompactWYQ{Float64, Matrix{Float64}, Matrix{Float64}}:
 -0.316228  -0.948683
 -0.948683   0.316228
R factor:
2×2 Matrix{Float64}:
 -3.16228  -4.42719
  0.0      -0.632456

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

julia> qr!(a)
ERROR: InexactError: Int64(3.1622776601683795)
Stacktrace:
[...]

# LinearAlgebra.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 factor:
2×2 Matrix{Float64}:
 -8.60233   0.0
  4.41741  -0.697486
Q factor:
2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}:
 -0.581238  -0.813733
 -0.813733   0.581238

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

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

julia> l == S.L &&  q == S.Q
true

# LinearAlgebra.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 factor:
2×2 Matrix{Float64}:
 -8.60233   0.0
  4.41741  -0.697486
Q factor:
2×2 LinearAlgebra.LQPackedQ{Float64, Matrix{Float64}, Vector{Float64}}:
 -0.581238  -0.813733
 -0.813733   0.581238

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

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

julia> l == S.L &&  q == S.Q
true

# LinearAlgebra.lq!Function

lq!(A) -> LQ

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

# LinearAlgebra.BunchKaufmanType

BunchKaufman <: Factorization

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

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

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

Примеры

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

julia> S = bunchkaufman(A) # A внутренним образом инкапсулируется Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 -0.333333  0.0
  0.0       3.0
U factor:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.666667
  ⋅   1.0
permutation:
2-element Vector{Int64}:
 1
 2

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

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

julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 3.0   0.0
 0.0  -0.333333
L factor:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
 1.0        ⋅
 0.666667  1.0
permutation:
2-element Vector{Int64}:
 2
 1

# LinearAlgebra.bunchkaufmanFunction

bunchkaufman(A, rook::Bool=false; check = true) -> S::BunchKaufman

Вычисляет разложение Банча-Кауфмана [7] симметричной или эрмитовой матрицы 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 = [1 2; 2 3]
2×2 Matrix{Int64}:
 1  2
 2  3

julia> S = bunchkaufman(A) # A внутренним образом инкапсулируется Symmetric(A)
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 -0.333333  0.0
  0.0       3.0
U factor:
2×2 UnitUpperTriangular{Float64, Matrix{Float64}}:
 1.0  0.666667
  ⋅   1.0
permutation:
2-element Vector{Int64}:
 1
 2

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

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

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

julia> S = bunchkaufman(Symmetric(A, :L))
BunchKaufman{Float64, Matrix{Float64}, Vector{Int64}}
D factor:
2×2 Tridiagonal{Float64, Vector{Float64}}:
 3.0   0.0
 0.0  -0.333333
L factor:
2×2 UnitLowerTriangular{Float64, Matrix{Float64}}:
 1.0        ⋅
 0.666667  1.0
permutation:
2-element Vector{Int64}:
 2
 1

julia> S.L*S.D*S.L' - A[S.p, S.p]
2×2 Matrix{Float64}:
 0.0  0.0
 0.0  0.0

# LinearAlgebra.bunchkaufman!Function

bunchkaufman!(A, rook::Bool=false; check = true) -> BunchKaufman

Функция bunchkaufman! аналогична bunchkaufman, но позволяет экономить дисковое пространство, перезаписывая входную матрицу A вместо создания копии.

# 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

# 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

# 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

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

Пример

julia> eigvals(-2)
-2
eigvals(A, B) -> values

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

Примеры

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

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

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

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

Примеры

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

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

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

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

Примеры

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

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

julia> eigvals(A)
3-element Vector{Float64}:
 -2.1400549446402604
  1.0000000000000002
  5.140054944640259

# LinearAlgebra.eigvals!Function

eigvals!(A; permute::Bool=true, scale::Bool=true, sortby) -> values

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

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

Примеры

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

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

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

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

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

Примеры

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

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

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

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

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

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

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

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

# LinearAlgebra.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` cannot have complex eigenvalues.
Stacktrace:
[...]

# 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` cannot have complex eigenvalues.
Stacktrace:
[...]

# 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
eigvecs(A; permute::Bool=true, scale::Bool=true, `sortby`) -> Matrix

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

Примеры

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

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

Примеры

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

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

julia> eigvecs(A, B)
2×2 Matrix{ComplexF64}:
  0.0+1.0im   0.0-1.0im
 -1.0+0.0im  -1.0-0.0im

# LinearAlgebra.eigenFunction

eigen(A; permute::Bool=true, scale::Bool=true, sortby) -> Eigen

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

При итерации декомпозиции создаются компоненты F.values и F.vectors.

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

Для общих несимметричных матриц можно указать способ балансировки матрицы до вычисления собственного значения. Параметр permute=true переставляет матрицу так, чтобы она стала ближе к верхней треугольной, а scale=true масштабирует матрицу по ее диагональным элементам, чтобы сделать строки и столбцы более равными по норме. По умолчанию используется true для обоих параметров.

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

Примеры

julia> F = eigen([1.0 0.0 0.0; 0.0 3.0 0.0; 0.0 0.0 18.0])
Eigen{Float64, Float64, Matrix{Float64}, Vector{Float64}}
values:
3-element Vector{Float64}:
  1.0
  3.0
 18.0
vectors:
3×3 Matrix{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0

julia> F.values
3-element Vector{Float64}:
  1.0
  3.0
 18.0

julia> F.vectors
3×3 Matrix{Float64}:
 1.0  0.0  0.0
 0.0  1.0  0.0
 0.0  0.0  1.0

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

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

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

При итерации декомпозиции создаются компоненты F.values и F.vectors.

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

Примеры

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

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

julia> F = eigen(A, B);

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

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

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

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

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

При итерации декомпозиции создаются компоненты F.values и F.vectors.

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

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

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

eigen(A::Union{SymTridiagonal, Hermitian, Symmetric}, vl::Real, vu::Real) -> Eigen

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

При итерации декомпозиции создаются компоненты F.values и F.vectors.

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

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

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

# LinearAlgebra.eigen!Function

eigen!(A; permute, scale, sortby)
eigen!(A, B; sortby)

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

# LinearAlgebra.HessenbergType

Hessenberg <: Factorization

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

# 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 factor:
3×3 LinearAlgebra.HessenbergQ{Float64, Matrix{Float64}, Vector{Float64}, false}:
 1.0   0.0        0.0
 0.0  -0.707107  -0.707107
 0.0  -0.707107   0.707107
H factor:
3×3 UpperHessenberg{Float64, Matrix{Float64}}:
  4.0      -11.3137       -1.41421
 -5.65685    5.0           2.0
   ⋅        -8.88178e-16   1.0

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

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

julia> q == F.Q && h == F.H
true

# LinearAlgebra.hessenberg!Function

hessenberg!(A) -> Hessenberg

Функция hessenberg! аналогична hessenberg, но позволяет экономить дисковое пространство, перезаписывая входную матрицу A вместо создания копии.

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

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

# 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
schur(A, B) -> F::GeneralizedSchur

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

При итерации декомпозиции создаются компоненты F.S, F.T, F.Q, F.Z, F.α и F.β.

# LinearAlgebra.schur!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 factor:
2×2 Matrix{Float64}:
 3.0   9.0
 0.0  -2.0
Z factor:
2×2 Matrix{Float64}:
  0.961524  0.274721
 -0.274721  0.961524
eigenvalues:
2-element Vector{Float64}:
  3.0
 -2.0

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

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

# LinearAlgebra.ordschurFunction

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

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

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

Переупорядочивает обобщенное разложение Шура F пары матрицы (A, B) = (Q*S*Z', Q*T*Z') в соответствии с логическим массивом select и возвращает объект GeneralizedSchur F. Поиск собственные значения появляются на ведущей диагонали F.S и F.T, а левые и правые ортогональные/унитарные векторы Шура переупорядочиваются, так что (A, B) = F.Q*(F.S, F.T)*F.Z' по-прежнему сохраняется, а обобщенные собственные значения матриц A и B по-прежнему можно получить с помощью F.α./F.β.

# LinearAlgebra.ordschur!Function

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

То же, что и ordschur, но перезаписывает разложение F.

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

То же, что и ordschur, но перезаписывает разложение F.

# LinearAlgebra.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
singular values:
4-element Vector{Float64}:
 3.0
 2.23606797749979
 2.0
 0.0
Vt factor:
4×5 Matrix{Float64}:
 -0.0        0.0  1.0  -0.0  0.0
  0.447214   0.0  0.0   0.0  0.894427
  0.0       -1.0  0.0   0.0  0.0
  0.0        0.0  0.0   1.0  0.0

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

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

julia> u == F.U && s == F.S && v == F.V
true

# 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(_, _), соответствующей функции разложения матрицы.

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

  • U является ортогональной матрицей M на M;

  • V является ортогональной матрицей P на P;

  • Q является ортогональной матрицей N на N;

  • D1 является диагональной матрицей M на (K+L) с единицами в первых K записях;

  • D2 является матрицей P на (K+L), правый верхний блок которой L на L является диагональным;

  • R0 является матрицей (K+L) на N, крайний правый блок которой (K+L) на (K+L), представляет собой несингулярный верхний блок треугольной формы,

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

При итерации декомпозиции создаются компоненты U, V, Q, D1, D2 и R0.

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

Примеры

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

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

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

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

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

# LinearAlgebra.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 (по умолчанию), возвращается «тонкая» сингулярная декомпозиция. Для A в полном разложении U является , а V является , тогда как в тонком разложении U является , а V —  , где  — это число сингулярных значений.

Если 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
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, как в случае сравнения генома человека и дрожжей, или сигнала и шума, или между кластерами и в составе кластеров. (См. обсуждение Эдельмана (Edelman) и Ванга (Wang): https://arxiv.org/abs/1901.00485)

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

Примеры

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

julia> F = svd(A, B);

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

julia> H = R*Q';

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

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

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

julia> U == Uonly
true

# LinearAlgebra.svd!Function

svd!(A; full::Bool = false, alg::Algorithm = default_svd_alg(A)) -> SVD

Функция svd! аналогична svd, но позволяет экономить дисковое пространство, перезаписывая входную матрицу A вместо создания копии. Подробнее см. в документации по svd.

svd!(A, B) -> GeneralizedSVD

Функция svd! аналогична svd, но изменяет аргументы A и B на месте вместо создания копий. Подробнее см. в документации по svd.

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

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

Примеры

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

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

julia> svdvals(A, B)
2-element Vector{Float64}:
 1.0
 1.0

# LinearAlgebra.svdvals!Function

svdvals!(A)

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

svdvals!(A, B)

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

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

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

givens(A::AbstractArray, i1::Integer, i2::Integer, j::Integer) -> (G::Givens, r)

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

B = G*A

имеет свойство, когда

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

См. также описание LinearAlgebra.Givens.

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

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

B = G*x

имеет свойство, когда

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

См. также описание LinearAlgebra.Givens.

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

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

Примеры

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

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

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

# LinearAlgebra.triu!Function

triu!(M)

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

triu!(M, k::Integer)

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

Примеры

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

julia> triu!(M, 1)
5×5 Matrix{Int64}:
 0  2  3  4  5
 0  0  3  4  5
 0  0  0  4  5
 0  0  0  0  5
 0  0  0  0  0

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

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

Примеры

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

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

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

# LinearAlgebra.tril!Function

tril!(M)

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

tril!(M, k::Integer)

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

Примеры

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

julia> tril!(M, 2)
5×5 Matrix{Int64}:
 1  2  3  0  0
 1  2  3  4  0
 1  2  3  4  5
 1  2  3  4  5
 1  2  3  4  5

# LinearAlgebra.diagindFunction

diagind(M, k::Integer=0)

AbstractRange, задающий индексы k-й диагонали матрицы M.

См. также описание 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

# 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

# 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
diagm(v::AbstractVector)
diagm(m::Integer, n::Integer, v::AbstractVector)

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

Примеры

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

# LinearAlgebra.rankFunction

rank(A::AbstractMatrix; atol::Real=0, rtol::Real=atol>0 ? 0 : n*ϵ)
rank(A::AbstractMatrix, rtol::Real)

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

Совместимость: 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
rank(::QRSparse{Tv,Ti}) -> Ti

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

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

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

# LinearAlgebra.normFunction

norm(A, p::Real=2)

Для любого итерируемого контейнера A (включая массивы любого измерения) чисел (или любого типа элементов, для которых определена norm) вычисляет p-норму (по умолчанию p=2), как если бы A был вектором соответствующей длины.

p-норма определяется следующим образом:

где  — элементы ,  — норма (norm) , а  — длина . Поскольку p-норма вычисляется с помощью норм (norm) записей матрицы A, p-норма вектора векторов не может интерпретироваться в общем как блочный вектор, если p != 2.

p может принимать любое числовое значение (хотя не все значения дают математически допустимую векторную норму). В частности, norm(A, Inf) возвращает наибольшее значение в abs.(A), тогда как norm(A, -Inf) возвращает наименьшее значение. Если A-- матрица и p=2, то она эквивалентна норме Фробениуса.

Второй аргумент p необязательно является частью интерфейса для norm, т. е. пользовательский тип может реализовывать norm(A) только без второго аргумента.

Для вычисления операторной нормы матрицы используйте opnorm.

Примеры

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

julia> norm(v)
7.0

julia> norm(v, 1)
11.0

julia> norm(v, Inf)
6.0

julia> norm([1 2 3; 4 5 6; 7 8 9])
16.881943016134134

julia> norm([1 2 3 4 5 6 7 8 9])
16.881943016134134

julia> norm(1:9)
16.881943016134134

julia> norm(hcat(v,v), 1) == norm(vcat(v,v), 1) != norm([v,v], 1)
true

julia> norm(hcat(v,v), 2) == norm(vcat(v,v), 2) == norm([v,v], 2)
true

julia> norm(hcat(v,v), Inf) == norm(vcat(v,v), Inf) != norm([v,v], Inf)
true
norm(x::Number, p::Real=2)

Для чисел возвращается .

Примеры

julia> norm(2, 1)
2.0

julia> norm(-2, 1)
2.0

julia> norm(2, 2)
2.0

julia> norm(-2, 2)
2.0

julia> norm(2, Inf)
2.0

julia> norm(-2, Inf)
2.0

# LinearAlgebra.opnormFunction

opnorm(A::AbstractMatrix, p::Real=2)

Вычисляет операторную норму (или матричную норму), порожденную векторной p-нормой, где допустимыми значениями p являются 1, 2 или Inf. (Обратите внимание, что для разреженных матриц p=2 в настоящее время не реализуется.) Используйте norm для вычисления нормы Фробениуса.

Если p=1, операторной нормой является максимальная абсолютная сумма столбцов матрицы A:

где  — элементы матрицы , а и  — ее измерения.

Если p=2, операторной нормой является спектральная норма, равная наибольшему сингулярному значению матрицы A.

Если p=Inf, операторной нормой является максимальная абсолютная сумма строк матрицы A:

Примеры

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

julia> opnorm(A, Inf)
6.0

julia> opnorm(A, 1)
5.0
opnorm(x::Number, p::Real=2)

Для чисел возвращается . Это эквивалентно norm.

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

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

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

Примеры

julia> v = [1; im];

julia> vc = v';

julia> opnorm(vc, 1)
1.0

julia> norm(vc, 1)
2.0

julia> norm(v, 1)
2.0

julia> opnorm(vc, 2)
1.4142135623730951

julia> norm(vc, 2)
1.4142135623730951

julia> norm(v, 2)
1.4142135623730951

julia> opnorm(vc, Inf)
2.0

julia> norm(vc, Inf)
1.0

julia> norm(v, Inf)
1.0

# LinearAlgebra.normalize!Function

normalize!(a::AbstractArray, p::Real=2)

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

# 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

# LinearAlgebra.condFunction

cond(M, p::Real=2)

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

# LinearAlgebra.condskeelFunction

condskeel(M, [x, p::Real=Inf])

Число обусловленности Шкееля матрицы M, дополнительно с учетом вектора x, вычисляемое с помощью операторной p-нормы. обозначает матрицу (поэлементных) абсолютных значений ; . Допустимыми значениями для p являются 1, 2 или Inf (по умолчанию).

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

# LinearAlgebra.trFunction

tr(M)

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

Примеры

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

julia> tr(A)
5

# 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

# 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

# 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)

# 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

# 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)))))).

Дополнительные сведения: [8], [9], [10], [11].

Примеры

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

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

julia> M * N
2×2 Matrix{Float64}:
 1.0          -2.22045e-16
 4.44089e-16   1.0

# LinearAlgebra.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) типа элемента матрицы M.

Примеры

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

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

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

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

# Base.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

# Base.kron!Function

kron!(C, A, B)

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

Совместимость: Julia 1.6

Для этой функции требуется версия не ниже Julia 1.6.

exp(A::AbstractMatrix)

Вычисляет матричный экспоненциал A, определяемый следующим образом:

Для симметричной или эрмитовой матрицы A используется разложение по собственным значениям (eigen), в противном случае выбирается алгоритм масштабирования и возведения в квадрат (см. [12]).

Примеры

julia> A = Matrix(1.0I, 2, 2)
2×2 Matrix{Float64}:
 1.0  0.0
 0.0  1.0

julia> exp(A)
2×2 Matrix{Float64}:
 2.71828  0.0
 0.0      2.71828

# Base.cisMethod

cis(A::AbstractMatrix)

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

См. также описание функций cispi, sincos и exp.

Совместимость: Julia 1.7

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

Примеры

julia> cis([π 0; 0 π]) ≈ -I
true

# Base.:^Method

^(A::AbstractMatrix, p::Number)

Степень матрицы, эквивалент

Примеры

julia> [1 2; 0 3]^3
2×2 Matrix{Int64}:
 1  26
 0  27

# Base.:^Method

^(b::Number, A::AbstractMatrix)

Матричный экспоненциал, эквивалент .

Совместимость: 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

# Base.logMethod

log(A::AbstractMatrix)

Если матрица A не имеет отрицательного вещественного собственного значения, вычисляет натуральный матричный логарифм A, т. е. уникальную матрицу такую, что и