svd

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

Описание

пример

S = svd(A) возвращает сингулярные значения матричного A в порядке убывания.

пример

[U,S,V] = svd(A) выполняет сингулярное разложение матричного A, таким образом, что A = U*S*V'.

пример

[___] = svd(A,"econ") производит разложение размера экономики A использование любой из предыдущих комбинаций выходного аргумента. Если A m- n матрица, затем:

  • m > n — Только первый n столбцы U вычисляются, и S n- n.

  • m = nsvd(A,"econ") эквивалентно svd(A).

  • m < n — Только первый m столбцы V вычисляются, и S m- m.

Разложение размера экономики удаляет дополнительные строки или столбцы нулей из диагональной матрицы сингулярных значений, S, наряду со столбцами в любом U или V это умножает те нули в выражении A = U*S*V'. Удаление этих нулей и столбцов может улучшить время выполнения и уменьшать требования устройства хранения данных, не ставя под угрозу точность разложения.

пример

[___] = svd(A,0) производит различное разложение размера экономики m- n матричный A:

  • m > nsvd(A,0) эквивалентно svd(A,"econ").

  • m <= nsvd(A,0) эквивалентно svd(A).

[___] = svd(___,outputForm) опционально задает выходной формат для сингулярных значений. Можно использовать эту опцию с любой из предыдущих комбинаций аргументов ввода или вывода. Задайте "vector" возвращать сингулярные значения как вектор-столбец или "matrix" возвращать сингулярные значения в диагональной матрице.

Примеры

свернуть все

Вычислите сингулярные значения матрицы полного ранга.

A = [1 0 1; -1 -2 0; 0 1 -1]
A = 3×3

     1     0     1
    -1    -2     0
     0     1    -1

s = svd(A)
s = 3×1

    2.4605
    1.6996
    0.2391

Найдите сингулярное разложение прямоугольного матричного A.

A = [1 2; 3 4; 5 6; 7 8]
A = 4×2

     1     2
     3     4
     5     6
     7     8

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

   -0.1525   -0.8226   -0.3945   -0.3800
   -0.3499   -0.4214    0.2428    0.8007
   -0.5474   -0.0201    0.6979   -0.4614
   -0.7448    0.3812   -0.5462    0.0407

S = 4×2

   14.2691         0
         0    0.6268
         0         0
         0         0

V = 2×2

   -0.6414    0.7672
   -0.7672   -0.6414

Подтвердите отношение A = U*S*V', в точности машины.

U*S*V'
ans = 4×2

    1.0000    2.0000
    3.0000    4.0000
    5.0000    6.0000
    7.0000    8.0000

Вычислите полные разложения и разложения размера экономики прямоугольной матрицы.

A = [1 2; 3 4; 5 6; 7 8]
A = 4×2

     1     2
     3     4
     5     6
     7     8

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

   -0.1525   -0.8226   -0.3945   -0.3800
   -0.3499   -0.4214    0.2428    0.8007
   -0.5474   -0.0201    0.6979   -0.4614
   -0.7448    0.3812   -0.5462    0.0407

S = 4×2

   14.2691         0
         0    0.6268
         0         0
         0         0

V = 2×2

   -0.6414    0.7672
   -0.7672   -0.6414

[U,S,V] = svd(A,"econ")
U = 4×2

   -0.1525   -0.8226
   -0.3499   -0.4214
   -0.5474   -0.0201
   -0.7448    0.3812

S = 2×2

   14.2691         0
         0    0.6268

V = 2×2

   -0.6414    0.7672
   -0.7672   -0.6414

Начиная с A 4 2, svd(A,"econ") возвращает меньше столбцов в U и меньше строк в S по сравнению с полным разложением. Дополнительные строки нулей в S исключены, наряду с соответствующими столбцами в U это умножило бы с теми нулями в выражении A = U*S*V'.

Создайте 6 6 матрицу магического квадрата и вычислите SVD. По умолчанию, svd возвращает сингулярные значения в диагональной матрице, когда вы задаете несколько выходных параметров.

A = magic(6);
[U,S,V] = svd(A)
U = 6×6

   -0.4082    0.5574    0.0456   -0.4182    0.3092    0.5000
   -0.4082   -0.2312    0.6301   -0.2571   -0.5627   -0.0000
   -0.4082    0.4362    0.2696    0.5391    0.1725   -0.5000
   -0.4082   -0.3954   -0.2422   -0.4590    0.3971   -0.5000
   -0.4082    0.1496   -0.6849    0.0969   -0.5766   -0.0000
   -0.4082   -0.5166   -0.0182    0.4983    0.2604    0.5000

S = 6×6

  111.0000         0         0         0         0         0
         0   50.6802         0         0         0         0
         0         0   34.3839         0         0         0
         0         0         0   10.1449         0         0
         0         0         0         0    5.5985         0
         0         0         0         0         0    0.0000

V = 6×6

   -0.4082    0.6234   -0.3116    0.2495    0.2511    0.4714
   -0.4082   -0.6282    0.3425    0.1753    0.2617    0.4714
   -0.4082   -0.4014   -0.7732   -0.0621   -0.1225   -0.2357
   -0.4082    0.1498    0.2262   -0.4510    0.5780   -0.4714
   -0.4082    0.1163    0.2996    0.6340   -0.3255   -0.4714
   -0.4082    0.1401    0.2166   -0.5457   -0.6430    0.2357

Задайте "vector" опция, чтобы возвратить сингулярные значения в вектор-столбце.

