Подмножество сингулярных значений и векторов
задает дополнительные опции с одним или несколькими аргументами пары "имя-значение". Например, 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
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')
Последняя запись в 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
— Введите матрицуВведите матрицу. 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
при использовании числового скаляра переключают 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
— Максимальное количество итераций алгоритма
(значение по умолчанию) | положительное целое числоМаксимальное количество итераций алгоритма в виде разделенной запятой пары, состоящей из 'MaxIterations'
и положительное целое число.
Пример: s = svds(A,k,sigma,'MaxIterations',350)
SubspaceDimension
— Максимальный размер подпространства Крыловаmax(3*k,15)
(значение по умолчанию) | неотрицательное целое числоМаксимальный размер подпространства Крылова в виде разделенной запятой пары, состоящей из 'SubspaceDimension'
и неотрицательное целое число. 'SubspaceDimension'
значение должно быть больше или быть равно k + 2
, где k
число сингулярных значений.
Для проблем, где svds
сбои, чтобы сходиться, увеличивая значение 'SubspaceDimension'
может улучшить поведение сходимости.
Эта опция проигнорирована для числовых значений sigma
.
Пример: s = svds(A,k,sigma,'SubspaceDimension',25)
LeftStartVector
— Оставленный начальный стартовый векторОставленный начальный стартовый вектор в виде разделенной запятой пары, состоящей из '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
— Правильный начальный стартовый векторПравильный начальный стартовый вектор в виде разделенной запятой пары, состоящей из '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'
и одна из опций: '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
- n
матрица и вы запрашиваете k
сингулярные значения, затем U
m
- k
матрица с ортонормированными столбцами.
Различные машины, релизы MATLAB®, или параметры (такие как стартовый вектор и размерность подпространства) могут произвести различные сингулярные векторы, которые все еще численно точны. Соответствующие столбцы в U
и V
может инвертировать их знаки, поскольку это не влияет на значение выражения A = U*S*V'
.
S
Сингулярные значенияСингулярные значения, возвращенные как диагональная матрица. Диагональные элементы S
неотрицательные сингулярные значения. Если A
m
- n
матрица и вы запрашиваете k
сингулярные значения, затем S
k
- k
.
V
— Правильные сингулярные векторыПравильные сингулярные векторы, возвращенные как столбцы матрицы. Если A
m
- n
матрица и вы запрашиваете k
сингулярные значения, затем V
n
- k
матрица с ортонормированными столбцами.
Различные машины, релизы MATLAB или параметры (такие как стартовый вектор и размерность подпространства) могут произвести различные сингулярные векторы, которые все еще численно точны. Соответствующие столбцы в U
и V
может инвертировать их знаки, поскольку это не влияет на значение выражения A = U*S*V'
.
flag
— Флаг ConvergenceФлаг Convergence, возвращенный как скаляр. Значение 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. и Л. Рейчель, “Увеличенные Неявно Перезапущенные Методы Lanczos Bidiagonalization”. SIAM Journal на Научных вычислениях. Издание 27, 2005, стр 19–42.
[2] Ларсен, R. M. “Lanczos Bidiagonalization с частичной переортогонализацией”. Отдел Информатики, Орхусский университет. ПЕТАБАЙТ DAIMI 357, 1998.
backgroundPool
или ускорьте код с Parallel Computing Toolbox™ ThreadPool
.Эта функция полностью поддерживает основанные на потоке среды. Для получения дополнительной информации смотрите функции MATLAB Запуска в Основанной на потоке Среде.
Указания и ограничения по применению:
Если вы обеспечиваете sigma
параметр, значением должен быть 'largest'
.
Для получения дополнительной информации смотрите функции MATLAB Запуска на графическом процессоре (Parallel Computing Toolbox).
Указания и ограничения по применению:
Если вы обеспечиваете sigma
параметр, значением должен быть 'largest'
.
Для получения дополнительной информации смотрите функции MATLAB Запуска с Распределенными Массивами (Parallel Computing Toolbox).
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.