svds

Подмножество сингулярных значений и векторов

Описание

пример

s = svds(A) возвращает вектор из шести самых больших сингулярных значений матрицы A. Это полезно при вычислении всех сингулярных значений с svd является вычислительно дорогим, например, с большими разреженными матрицами.

пример

s = svds(A,k) возвращает k наибольшие сингулярные значения.

пример

s = svds(A,k,sigma) возвращает k сингулярные значения, основанные на значении sigma. Для примера, svds(A,k,'smallest') возвращает k наименьшие сингулярные значения.

s = svds(A,k,sigma,Name,Value) задает дополнительные опции с одним или несколькими аргументами пары "имя-значение". Для примера, svds(A,k,sigma,'Tolerance',1e-3) настраивает допуск сходимости для алгоритма.

пример

s = svds(A,k,sigma,opts) задает опции с использованием структуры.

пример

s = svds(Afun,n,___) задает указатель на функцию Afun вместо матрицы. Второй входной n задает размер матрицы A используется в Afun. Можно опционально задать k, sigma, opts, или пары "имя-значение" в качестве дополнительных входных параметров.

пример

[U,S,V] = svds(___) возвращает левые сингулярные векторы U, диагональная матрица S сингулярных значений и правых сингулярных векторов V. Можно использовать любой из комбинаций входных аргументов в предыдущих синтаксисах.

пример

[U,S,V,flag] = svds(___) также возвращает флаг сходимости. Если flag является 0, затем все сингулярные значения сходились.

Примеры

свернуть все

Матрица A = delsq(numgrid('C',15)) - симметричная положительно определенная матрица с сингулярными значениями, достаточно хорошо распределенными в интервале (0 8). Вычислите шесть самых больших сингулярных значений.

A = delsq(numgrid('C',15));
s = svds(A)
s = 6×1

    7.8666
    7.7324
    7.6531
    7.5213
    7.4480
    7.3517

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

s = svds(A,3)
s = 3×1

    7.8666
    7.7324
    7.6531

Матрица A = delsq(numgrid('C',15)) - симметричная положительно определенная матрица с сингулярными значениями, достаточно хорошо распределенными в интервале (0 8). Вычислите пять наименьших сингулярных значений.

A = delsq(numgrid('C',15));
s = svds(A,5,'smallest')
s = 5×1

    0.5520
    0.4787
    0.3469
    0.2676
    0.1334

Создайте разреженную матрицу Неймана 100 на 100.

C = gallery('neumann',100);

Вычислите десять наименьших сингулярных значений.

ss = svds(C,10,'smallest')
ss = 10×1

    0.9828
    0.9049
    0.5625
    0.5625
    0.4541
    0.4506
    0.2256
    0.1139
    0.1139
         0

Вычислите 10 наименьших ненулевых сингулярных значений. Поскольку матрица имеет сингулярное значение, которое равно нулю, 'smallestnz' опция опускает его.

snz = svds(C,10,'smallestnz')
snz = 10×1

    0.9828
    0.9828
    0.9049
    0.5625
    0.5625
    0.4541
    0.4506
    0.2256
    0.1139
    0.1139

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

n = 500;
B = rand(500);
C = rand(500);

Сохраните Afun в текущей директории так, чтобы он был доступен для использования с svds.

function y = Afun(x,tflag,B,C,n)
if strcmp(tflag,'notransp')
    y = [B*x(n+1:end); C*x(1:n)];
else
    y = [C'*x(n+1:end); B'*x(1:n)];
end

Функция Afun использует B и C для вычисления любой из A*x или A'*x (в зависимости от заданного флага), фактически не образуя разреженную матрицу A = [zeros(n) B; C zeros(n)]. Это использует шаблон разреженности матрицы, чтобы сохранить память в расчетах A*x и A'*x.

Использование Afun вычислить 10 крупнейших сингулярных значений A. Передайте B, C, и n как дополнительные входы для Afun.

s = svds(@(x,tflag) Afun(x,tflag,B,C,n),[1000 1000],10)
s =

  250.3248
  249.9914
   12.7627
   12.7232
   12.6988
   12.6608
   12.6166
   12.5643
   12.5419
   12.4512

Непосредственно вычислите 10 крупнейших сингулярных значений A для сравнения результатов.

