Сингулярное разложение символьной матрицы
[
возвращает числовые унитарные матрицы U
,S
,V
]
= svd(A
)U
и V
с столбцами, содержащими сингулярные векторы и диагональную матрицу S
содержащие сингулярные значения. Матрицы удовлетворяют условию A = U*S*V'
, где V'
является гермитовым транспонированием (комплексным сопряженным транспонированием) V
. В сингулярном векторном расчете используется арифметика переменной точности. svd
не вычисляет символьные сингулярные векторы. Поэтому матрица входа A
должен быть преобразован в числа с плавающей запятой. Для примера это может быть матрица символьных чисел.
Вычислите сингулярные значения символьной 5
-by- 5
магический квадрат:
A = sym(magic(5)); sigma = svd(A)
sigma = 65 5^(1/2)*(1345^(1/2) + 65)^(1/2) 65^(1/2)*(5^(1/2) + 5)^(1/2) 65^(1/2)*(5 - 5^(1/2))^(1/2) 5^(1/2)*(65 - 1345^(1/2))^(1/2)
Теперь вычислите сингулярные значения матрицы, элементы которой являются символьными выражениями:
syms t real A = [0 1; -1 0]; E = expm(t*A) sigma = svd(E)
E = [ cos(t), sin(t)] [ -sin(t), cos(t)] sigma = (cos(t)^2 + sin(t)^2)^(1/2) (cos(t)^2 + sin(t)^2)^(1/2)
Упростите результат:
sigma = simplify(sigma)
sigma = 1 1
Для дальнейших расчетов удалите предположение на t
путем воссоздания его используя syms
:
syms t
Преобразуйте элементы символического 5
-by- 5
магический квадрат - числа с плавающей запятой и вычисление сингулярных значений матрицы:
A = sym(magic(5)); sigma = svd(vpa(A))
sigma = 65.0 22.547088685879657984674226396467 21.687425355202639411956035427154 13.403565997991492328585154445703 11.900789544861194527298509087321
Вычислите сингулярные значения и сингулярные векторы 5
-by- 5
магический квадрат:
old = digits(10); A = sym(magic(5)) [U, S, V] = svd(A) digits(old)
A = [ 17, 24, 1, 8, 15] [ 23, 5, 7, 14, 16] [ 4, 6, 13, 20, 22] [ 10, 12, 19, 21, 3] [ 11, 18, 25, 2, 9] U = [ 0.4472135955, 0.5456348731, 0.5116672736, -0.1954395076, -0.4497583632] [ 0.4472135955, 0.4497583632, -0.1954395076, 0.5116672736, 0.5456348731] [ 0.4472135955, 2.420694008e-15, -0.632455532, -0.632455532, 1.29906993e-15] [ 0.4472135955, -0.4497583632, -0.1954395076, 0.5116672736, -0.5456348731] [ 0.4472135955, -0.5456348731, 0.5116672736, -0.1954395076, 0.4497583632] S = [ 65.0, 0, 0, 0, 0] [ 0, 22.54708869, 0, 0, 0] [ 0, 0, 21.68742536, 0, 0] [ 0, 0, 0, 13.403566, 0] [ 0, 0, 0, 0, 11.90078954] V = [ 0.4472135955, 0.4045164361, 0.2465648962, 0.6627260007, 0.3692782866] [ 0.4472135955, 0.005566159714, 0.6627260007, -0.2465648962, -0.5476942741] [ 0.4472135955, -0.8201651916, -3.091014288e-15, 6.350407543e-16, 0.3568319751] [ 0.4472135955, 0.005566159714, -0.6627260007, 0.2465648962, -0.5476942741] [ 0.4472135955, 0.4045164361, -0.2465648962, -0.6627260007, 0.3692782866]
Вычислите продукт U
, S
и гермитов транспонирования V
с 10-значной точностью. Результатом является исходная матрица A
со всеми его элементами, преобразованными в числа с плавающей запятой:
vpa(U*S*V',10)
ans = [ 17.0, 24.0, 1.0, 8.0, 15.0] [ 23.0, 5.0, 7.0, 14.0, 16.0] [ 4.0, 6.0, 13.0, 20.0, 22.0] [ 10.0, 12.0, 19.0, 21.0, 3.0] [ 11.0, 18.0, 25.0, 2.0, 9.0]
Используйте второй входной параметр 0
для вычисления тонкого, или экономичного, SVD этого 3
-by- 2
матрица:
old = digits(10); A = sym([1 1;2 2; 2 2]); [U, S, V] = svd(A, 0)
U = [ 0.3333333333, -0.6666666667] [ 0.6666666667, 0.6666666667] [ 0.6666666667, -0.3333333333] S = [ 4.242640687, 0] [ 0, 0] V = [ 0.7071067812, 0.7071067812] [ 0.7071067812, -0.7071067812]
Теперь используйте второй входной параметр 'econ'
вычислить тонкую матрицу, или экономичность B
. Вот, 3
-by- 2
матрица B
- транспонирование A
.
B = A'; [U, S, V] = svd(B, 'econ') digits(old)
U = [ 0.7071067812, -0.7071067812] [ 0.7071067812, 0.7071067812] S = [ 4.242640687, 0] [ 0, 0] V = [ 0.3333333333, 0.6666666667] [ 0.6666666667, -0.6666666667] [ 0.6666666667, 0.3333333333]
Вторые аргументы 0
и 'econ'
влияют только на форму возвращенных матриц. Эти аргументы не влияют на эффективность расчетов.
Вызывающие svd
для числовых матриц, которые не являются символьными объектами, MATLAB® svd
функция.
Матричные расчеты с участием многих символьных переменных могут быть медленными. Чтобы увеличить вычислительную скорость, уменьшите количество символьных переменных, подставив заданные значения для некоторых переменных.