Подмножество сингулярных значений и векторов
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
,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.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
при использовании числового скаляра переключает 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
должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.
s = svds(A,k,sigma,'Tolerance',1e-10,'MaxIterations',100)
ослабляет допуск сходимости и использует меньше итераций.Допуск
Допуск сходимости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'
и неотрицательного целого числа. Значение '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
выбирает стартовые векторы восстанавливаемым способом с помощью частного потока случайных чисел. Изменение seed случайных чисел не влияет на это использование 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
выбирает стартовые векторы восстанавливаемым способом с помощью частного потока случайных чисел. Изменение 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
Отображение
Переключитесь для диагностического отображения информации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
— ConvergenceФлаг Convergence, возвращенный как скаляр. Значение 0
указывает, что все сингулярные значения сходились. В противном случае не все сингулярные значения сходились.
Использование этого флага сходимости вывод отключает предупреждения о не пройдено сходимости.
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.
Указания и ограничения по применению:
Если вы обеспечиваете параметр sigma
, значением должен быть 'largest'
.
Для получения дополнительной информации смотрите функции MATLAB Выполнения на графическом процессоре (Parallel Computing Toolbox).
Указания и ограничения по применению:
Если вы обеспечиваете параметр sigma
, значением должен быть 'largest'
.
Для получения дополнительной информации смотрите функции MATLAB Выполнения с Распределенными Массивами (Parallel Computing Toolbox).
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.