[U,S,V] = svd(A,"vector")
U = 6×6

   -0.4082    0.5574    0.0456   -0.4182    0.3092    0.5000
   -0.4082   -0.2312    0.6301   -0.2571   -0.5627   -0.0000
   -0.4082    0.4362    0.2696    0.5391    0.1725   -0.5000
   -0.4082   -0.3954   -0.2422   -0.4590    0.3971   -0.5000
   -0.4082    0.1496   -0.6849    0.0969   -0.5766   -0.0000
   -0.4082   -0.5166   -0.0182    0.4983    0.2604    0.5000

S = 6×1

  111.0000
   50.6802
   34.3839
   10.1449
    5.5985
    0.0000

V = 6×6

   -0.4082    0.6234   -0.3116    0.2495    0.2511    0.4714
   -0.4082   -0.6282    0.3425    0.1753    0.2617    0.4714
   -0.4082   -0.4014   -0.7732   -0.0621   -0.1225   -0.2357
   -0.4082    0.1498    0.2262   -0.4510    0.5780   -0.4714
   -0.4082    0.1163    0.2996    0.6340   -0.3255   -0.4714
   -0.4082    0.1401    0.2166   -0.5457   -0.6430    0.2357

Если вы задаете один выходной аргумент, такой как S = svd(A), затем svd поведение переключателей, чтобы возвратить сингулярные значения в вектор-столбце по умолчанию. В этом случае можно задать "matrix" опция, чтобы возвратить сингулярные значения как диагональную матрицу.

Используйте результаты сингулярного разложения определить ранг, пробел столбца и ядро матрицы.

A = [2 0 2; 0 1 0; 0 0 0]
A = 3×3

     2     0     2
     0     1     0
     0     0     0

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

     1     0     0
     0     1     0
     0     0     1

S = 3×3

    2.8284         0         0
         0    1.0000         0
         0         0         0

V = 3×3

    0.7071         0   -0.7071
         0    1.0000         0
    0.7071         0    0.7071

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

s = diag(S);
rank_A = nnz(s)
rank_A = 2

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

column_basis = U(:,logical(s))
column_basis = 3×2

     1     0
     0     1
     0     0

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

null_basis = V(:,~s)
null_basis = 3×1

   -0.7071
         0
    0.7071

Функции rankorth, и null обеспечьте удобные способы вычислить эти количества.

Входные параметры

свернуть все

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

Типы данных: single | double
Поддержка комплексного числа: Да

Выходной формат сингулярных значений в виде одного из этих значений:

  • "vector" S вектор-столбец. Это - поведение по умолчанию, когда вы задаете тот выход, S = svd(X).

  • "matrix" S диагональная матрица. Это - поведение по умолчанию, когда вы задаете несколько выходных параметров, [U,S,V] = svd(X).

Пример: [U,S,V] = svd(X,"vector") возвращает S как вектор-столбец вместо диагональной матрицы.

Пример: S = svd(X,"matrix") возвращает S как диагональная матрица вместо вектор-столбца.

Типы данных: char | string

Выходные аргументы

свернуть все

Оставленные сингулярные векторы, возвращенные как столбцы матрицы.

  • Для m- n матричный A с m > n, разложения размера экономики svd(A,"econ") и svd(A,0) вычислите только первый n столбцы U. В этом случае, столбцы U являются ортогональными и U m- n матрица, которая удовлетворяет UHU=In.

  • Для полных разложений, svd(A) возвращает U как m- m удовлетворение унитарной матрицы UUH=UHU=Im. Столбцы U это соответствует ненулевой форме сингулярных значений набор ортонормированных векторов базиса области значений A.

Различные машины и релизы MATLAB® может произвести различные сингулярные векторы, которые все еще численно точны. Соответствующие столбцы в U и V может инвертировать их знаки, поскольку это не влияет на значение выражения A = U*S*V'.

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

Если A m- n матрица и S диагональная матрица, затем размер S следующие:

  • Разложение размера экономики svd(A,"econ") возвращает S как квадратная матрица порядка min([m,n]).

  • Для полных разложений, svd(A) возвращает S с тем же размером как A.

  • Для svd(A,0):

    • Если m > n, затем S квадратная матрица порядка min([m,n]).

    • Если m < n, затем S имеет тот же размер как A.

Кроме того, сингулярные значения в S возвращены в вектор-столбце или диагональной матрице в зависимости от того, как вы вызываете svd и ли вы задаете outputForm опция:

  • Если вы вызываете svd с одним выходом или задают "vector" опция, затем S вектор-столбец.

  • Если вы вызываете svd с несколькими выходными параметрами или задают "matrix" опция, затем S диагональная матрица.

Правильные сингулярные векторы, возвращенные как столбцы матрицы.

  • Для m- n матричный A с m < n, разложение экономики svd(A,"econ") вычисляет только первый m столбцы V. В этом случае, столбцы V являются ортогональными и V n- m матрица, которая удовлетворяет VHV=Im.

  • Для полных разложений, svd(A) возвращает V как n- n удовлетворение унитарной матрицы VVH=VHV=In. Столбцы V это не соответствует ненулевой форме сингулярных значений набор ортонормированных векторов базиса пустого пробела A.

Различные машины и релизы MATLAB могут произвести различные сингулярные векторы, которые все еще численно точны. Соответствующие столбцы в U и V может инвертировать их знаки, поскольку это не влияет на значение выражения A = U*S*V'.

Вопросы совместимости

развернуть все

Поведение изменяется в R2021b

Расширенные возможности

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

| | | | |

Представлено до R2006a