Подмножество сингулярных значений и векторов
задает дополнительные опции с одним или несколькими аргументами пары "имя-значение". Для примера, s = svds(A,k,sigma,Name,Value)svds(A,k,sigma,'Tolerance',1e-3) настраивает допуск сходимости для алгоритма.
Матрица 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
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')

Последняя запись в 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 - Входная матрицаВходная матрица. A обычно, но не всегда, большая и разреженная матрица.
Типы данных: double
Поддержка комплексного числа: Да
k - Число сингулярных значений для вычисленияЧисло сингулярных значений, заданное как положительное скалярное целое число. svds возвращает меньше сингулярных значений, чем запрашивается, если достигается одно из следующих условий:
k больше min(size(A))
sigma = 'smallestnz' и k больше, чем количество ненулевых сингулярных значений A
Если k слишком велик, тогда svds заменяет его на максимальное допустимое значение k.
Пример: svds(A,2) возвращает два самых больших сингулярных значений A.
sigma - Тип сингулярных значений'largest' (по умолчанию) | 'smallest' | 'smallestnz' | скалярТип сингулярных значений, заданных в качестве одного из следующих значений.
| Опция | Описание |
|---|---|
|
| Наибольшие сингулярные значения |
| Наименьшие сингулярные значения |
| Наименьшие ненулевые сингулярные значения |
скаляр | Сингулярные значения, ближайшие к скаляру |
Пример: svds(A,k,'smallest') вычисляет k наименьшие сингулярные значения.
Пример: svds(A,k,100) вычисляет k сингулярные значения, ближайшие к 100.
Типы данных: double | char | string
opts - Структура опцийСтруктура опций, заданная как структура, содержащая одно или несколько полей в этой таблице.
Примечание
Использование структуры опций для задания опций не рекомендуется. Вместо этого используйте пары "имя-значение".
| Опционное поле | Описание | Пара "имя-значение" |
|---|---|---|
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 должны удовлетворять следующим условиям:
Afun(x,'notransp') принимает вектор x и возвращает продукт A*x.
Afun(x,'transp') принимает вектор x и возвращает продукт A'*x.
Примечание
Используйте указатели на функцию только в том случае, когда sigma = 'largest' (который является значением по умолчанию).
Пример: svds(Afun,[1000 1200])
n - Размер матрицы, используемой AfunРазмер матричной A который используется в Afun, заданный как двухэлементный вектор размера [m n].
Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.
s = svds(A,k,sigma,'Tolerance',1e-10,'MaxIterations',100) ослабляет допуск сходимости и использует меньше итераций.'Tolerance' - Допуск сходимости1e-14 (по умолчанию) | неотрицательным вещественным скаляромДопуск сходимости, заданный как разделенная разделенными запятой парами, состоящая из 'Tolerance' и неотрицательный действительный числовой скаляр.
Пример: s = svds(A,k,sigma,'Tolerance',1e-3)
'MaxIterations' - Максимальное количество итераций алгоритма300 (по умолчанию) | положительное целое числоМаксимальное количество итераций алгоритма, заданное как разделенная разделенными запятой парами, состоящая из 'MaxIterations' и положительное целое число.
Пример: s = svds(A,k,sigma,'MaxIterations',350)
'SubspaceDimension' - Максимальный размер крыловского подпространстваmax(3*k,15) (по умолчанию) | неотрицательное целое числоМаксимальный размер подпространства Крылова, заданный как разделенная разделенными запятой парами, состоящая из 'SubspaceDimension' и неотрицательное целое число. The 'SubspaceDimension' значение должно быть больше или равно k + 2, где k - число сингулярных значений.
Для задач, где svds не сходится, увеличивая значение 'SubspaceDimension' может улучшить поведение сходимости.
Эта опция игнорируется для числовых значений sigma.
Пример: s = svds(A,k,sigma,'SubspaceDimension',25)
'LeftStartVector' - Левый начальный стартовый векторЛевый начальный стартовый вектор, заданный как разделенная разделенными запятой парами, состоящая из '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' - Правый начальный стартовый векторПравый начальный вектор, заданный как разделенная разделенными запятой парами, состоящая из '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' и один из опций: 'replacenan', 'keep', или 'drop'.
Значение 'FailureTreatment' определяет, как в выходных данных отображаются неконвертированные сингулярные значения.
|
Опция |
Влияние на выход |
|---|---|
|
|
Неконвертированные сингулярные значения удаляются из выхода, что может привести к |
|
|
Неконвертированные сингулярные значения заменяются на |
|
|
В выход включаются неконвертированные сингулярные значения. |
Пример: s = svds(A,k,sigma,'FailureTreatment','drop') удаляет из выхода неконвертированные сингулярные значения.
Типы данных: char | string
'Display' - Переключение для отображения диагностической информацииfalse (по умолчанию) | true | 0 | 1Переключатель для отображения диагностической информации, заданный как false, true, 0, или 1. Значения false или 0 выключить отображение, а значения true или 1 включите его.
s - Сингулярные значенияСингулярные значения, возвращенные как вектор-столбец. Сингулярные значения являются неотрицательными вещественными числами, перечисленными в порядке убывания.
U - Левые сингулярные векторыЛевые сингулярные векторы, возвращенные как столбцы матрицы. Если A является m-by- n матрица, и вы запрашиваете k сингулярные значения, затем U является m-by- k матрица с ортонормальными столбцами.
Различные машины, релизы MATLAB®, или параметры (такие как начальный вектор и размерность подпространства) могут производить различные сингулярные векторы, которые все еще численно точны. Соответствующие столбцы в U и V могут переворачивать свои знаки, так как это не влияет на значение выражения A = U*S*V'.
S - Сингулярные значенияСингулярные значения, возвращенные как диагональная матрица. Диагональные элементы S являются неотрицательными сингулярными значениями. Если A является m-by- n матрица, и вы запрашиваете k сингулярные значения, затем S является k-by- k.
V - Правые сингулярные векторыПравые сингулярные векторы, возвращенные как столбцы матрицы. Если A является m-by- n матрица, и вы запрашиваете k сингулярные значения, затем V является n-by- k матрица с ортонормальными столбцами.
Различные машины, релизы MATLAB или параметры (такие как начальный вектор и размерность подпространства) могут производить различные сингулярные векторы, которые все еще численно точны. Соответствующие столбцы в U и V могут переворачивать свои знаки, так как это не влияет на значение выражения A = U*S*V'.
flag - Флаг сходимостиФлаг сходимости, возвращенный как скаляр. Значение 0 указывает, что все сингулярные значения сходятся. В противном случае не все сингулярные значения сходятся.
Использование этого флага сходимости выхода подавляет предупреждения о неудачной сходимости.
svdsketch полезно, когда вы не знаете раньше времени, с каким рангом указывать svds, но вы знаете, какой допуск должно удовлетворять приближение SVD.
svds генерирует стартовые векторы по умолчанию, используя частный поток случайных чисел, чтобы гарантировать повторяемость между запусками. Установка состояния генератора случайных чисел с помощью rng перед вызовом svds не влияет на выход.
Использование svds не самый эффективный способ найти несколько сингулярных значений малых, плотных матриц. Для таких задач используйте svd(full(A)) может быть быстрее. Для примера нахождение трех сингулярных значений в матрице 500 на 500 является относительно небольшой задачей, которая svd может легко обработать.
Если svds не сходится для заданной матрицы, увеличить размер подпространства Крылова путем увеличения значения 'SubspaceDimension'. Как вторичные опции, корректировка максимального количества итераций ('MaxIterations') и допуск сходимости ('Tolerance') также может помочь с сходимостью поведения.
Увеличение k иногда может улучшить эффективность, особенно когда матрица имеет повторные сингулярные значения.
Поведение изменено в R2016a
Воспроизводимость
Вызов svds несколько раз подряд теперь приводит к одному и тому же результату. Чтобы изменить это поведение:
В R2017a или более ранних версиях установите u0 или v0 поле структуры опций в случайный вектор.
В R2017b или более поздней версии предпочтите настройку 'LeftStartVector' или 'RightStartVector' в случайный вектор.
[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.
Указания и ограничения по применению:
Если вы предоставляете sigma параметр, значение должно быть 'largest'.
Для получения дополнительной информации смотрите Запуск функций MATLAB на графическом процессоре (Parallel Computing Toolbox).
Указания и ограничения по применению:
Если вы предоставляете sigma параметр, значение должно быть 'largest'.
Для получения дополнительной информации смотрите Запуск функций MATLAB с распределенными массивами (Parallel Computing Toolbox).
У вас есть измененная версия этого примера. Вы хотите открыть этот пример с вашими правками?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.