A = [zeros(n) B; C zeros(n)];
s = svds(A,10)
s =

  250.3248
  249.9914
   12.7627
   12.7232
   12.6988
   12.6608
   12.6166
   12.5643
   12.5419
   12.4512

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

Загрузка west0479 и храните его как A.

load west0479
A = west0479;

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

[U,S,V,cflag] = svds(A);
cflag
cflag = 0

cflag указывает, что все сингулярные значения сходятся. Сингулярные значения указаны на диагонали выходной матрицы S.

s = diag(S)
s = 6×1
105 ×

    3.1895
    3.1725
    3.1695
    3.1685
    3.1669
    0.3038

Проверьте результаты путем вычисления полного сингулярного разложения A. Преобразование A в полную матрицу и использовать svd.

[U1,S1,V1] = svd(full(A));

Постройте график шести крупнейших сингулярных значений A вычисляется по svd и svds использование логарифмической шкалы.

s2 = diag(S1);
semilogy(s2(1:6),'r.')
hold on
semilogy(s,'ro','MarkerSize',10)
title('Singular Values of west0479')
legend('svd','svds')

Figure contains an axes. The axes with title Singular Values of west0479 contains 2 objects of type line. These objects represent svd, svds.

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

A = diag(sparse([1e4*ones(1, 8) 1e4:-1:1]));
s = svds(A)
Warning: Only 2 of the 6 requested singular values converged. Singular values that did not converge are NaN.
s = 6×1
104 ×

    1.0000
    0.9999
       NaN
       NaN
       NaN
       NaN

The svds алгоритм выдает предупреждение, так как было выполнено максимальное количество итераций, но не удалось выполнить допуск.

Наиболее эффективным способом решения проблем сходимости является увеличение максимального размера подпространства Крылова, используемого в вычислении, путем использования большего значения для 'SubspaceDimension'. Сделайте это, передав в пару "имя-значение" 'SubspaceDimension' со значением 60.

s = svds(A,6,'largest','SubspaceDimension',60)
s = 6×1
104 ×

    1.0000
    1.0000
    1.0000
    1.0000
    1.0000
    1.0000

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

rng default
format shortg
B = spdiags([repelem([1; 1e-7], [198, 2]) ones(200, 1)], [0 1], 200, 200);
s1 = svds(B,10,'smallest')
Warning: Large residual norm detected. This is likely due to bad condition of the input matrix (condition number 1.0008e+16).
s1 = 10×1

       7.0945
       7.0945
       7.0945
       7.0945
       7.0945
       7.0945
       7.0945
       7.0945
      0.25927
   7.0888e-16

Предупреждение указывает, что svds не вычисляет соответствующие сингулярные значения. Отказ с svds происходит из-за зазора между наименьшим и вторым наименьшими сингулярными значениями. svds(...,'smallest') нужно инвертировать B, что приводит к большой числовой ошибке.

Для сравнения вычислите точные сингулярные значения с помощью svd.

s = svd(full(B));
s = s(end-9:end)
s = 10×1

      0.14196
      0.12621
      0.11045
     0.094686
     0.078914
     0.063137
     0.047356
     0.031572
     0.015787
   7.0888e-16

В порядок воспроизведения этого вычисления с svds, сделать QR-разложение B. Сингулярные значения треугольной матрицы R те же, что и для B.

[Q,R,p] = qr(B,0);

Постройте график нормы для каждой строки R.

