Факторизация Холесского
T = chol(A)
[T,p] =
chol(A)
[T,p,S]
= chol(A)
[T,p,s]
= chol(A,'vector')
___ = chol(A,'lower')
___ = chol(A,'nocheck')
___ = chol(A,'real')
___ = chol(A,'lower','nocheck','real')
[T,p,s]
= chol(A,'lower','vector','nocheck','real')
возвращает верхнюю треугольную матрицу T
= chol(A
)T
, такой что T'*T = A
. A
должен быть Эрмитовой положительной определенной матрицей. В противном случае этот синтаксис выдает ошибку.
[
вычисляет факторизацию Холесского T
,p
] =
chol(A
)A
. Этот синтаксис не делает ошибки, если A
не является Эрмитовой положительной определенной матрицей. Если A
является Эрмитовой положительной определенной матрицей, то p
0. В противном случае T
является sym([])
, и p
является положительным целым числом (обычно, p = 1
).
___ = chol(
пропуски, проверяющие, является ли матричный A
,'nocheck'
)A
Эрмитовым положительный определенный. 'nocheck'
позволяет вам вычислить факторизацию Холесского матрицы, которая содержит символьные параметры, не устанавливая дополнительные предположения на тех параметрах.
___ = chol(
вычисляет факторизацию Холесского A
,'real'
)A
с помощью арифметики действительных чисел. В этом случае chol
вычисляет симметричную факторизацию A = T.'*T
вместо Эрмитовой факторизации A = T'*T
. Этот подход основан на том, что, если A
действителен и симметричен, то T'*T = T.'*T
. Используйте 'real'
, чтобы избежать сопряженных комплексных чисел в результате.
___ = chol(
вычисляет факторизацию Холесского A
,'lower'
,'nocheck'
,'real'
)A
с одним или несколькими из этих дополнительных аргументов: 'lower'
, 'nocheck'
и 'real'
. Эти дополнительные аргументы могут появиться в любом порядке.
[
вычисляет факторизацию Холесского T
,p
,s
]
= chol(A
,'lower'
,'vector'
,'nocheck'
,'real'
)A
и возвращает информацию о перестановке как векторный s
. Можно использовать один или несколько из этих дополнительных аргументов: 'lower'
, 'nocheck'
и 'real'
. Эти дополнительные аргументы могут появиться в любом порядке.
Вычислите факторизацию Холесского 3х3 Гильбертовой матрицы. Поскольку эти числа не являются символьными объектами, вы получаете результаты с плавающей точкой.
chol(hilb(3))
ans = 1.0000 0.5000 0.3333 0 0.2887 0.2887 0 0 0.0745
Теперь преобразуйте эту матрицу в символьный объект и вычислите факторизацию Холесского:
chol(sym(hilb(3)))
ans = [ 1, 1/2, 1/3] [ 0, 3^(1/2)/6, 3^(1/2)/6] [ 0, 0, 5^(1/2)/30]
Вычислите факторизацию Холесского 3х3 матрицы Паскаля возврат нижней треугольной матрицы в результате:
chol(sym(pascal(3)), 'lower')
ans = [ 1, 0, 0] [ 1, 1, 0] [ 1, 2, 1]
Попытайтесь вычислить факторизацию Холесского этой матрицы. Поскольку эта матрица не Эрмитова положительный определенный, chol
, используемый без выходных аргументов или с одним выходным аргументом, выдает ошибку:
A = sym([1 1 1; 1 2 3; 1 3 5]);
T = chol(A)
Error using sym/chol (line 132) Cannot prove that input matrix is Hermitian positive definite. Define a Hermitian positive definite matrix by setting appropriate assumptions on matrix components, or use 'nocheck' to skip checking whether the matrix is Hermitian positive definite.
Чтобы подавить ошибку, используйте два выходных аргумента, T
и p
. Если матрица не распознана Эрмитовой положительный определенный, то этот синтаксис присваивает пустой символьный объект T
и значению 1
к p
:
[T,p] = chol(A)
T = [ empty sym ] p = 1
Для Эрмитовой положительной определенной матрицы p
0:
[T,p] = chol(sym(pascal(3)))
T = [ 1, 1, 1] [ 0, 1, 2] [ 0, 0, 1] p = 0
Также 'nocheck'
позволяет вам пропустить проверку, является ли A
Эрмитовой положительной определенной матрицей. Таким образом этот флаг позволяет вам вычислить факторизацию Холесского символьной матрицы, не устанавливая дополнительные предположения на ее компонентах сделать его Эрмитовым положительный определенный:
syms a A = [a 0; 0 a]; chol(A,'nocheck')
ans = [ a^(1/2), 0] [ 0, a^(1/2)]
Если вы используете 'nocheck'
для вычисления факторизации Холесского матрицы, которая не является Эрмитова положительный определенный, chol
может возвратить матричный T
, для которого идентичность T'*T = A
не содержит. Чтобы заставить isAlways
возвратить логический 0
(false
) для неразрешимых условий, установите Unknown
на false
.
T = chol(sym([1 1; 2 1]), 'nocheck')
T = [ 1, 2] [ 0, 3^(1/2)*1i]
isAlways(A == T'*T,'Unknown','false')
ans = 2×2 logical array 0 0 0 0
Вычислите факторизацию Холесского 3х3 обратной Гильбертовой матрицы, возвращающей матрицу перестановок:
A = sym(invhilb(3)); [T, p, S] = chol(A)
T = [ 3, -12, 10] [ 0, 4*3^(1/2), -5*3^(1/2)] [ 0, 0, 5^(1/2)] p = 0 S = 1 0 0 0 1 0 0 0 1
Вычислите факторизацию Холесского 3х3 обратной Гильбертовой матрицы, возвращающей информацию о перестановке как вектор:
A = sym(invhilb(3)); [T, p, S] = chol(A, 'vector')
T = [ 3, -12, 10] [ 0, 4*3^(1/2), -5*3^(1/2)] [ 0, 0, 5^(1/2)] p = 0 S = 1 2 3
Вычислите факторизацию Холесского матричного A
, содержащего символьные параметры. Без дополнительных предположений на параметре a
эта матрица не является Эрмитовой. Чтобы заставить isAlways
возвратить логический 0
(false
) для неразрешимых условий, установите Unknown
на false
.
syms a A = [a 0; 0 a]; isAlways(A == A','Unknown','false')
ans = 2×2 logical array 0 1 1 0
Путем установки предположений на a
и b
, можно задать A
, чтобы быть Эрмитовы положительный определенный. Поэтому можно вычислить факторизацию Холесского A
:
assume(a > 0) chol(A)
ans = [ a^(1/2), 0] [ 0, a^(1/2)]
Для дальнейших вычислений удалите предположения на a
путем воссоздания его с помощью syms
:
syms a
Вычислите факторизацию Холесского этой матрицы. Чтобы пропустить проверку, является ли это Эрмитовым положительный определенный, используйте 'nocheck'
. По умолчанию chol
вычисляет Эрмитовую факторизацию A = T'*T
. Таким образом результат содержит сопряженные комплексные числа.
syms a b A = [a b; b a]; T = chol(A, 'nocheck')
T = [ a^(1/2), conj(b)/conj(a^(1/2))] [ 0, (a*abs(a) - abs(b)^2)^(1/2)/abs(a)^(1/2)]
Чтобы избежать сопряженных комплексных чисел в результате, используйте 'real'
:
T = chol(A, 'nocheck', 'real')
T = [ a^(1/2), b/a^(1/2)] [ 0, ((a^2 - b^2)/a)^(1/2)]
Когда вы используете этот флаг, chol
вычисляет симметричную факторизацию A = T.'*T
вместо Эрмитовой факторизации A = T'*T
. Чтобы заставить isAlways
возвратить логический 0
(false
) для неразрешимых условий, установите Unknown
на false
.
isAlways(A == T.'*T)
ans = 2×2 logical array 1 1 1 1
isAlways(A == T'*T,'Unknown','false')
ans = 2×2 logical array 0 0 0 0
Матричные вычисления, включающие много символьных переменных, могут быть медленными. Чтобы увеличить вычислительную скорость, сократите количество символьных переменных путем заменения данными значениями некоторые переменные.
Вызов chol
для числовых аргументов, которые не являются символьными объектами, вызывает
функцию MATLAB® chol
.
Если вы будете использовать 'nocheck'
, то тождества T'*T = A
(для верхней треугольной матрицы T
) и T*T' = A
(для нижнего треугольного матричного T
), как гарантируют, не будут содержать.
Если вы будете использовать 'real'
, то тождества T'*T = A
(для верхней треугольной матрицы T
) и T*T' = A
(для нижнего треугольного матричного T
), как только гарантируют, будут содержать для действительного симметричного положительного определенного A
.
Чтобы использовать 'vector'
, необходимо задать три выходных аргумента. Другие флаги не требуют конкретного количества выходных аргументов.
Если вы используете 'matrix'
вместо 'vector'
, то chol
возвращает матрицы перестановки, как это делает по умолчанию.
Если вы используете 'upper'
вместо 'lower'
, то chol
возвращает верхнюю треугольную матрицу, как это делает по умолчанию.
Если A
не является Эрмитовой положительной определенной матрицей, то синтаксисы, содержащие аргумент p
обычно, возвращают p = 1
и пустой символьный объект T
.
Чтобы проверять, является ли матрица Эрмитовой, используйте оператор '
(или его функциональная форма ctranspose
). Матричный A
является Эрмитовым, если и только если A'= A
, где A'
является сопряженным транспонированием A
.