svds

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

Синтаксис

s = svds(A)
s = svds(A,k)
s = svds(A,k,sigma)
s = svds(A,k,sigma,Name,Value)
s = svds(A,k,sigma,opts)
s = svds(Afun,n,___)
[U,S,V] = svds(___)
[U,S,V,flag] = 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')

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

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

Алгоритм 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')

Последняя запись в 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 при использовании числового скаляра переключает 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 должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: 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' и неотрицательного целого числа. Значение '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 выбирает стартовые векторы восстанавливаемым способом с помощью частного потока случайных чисел. Изменение seed случайных чисел не влияет на это использование 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 выбирает стартовые векторы восстанавливаемым способом с помощью частного потока случайных чисел. Изменение seed случайных чисел не влияет на это использование 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'.

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

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

Советы

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

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

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

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

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

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

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

Ссылки

[1] Baglama, J. и Л. Рейчель, “Увеличенные Неявно Перезапущенные Методы Lanczos Bidiagonalization”. SIAM Journal на Научных вычислениях. Издание 27, 2005, стр 19–42.

[2] Ларсен, R. M. “Lanczos Bidiagonalization с частичной переортогонализацией. Отдел Информатики, Орхусский университет. ПЕТАБАЙТ DAIMI 357, 1998.

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

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

|

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