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

Сингулярное разложение выражает m-by- n матрица A как A = U*S*V'. Здесь, S является m-by- n диагональная матрица с сингулярными значениями A на его диагонали. Столбцы m-by- m матрица U являются левыми сингулярными векторами для соответствующих сингулярных значений. Столбцы n-by- n матрица V являются правыми сингулярными векторами для соответствующих сингулярных значений. V' - гермитова транспозиция (комплексный конъюгат транспозы) V.

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

svd(A)

или с одним выходным аргументом

S = svd(A)

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

[U,S,V] = svd(A)

svd возвращает две унитарные матрицы, U и V, столбцы которых являются сингулярными векторами. Это также возвращает диагональную матрицу, S, содержащая сингулярные значения на его диагонали. Элементами всех трех матриц являются числа с плавающей запятой. Точность расчетов определяется текущей настройкой digits.

Создайте n-by- n матрица A с элементами, заданными A(i,j) = 1/(i - j + 1/2). Самый очевидный способ генерации этой матрицы -

n = 3;
for i = 1:n
    for j = 1:n
      A(i,j) = sym(1/(i-j+1/2));
   end
end

Для n = 3, матрица

A
A =
[   2,  -2, -2/3]
[ 2/3,   2,   -2]
[ 2/5, 2/3,    2]

Вычислите сингулярные значения этой матрицы. Если вы используете svd непосредственно, он вернёт точный символический результат. Для этой матрицы результат очень длинный. Если вы предпочитаете более короткий числовой результат, преобразуйте элементы A для чисел с плавающей запятой с использованием vpa. Затем используйте svd для вычисления сингулярных значений этой матрицы с помощью арифметики переменной точности:

S = svd(vpa(A))
S =
 3.1387302525015353960741348953506
 3.0107425975027462353291981598225
 1.6053456783345441725883965978052

Теперь вычислите сингулярные значения и сингулярные векторы A:

[U,S,V] = svd(A)
U =
[  0.53254331027335338470683368360204,  0.76576895948802052989304092179952,...
                                        0.36054891952096214791189887728353]
[ -0.82525689650849463222502853672224,  0.37514965283965451993171338605042,...
                                        0.42215375485651489522488031917364]
[  0.18801243961043281839917114171742, -0.52236064041897439447429784257224,...
                                        0.83173955292075192178421874331406]
 
S =
[ 3.1387302525015353960741348953506,                                 0,...
                                                                     0]
[                                 0, 3.0107425975027462353291981598225,...
                                                                     0]
[                                 0,                                 0,...
                                     1.6053456783345441725883965978052]
 
V =
[  0.18801243961043281839917114171742,  0.52236064041897439447429784257224,...
                                        0.83173955292075192178421874331406]
[ -0.82525689650849463222502853672224, -0.37514965283965451993171338605042,...
                                        0.42215375485651489522488031917364]
[  0.53254331027335338470683368360204, -0.76576895948802052989304092179952,...
                                        0.36054891952096214791189887728353]