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. Передайте BC, и 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 object. The axes object 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

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.2593
    0.0000

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

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

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

    0.1420
    0.1262
    0.1105
    0.0947
    0.0789
    0.0631
    0.0474
    0.0316
    0.0158
    0.0000

Для того, чтобы воспроизвести это вычисление с 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 object. The axes object contains 2 objects of type line.

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

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

R(end,:) = 0;

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

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

    0.1420
    0.1262
    0.1105
    0.0947
    0.0789
    0.0631
    0.0474
    0.0316
    0.0158
         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,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' и неотрицательное целое число. 'SubspaceDimension' значение должно быть больше или быть равно k + 2, где k число сингулярных значений.

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

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

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

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

Можно задать любой 'LeftStartVector' или 'RightStartVector', но не то и другое одновременно. Если никакая опция не задана, то для m- 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- 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

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

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

свернуть все

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

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

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

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

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

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

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

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

Советы

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

  • 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