exponenta event banner

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

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 при использовании числового скалярного сдвига 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' и неотрицательное целое число. '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 выбирает начальные векторы воспроизводимым образом с использованием потока частных случайных чисел. Изменение начального числа случайных чисел не влияет на использование 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 выбирает начальные векторы воспроизводимым образом с использованием потока частных случайных чисел. Изменение начального числа случайных чисел не влияет на использование 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около-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'.

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

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

Совет

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

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

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

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

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

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

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

В R2016a изменилось поведение

Ссылки

[1] Баглама, Дж. и Л. Райхель, «Дополненные неявно перезапущенные методы бидиагонализации Ланцоса». Журнал SIAM по научным вычислениям. Том 27, 2005, стр. 19-42.

[2] Ларсен, Р. М. «Ланцос Бидиагонализация с частичной реортогонализацией». Кафедра компьютерных наук Орхусского университета. DAIMI PB-357, 1998.

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

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