rownormR = sqrt(diag(R*R'));
semilogy(rownormR)
hold on;
semilogy(size(R, 1), rownormR(end), 'ro')

Figure contains an axes. The axes contains 2 objects of type line.

Последняя запись в R почти равен нулю, что вызывает нестабильность в решении.

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

R(end,:) = 0;

Использование svds найти 10 наименьших сингулярных значений R. Результаты сопоставимы с результатами, полученными svd.

sr = svds(R,10,'smallest')
sr = 10×1

      0.14196
      0.12621
      0.11045
     0.094686
     0.078914
     0.063137
     0.047356
     0.031572
     0.015787
            0

Чтобы вычислить сингулярные векторы B используя этот метод, преобразуйте левый и правый сингулярные векторы с помощью Q и вектор сочетания p.

[U,S,V] = svds(R,20,'s');
U = Q*U;
V(p,:) = V;

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

свернуть все

Входная матрица. A обычно, но не всегда, большая и разреженная матрица.

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

Число сингулярных значений, заданное как положительное скалярное целое число. svds возвращает меньше сингулярных значений, чем запрашивается, если достигается одно из следующих условий:

  • k больше min(size(A))

  • sigma = 'smallestnz' и k больше, чем количество ненулевых сингулярных значений A

Если k слишком велик, тогда svds заменяет его на максимальное допустимое значение k.

Пример: svds(A,2) возвращает два самых больших сингулярных значений A.

Тип сингулярных значений, заданных в качестве одного из следующих значений.

ОпцияОписание

'largest' (по умолчанию)

Наибольшие сингулярные значения

'smallest'

Наименьшие сингулярные значения

'smallestnz'

Наименьшие ненулевые сингулярные значения

скаляр

Сингулярные значения, ближайшие к скаляру

Пример: svds(A,k,'smallest') вычисляет k наименьшие сингулярные значения.

Пример: svds(A,k,100) вычисляет k сингулярные значения, ближайшие к 100.

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

Структура опций, заданная как структура, содержащая одно или несколько полей в этой таблице.

Примечание

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

Опционное полеОписаниеПара "имя-значение"
tol

Допуск сходимости

'Tolerance'
maxit

Максимальное количество итераций

'MaxIterations'
p

Максимальный размер подпространства Крылова

'SubspaceDimension'
u0

Левый начальный стартовый вектор

'LeftStartVector'
v0

Правый начальный стартовый вектор

'RightStartVector'
disp

Уровень отображения диагностической информации

'Display'
failОбработка неконвертированных сингулярных значений в выходе'FailureTreatment'

Примечание

svds игнорирует опцию p при использовании числового скаляра shift sigma.

Пример: opts.tol = 1e-6, opts.maxit = 500 создает структуру с набором значений для полей tol и maxit.

Типы данных: struct

Матричная функция, заданная как указатель на функцию. Функция Afun должны удовлетворять следующим условиям:

  • Afun(x,'notransp') принимает вектор x и возвращает продукт A*x.

  • Afun(x,'transp') принимает вектор x и возвращает продукт A'*x.

Примечание

Используйте указатели на функцию только в том случае, когда sigma = 'largest' (который является значением по умолчанию).

Пример: svds(Afun,[1000 1200])

Размер матричной A который используется в Afun, заданный как двухэлементный вектор размера [m n].

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: s = svds(A,k,sigma,'Tolerance',1e-10,'MaxIterations',100) ослабляет допуск сходимости и использует меньше итераций.

Допуск сходимости, заданный как разделенная разделенными запятой парами, состоящая из 'Tolerance' и неотрицательный действительный числовой скаляр.

Пример: s = svds(A,k,sigma,'Tolerance',1e-3)

Максимальное количество итераций алгоритма, заданное как разделенная разделенными запятой парами, состоящая из 'MaxIterations' и положительное целое число.

Пример: s = svds(A,k,sigma,'MaxIterations',350)

Максимальный размер подпространства Крылова, заданный как разделенная разделенными запятой парами, состоящая из 'SubspaceDimension' и неотрицательное целое число. The 'SubspaceDimension' значение должно быть больше или равно k + 2, где k - число сингулярных значений.

Для задач, где svds не сходится, увеличивая значение 'SubspaceDimension' может улучшить поведение сходимости.

Эта опция игнорируется для числовых значений sigma.

Пример: s = svds(A,k,sigma,'SubspaceDimension',25)

Левый начальный стартовый вектор, заданный как разделенная разделенными запятой парами, состоящая из 'LeftStartVector' и числовой вектор.

Можно задать любой из 'LeftStartVector' или 'RightStartVector', но не то и другое. Если ни одна из опций не задана, то для m-by- n матрица A, по умолчанию является:

  • m < n - Левый начальный стартовый вектор установлен в randn(m,1)

  • m >= n - Правый начальный стартовый вектор, установленный на randn(n,1)

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

Примечание

svds выбирает стартовые векторы воспроизводимым способом, используя частный поток случайных чисел. Изменение начального числа случайных чисел не влияет на это использование randn.

Пример: s = svds(A,k,sigma,'LeftStartVector',randn(m,1)) использует случайный стартовый вектор, который черпает значения из глобального потока случайных чисел.

Типы данных: double

Правый начальный вектор, заданный как разделенная разделенными запятой парами, состоящая из 'RightStartVector' и числовой вектор.

Можно задать любой из 'LeftStartVector' или 'RightStartVector', но не то и другое. Если ни одна из опций не задана, то для m-by- n матрица A, по умолчанию является:

  • m < n - Левый начальный стартовый вектор установлен в randn(m,1)

  • m >= n - Правый начальный стартовый вектор, установленный на randn(n,1)

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

Примечание

svds выбирает стартовые векторы воспроизводимым способом, используя частный поток случайных чисел. Изменение начального числа случайных чисел не влияет на это использование randn.

Пример: s = svds(A,k,sigma,'RightStartVector',randn(n,1)) использует случайный стартовый вектор, который черпает значения из глобального потока случайных чисел.

Типы данных: double

Обработка неконвертированных сингулярных значений, заданная как разделенная разделенными запятой парами, состоящая из 'FailureTreatment' и один из опций: 'replacenan', 'keep', или 'drop'.

Значение 'FailureTreatment' определяет, как в выходных данных отображаются неконвертированные сингулярные значения.

Опция

Влияние на выход

'drop'

Неконвертированные сингулярные значения удаляются из выхода, что может привести к svds возвращает меньше сингулярных значений, чем запрашивается. Это значение является значением по умолчанию для числовых значений sigma.

'replacenan'

Неконвертированные сингулярные значения заменяются на NaN значения. Это значение является значением по умолчанию всякий раз sigma не является числовым.

'keep'

В выход включаются неконвертированные сингулярные значения.

Пример: s = svds(A,k,sigma,'FailureTreatment','drop') удаляет из выхода неконвертированные сингулярные значения.

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

Переключатель для отображения диагностической информации, заданный как false, true, 0, или 1. Значения false или 0 выключить отображение, а значения true или 1 включите его.

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

свернуть все

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

Левые сингулярные векторы, возвращенные как столбцы матрицы. Если A является m-by- n матрица, и вы запрашиваете k сингулярные значения, затем U является m-by- k матрица с ортонормальными столбцами.

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

Сингулярные значения, возвращенные как диагональная матрица. Диагональные элементы S являются неотрицательными сингулярными значениями. Если A является m-by- n матрица, и вы запрашиваете k сингулярные значения, затем S является k-by- k.

Правые сингулярные векторы, возвращенные как столбцы матрицы. Если A является m-by- n матрица, и вы запрашиваете k сингулярные значения, затем V является n-by- k матрица с ортонормальными столбцами.

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

Флаг сходимости, возвращенный как скаляр. Значение 0 указывает, что все сингулярные значения сходятся. В противном случае не все сингулярные значения сходятся.

Использование этого флага сходимости выхода подавляет предупреждения о неудачной сходимости.

Совет

  • svdsketch полезно, когда вы не знаете раньше времени, с каким рангом указывать svds, но вы знаете, какой допуск должно удовлетворять приближение SVD.

  • svds генерирует стартовые векторы по умолчанию, используя частный поток случайных чисел, чтобы гарантировать повторяемость между запусками. Установка состояния генератора случайных чисел с помощью rng перед вызовом svds не влияет на выход.

  • Использование svds не самый эффективный способ найти несколько сингулярных значений малых, плотных матриц. Для таких задач используйте svd(full(A)) может быть быстрее. Для примера нахождение трех сингулярных значений в матрице 500 на 500 является относительно небольшой задачей, которая svd может легко обработать.

  • Если svds не сходится для заданной матрицы, увеличить размер подпространства Крылова путем увеличения значения 'SubspaceDimension'. Как вторичные опции, корректировка максимального количества итераций ('MaxIterations') и допуск сходимости ('Tolerance') также может помочь с сходимостью поведения.

  • Увеличение k иногда может улучшить эффективность, особенно когда матрица имеет повторные сингулярные значения.

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

расширить все

Поведение изменено в R2016a

Ссылки

[1] Baglama, J. and L. Reichel, «Augmented Implicitly Restarted Lanczos Bidiagonalization Methods». SIAM Journal on Scientific Computing. Том 27, 2005, стр. 19-42.

[2] Larsen, R. M. «Lanczos Bidiagonalization with partial reorthogonalization». Кафедра компьютерных наук Орхусского университета. DAIMI PB-357, 1998.

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

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