22.2 Линейная алгебра для разреженных матриц
Octave включает полиморфный решатель для разреженных матриц, где точный решатель, используемый для факторизации матрицы, зависит от свойств самой разреженной матрицы. Как правило, стоимость определения типа матрицы невелика по сравнению со стоимостью факторизации самой матрицы, но в любом случае тип матрицы кэшируется после его вычисления, так что он не переопределяется каждый раз, когда он используется в линейном уравнении.
Дерево выбора для решения линейного уравнения:
- Если матрица диагональная, решите напрямую и перейдите к 8 шагу.
- Если матрица — это переставленная диагональная матрица, решите напрямую, учитывая перестановки. Перейдите к 8 шагу.
- Если матрица квадратная, полосовая и если плотность полосы меньше, чем указано в
spparms ("bandden"), продолжайте, иначе перейдите к 4 шагу.- Если матрица треугольная и правая часть не разреженная, продолжайте, иначе перейдите к 3б.
- Если матрица эрмитова с положительной вещественной диагональю, попробуйте факторизацию Холецкого с использованием LAPACK xPTSV.
- Если вышеупомянутое не удалось или матрица не эрмитова с положительной вещественной диагональю, используйте метод Гаусса с выбором главного элемента с использованием LAPACK xGTSV и перейдите к 8 шагу.
- Если матрица эрмитова с положительной вещественной диагональю, попробуйте факторизацию Холецкого с использованием LAPACK xPBTRF.
- Если вышеупомянутое не удалось или матрица не эрмитова с положительной вещественной диагональю, используйте метод Гаусса с выбором главного элемента с использованием LAPACK xGBTRF и перейдите к 8 шагу.
- Если матрица треугольная и правая часть не разреженная, продолжайте, иначе перейдите к 3б.
- Если матрица верхнетреугольная или нижнетреугольная, выполните разреженную прямую или обратную подстановку и перейдите к 8 шагу.
- Если матрица является верхней треугольной матрицей с перестановкой столбцов или нижней треугольной матрицей с перестановкой строк, выполните разреженную прямую или обратную подстановку и перейдите к 8 шагу.
- Если матрица квадратная, эрмитова с положительной вещественной диагональю, попробуйте разреженную факторизацию Холецкого с использованием CHOLMOD.
- Если разреженная факторизация Холецкого не удалась или матрица не эрмитова с положительной вещественной диагональю, а матрица квадратная, произведите факторизацию, решение и выполните одну итерацию уточнения с использованием UMFPACK.
- Если матрица не квадратная или любой из предыдущих решателей обнаруживает сингулярную или почти сингулярную матрицу, найдите решение с минимальной нормой, используя CXSPARSE10.
Плотность полосы определяется как число ненулевых значений в полосе, деленное на общее число значений в полной полосе. Решатели полосовых матриц могут быть полностью отключены с помощью spparms для установки bandden в 1 (т.е., spparms ("bandden", 1)).
Решатель QR факторизует проблему с помощью разложения Дульмажа-Мендельсона, чтобы разделить проблему на блоки, которые могут быть обработаны как переопределенные, несколько хорошо определенных блоков и окончательный переопределенный блок. Для матриц с блоками сильно связанных узлов это большая выгода, поскольку для многих блоков можно использовать разложение LU. Это также значительно повышает вероятность нахождения решения для переопределенных задач вместо просто возвращения вектора NaN.
Все вышеперечисленные решатели могут вычислить оценку числа обусловленности. Это можно использовать для обнаружения проблем с числовой устойчивостью в решении и принудительно использовать решение с минимальной нормой. Однако для узких полосовых, треугольных или диагональных матриц стоимость вычисления числа обусловленности значительна и может даже превысить стоимость факторизации матрицы. Поэтому в этих случаях число обусловленности не вычисляется, а Octave полагается на более простые методы для обнаружения сингулярных матриц или кода LAPACK в случае полосовых матриц.
Пользователь может принудительно установить тип матрицы с помощью функции matrix_type. Это устраняет затраты на обнаружение типа матрицы. Однако следует отметить, что неправильное определение типа матрицы приведет к непредсказуемым результатам, и поэтому matrix_type следует использовать с осторожностью.
- : nest = normest (A)
- : nest = normest (A, tol)
- : [nest, iter] = normest (…)
-
Оценить 2-норму матрицы A с помощью анализа степенного ряда.
Это обычно используется для больших матриц, где стоимость вычисления
norm (A)является запредельной, и приемлемо приближение к 2-норме.tol — это точность, с которой вычисляется 2-норма. По умолчанию tol равно 1e-6.
Необязательный выход iter возвращает количество итераций, потребовавшихся для
normestсходиться.
- : nest = normest1 (A)
- : nest = normest1 (A, t)
- : nest = normest1 (A, t, x0)
- : nest = normest1 (Afun, t, x0, p1, p2, …)
- : [nest, v] = normest1 (A, …)
- : [nest, v, w] = normest1 (A, …)
- : [nest, v, w, iter] = normest1 (A, …)
-
Оценить 1-норму матрицы A с помощью блочного алгоритма.
normest1лучше всего подходит для больших разреженных матриц, когда требуется только оценка нормы. Для матриц малого и среднего размера используйтеnorm (A, 1). Кроме того,normest1может быть использован для оценки 1-нормы линейного оператора A, когда матрично-векторные произведенияA * xиA' * xвычисляются недорого. В этом случае вместо матрицы A используется функцияAfun (flag, x); она должна возвращать:- размерность n матрицы A, если flag имеет значение
"dim" - true, если A — вещественный оператор, если flag имеет значение
"real" - результат
A * x, если flag имеет значение"notransp" - результат
A' * x, если flag имеет значение"transp"
Типичный случай — A, определённая как
b ^ m, в котором результатA * xможет быть вычислен даже без явного формированияb ^ mследующим образом:y = x; for i = 1:m y = b * y; endfor
Параметры p1, p2, … являются аргументами функции
Afun (flag, x, p1, p2, …).Значение по умолчанию для t равно 2. Алгоритм требует матрично-матричных произведений размеров n x n и n x t.
Начальная матрица x0 должна иметь столбцы единичной 1-нормы. По умолчанию начальная матрица x0 имеет первый столбец
ones (n, 1) / nи, если t > 1, оставшиеся столбцы с случайными элементами-1 / n,1 / n, делёнными на n.На выходе nest — это желаемая оценка, v и w — векторы, такие что
w = A * v, гдеnorm (w, 1)=c * norm (v, 1). iter содержит вiter(1)количество итераций (максимум жёстко закодирован как 5) и вiter(2)общее количество произведенийA * xилиA' * x, выполненных алгоритмом.Примечание к алгоритму:
normest1использует случайные числа во время оценки. Поэтому, если требуются согласованные результаты,"state"генератора случайных чисел следует зафиксировать перед вызовомnormest1.Ссылка: Н. Дж. Хайгам и Ф. Тиссер, Блочный алгоритм для оценки 1-нормы матрицы с применением к 1-нормальным псевдоспектрам, SIAM J. Matrix Anal. Appl., стр. 1185–1201, том 21, № 4, 2000.
- размерность n матрицы A, если flag имеет значение
- : cest = condest (A)
- : cest = condest (A, t)
- : cest = condest (A, solvefun, t, p1, p2, …)
- : cest = condest (Afcn, solvefun, t, p1, p2, …)
- : [cest, v] = condest (…)
-
Оцените числовую обусловленность квадратной матрицы A с использованием t тестовых векторов и случайного оценщика 1-нормы.
Необязательный входной параметр t задаёт количество тестовых векторов (по умолчанию 5).
Если матрица не явная, например, при оценке обусловленности A по факторизации LU,
condestиспользует следующие функции:- - Afcn, которая должна возвращать
- размерность n матрицы a, если flag равен
"dim" - true, если a – вещественный оператор, если flag равен
"real" - результат
a * x, если flag равен "notransp" - результат
a' * x, если flag равен "transp"
- размерность n матрицы a, если flag равен
- - solvefun, которая должна возвращать
- размерность n матрицы a, если flag равен
"dim" - true, если a – вещественный оператор, если flag равен
"real" - результат
a \ x, если flag равен "notransp" - результат
a' \ x, если flag равен "transp"
- размерность n матрицы a, если flag равен
Параметры p1, p2, … являются аргументами
Afcn (flag, x, p1, p2, …)иsolvefcn (flag, x, p1, p2, …).Основной выходной параметр – оценка числовой обусловленности 1-нормы cest.
Необязательный второй выходной параметр – приближённый нулевой вектор, когда cest велик; он удовлетворяет уравнению
norm (A*v, 1) == norm (A, 1) * norm (v, 1) / est.Примечание по алгоритму:
condestиспользует случайный алгоритм для приближения 1-норм. Поэтому, если требуются согласованные результаты,"state"генератора случайных чисел следует зафиксировать до вызоваcondest.Ссылки:
- N.J. Higham и F. Tisseur, Блочный алгоритм для оценки матричной 1-нормы с применением к 1-норме псевдоспектра. SIMAX том 21, № 4, стр. 1185–1201. https://dx.doi.org/10.1137/S0895479899356080
- N.J. Higham и F. Tisseur, Блочный алгоритм для оценки матричной 1-нормы с применением к 1-норме псевдоспектра. https://citeseer.ist.psu.edu/223007.html
- - Afcn, которая должна возвращать
- : spparms ()
- : vals = spparms ()
- : [keys, vals] = spparms ()
- : val = spparms (key)
- : spparms (vals)
- : spparms ("default")
- : spparms ("tight")
- : spparms (key, val)
-
Запрос или изменение параметров, используемых разреженными решателями и функциями факторизации.
Первые четыре вызова выше получают информацию о текущих настройках, в то время как остальные изменяют текущие настройки. Параметры хранятся как пары «ключ-значение», где значения – вещественные числа, а ключи – одна из следующих строк:
- ‘spumoni’
-
Уровень печати отладочной информации решателей (по умолчанию 0)
- ‘ths_rel’
-
Включено для совместимости. Не используется. (по умолчанию 1)
- ‘ths_abs’
-
Включено для совместимости. Не используется. (по умолчанию 1)
- ‘exact_d’
-
Включено для совместимости. Не используется. (по умолчанию 0)
- ‘supernd’
-
Включено для совместимости. Не используется. (по умолчанию 3)
- ‘rreduce’
-
Включено для совместимости. Не используется. (по умолчанию 3)
- ‘wh_frac’
-
Включено для совместимости. Не используется. (по умолчанию 0.5)
- ‘autommd’
-
Флаг, указывающий, будут ли операторы LU/QR и ’\’ и ’/’ автоматически использовать функции сохранения разреженности mmd (по умолчанию 1)
- ‘autoamd’
-
Флаг, указывающий, будут ли операторы LU и ’\’ и ’/’ автоматически использовать функции сохранения разреженности amd (по умолчанию 1)
- ‘piv_tol’
-
Пороговое значение выбора опоры для решателей UMFPACK (по умолчанию 0.1)
- ‘sym_tol’
-
Пороговое значение выбора опоры для симметричных решателей UMFPACK (по умолчанию 0.001)
- ‘bandden’
-
Плотность ненулевых элементов в полосовой матрице перед обработкой полосовыми решателями LAPACK (по умолчанию 0.5)
- ‘umfpack’
Флаг, указывающий, использовать ли решатели UMFPACK или mmd для операций LU, ’\’ и ’/’ (по умолчанию 1)
Значение отдельных ключей можно задать с помощью
spparms (key, val). Значения по умолчанию можно восстановить с помощью специального ключевого слова"default". Специальное ключевое слово"tight"можно использовать для установки решателей mmd, чтобы попытаться получить более разреженное решение, возможно, за счёт увеличения времени выполнения.
- : p = sprank (S)
-
Вычислить структурный ранг разреженной матрицы S.
Обратите внимание, что в этом вычислении используется только структура матрицы, основанная на перестановке Дюлмаге-Мендельсона для блочно-треугольной формы. В связи с этим числовой ранг матрицы S ограничен
sprank (S) >= rank (S). Игнорируя ошибки с плавающей запятойsprank (S) == rank (S).См. также: dmperm.
- : [count, h, parent, post, R] = symbfact (S)
- : […] = symbfact (S, typ)
- : […] = symbfact (S, typ, mode)
-
Выполнить символьный анализ факторизации разреженной матрицы S.
Входные переменные:
- S
-
S – вещественная или комплексная разреженная матрица.
- typ
-
Тип факторизации, может быть одним из следующих
-
"sym"(по умолчанию) -
Факторизовать S. Предполагает, что S симметрична и использует верхнюю треугольную часть матрицы.
"col"-
Факторизовать
S' * S. "row"-
Факторизовать
S * S'. "lo"Факторизовать
S'. Предполагает, что S симметрична и использует нижнюю треугольную часть матрицы.
-
- mode
Если mode не указан, возвращает факторизацию Холецкого для R. Если mode равен
"lower"или"L", то возвращает сопряжённо-транспонированнуюR', которая является нижней треугольной факторизацией. Версия сопряжённо-транспонированной факторизации быстрее и использует меньше памяти, но всё равно возвращает те же значения для всех других выходных параметров: count, h, parent и post.
Выходные переменные:
- count
-
Количество строк факторизации Холецкого, определённое typ. Вычислительная сложность выполнения факторизации с помощью
cholравнаsum (count .^ 2). - h
-
Высота дерева исключения.
- parent
-
Само дерево исключения.
- post
Разреженная булевая матрица, структура которой соответствует факторизации Холецкого, определённой typ.
См. также: chol, etree, treelayout.
Для неквадратных матриц пользователь также может использовать функцию spaugment для поиска решения метода наименьших квадратов для линейного уравнения.
- : s = spaugment (A, c)
-
Создать расширенную матрицу A.
Она задаётся
[c * eye(m, m), A; A', zeros(n, n)]Это связано с решением метода наименьших квадратов для
A \ b, по формулеs * [ r / c; x] = [ b, zeros(n, columns(b)) ]
где r – остаточная ошибка
r = b - A * x
Поскольку матрица s симметричная неопределённая, она может быть разложена с помощью
lu, и поэтому минимальное нормальное решение можно найти без необходимости в факторизацииqr. Поскольку остаточная ошибка будетzeros (m, m)для недоопределённых задач, например,m = 11; n = 10; mn = max (m, n); A = spdiags ([ones(mn,1), 10*ones(mn,1), -ones(mn,1)], [-1, 0, 1], m, n); x0 = A \ ones (m,1); s = spaugment (A); [L, U, P, Q] = lu (s); x1 = Q * (U \ (L \ (P * [ones(m,1); zeros(n,1)]))); x1 = x1(end - n + 1 : end);Для нахождения решения переопределённой задачи необходима оценка остаточной ошибки r, поэтому формирование минимального нормального решения с помощью функции
spaugmentявляется более сложным.В общем случае оператор левого деления более устойчив и быстрее, чем использование функции
spaugment.См. также: mldivide.
Наконец, функция eigs может быть использована для вычисления ограниченного числа собственных значений и векторов на основе выбранного критерия, а также svds для вычисления ограниченного числа сингулярных значений и векторов.
- : d = eigs (A)
- : d = eigs (A, k)
- : d = eigs (A, k, sigma)
- : d = eigs (A, k, sigma, opts)
- : d = eigs (A, B)
- : d = eigs (A, B, k)
- : d = eigs (A, B, k, sigma)
- : d = eigs (A, B, k, sigma, opts)
- : d = eigs (af, n)
- : d = eigs (af, n, B)
- : d = eigs (af, n, k)
- : d = eigs (af, n, B, k)
- : d = eigs (af, n, k, sigma)
- : d = eigs (af, n, B, k, sigma)
- : d = eigs (af, n, k, sigma, opts)
- : d = eigs (af, n, B, k, sigma, opts)
- : [V, d] = eigs (A, …)
- : [V, d] = eigs (af, n, …)
- : [V, d, flag] = eigs (A, …)
- : [V, d, flag] = eigs (af, n, …)
-
Вычисление ограниченного числа собственных значений и собственных векторов A на основе критерия выбора.
Количество собственных значений и векторов для вычисления задается k и по умолчанию равно 6.
По умолчанию
eigsрешает уравнение, где является соответствующим собственным вектором. Если задана положительно определенная матрица B, тоeigsрешает общее уравнение для собственных значенийАргумент sigma определяет, какие собственные значения возвращаются. sigma может быть скаляром или строкой. Когда sigma является скаляром, возвращаются k собственных значений, ближайших к sigma. Если sigma является строкой, она должна иметь одно из следующих значений.
"lm"-
Наибольший модуль (по умолчанию).
"sm"-
Наименьший модуль.
"la"-
Наибольшая алгебраическая часть (действительна только для вещественно симметричных задач).
"sa"-
Наименьшая алгебраическая часть (действительна только для вещественно симметричных задач).
"be"-
Оба конца, с одним дополнительным с высокого конца, если k нечетное (действительно только для вещественно симметричных задач).
"lr"-
Наибольшая вещественная часть (действительна только для комплексных или несимметричных задач).
"sr"-
Наименьшая вещественная часть (действительна только для комплексных или несимметричных задач).
"li"-
Наибольшая мнимая часть (действительна только для комплексных или несимметричных задач).
"si"Наименьшая мнимая часть (действительна только для комплексных или несимметричных задач).
Если opts задан, он представляет собой структуру, определяющую возможные параметры, которые
eigsдолжен использовать. Поля структуры opts:issym-
Если af задан, то указывает, определяет ли функция af симметричную задачу. Она игнорируется, если задан A. По умолчанию false.
isreal-
Если af задан, то указывает, определяет ли функция af вещественную задачу. Она игнорируется, если задан A. По умолчанию true.
tol-
Определяет требуемую толерантность сходимости, вычисляемую как
tol * norm (A). По умолчаниюeps. maxit-
Максимальное количество итераций. По умолчанию 300.
p-
Количество векторов базиса Ланцоша для использования. Больше векторов приведет к более быстрой сходимости, но и большему использованию памяти. Оптимальное значение
pзависит от задачи и должно быть в диапазонеk + 1до n. Значение по умолчанию2 * k. v0-
Начальный вектор для алгоритма. Начальный вектор, близкий к конечному вектору, ускорит сходимость. По умолчанию ARPACK случайным образом генерирует начальный вектор. Если указано,
v0должен быть n-строчным вектором, гдеn = rows (A) disp-
Уровень диагностической печати (0|1|2). Если
dispравно 0, диагностика отключена. Значение по умолчанию 0. cholB-
Флаг, если
chol (B)передан вместо B. По умолчанию false. permB-
Вектор перестановок факторизации Холецкого B, если
cholBtrue. Он получен[R, ~, permB] = chol (B,. По умолчанию"vector")1:n.
Также возможно представить A функцией, обозначенной как af. af должна следовать за скалярным аргументом n, определяющим длину вектора-аргумента, принимаемого af. af может быть функцией-обработчиком, встроенной функцией или строкой. Когда af является строкой, она содержит имя используемой функции.
af является функцией вида
y = af (x), где требуемое возвращаемое значение af определяется значением sigma. Четыре возможные формы:A * x-
если sigma не задан или является строкой, отличной от "sm".
A \ x-
если sigma равен 0 или "sm".
(A - sigma * I) \ x-
для стандартной задачи собственных значений, где
I— единичная матрица того же размера, что и A. (A - sigma * B) \ xдля общей задачи собственных значений.
Возвращаемые аргументы
eigsзависят от количества запрашиваемых возвращаемых аргументов. С одним возвращаемым аргументом возвращается вектор d длины k, содержащий k собственных значений, которые были найдены. С двумя возвращаемыми аргументами, V — матрица n-на-k, столбцы которой представляют k собственных векторов, соответствующих возвращенным собственным значениям. Сами собственные значения возвращаются в d в виде матрицы n-на-k, где элементы на диагонали — собственные значения.С третьим возвращаемым аргументом flag,
eigsвозвращает статус сходимости. Если flag равен 0, все собственные значения сошлись. Любое другое значение указывает на невозможность сходимости.Эта функция основана на пакете ARPACK, написанном Р. Лехуком, К. Машхоффом, Д. Соресеном и Ч. Янгом. Для получения дополнительной информации см. http://www.caam.rice.edu/software/ARPACK/.
- : s = svds (A)
- : s = svds (A, k)
- : s = svds (A, k, sigma)
- : s = svds (A, k, sigma, opts)
- : [u, s, v] = svds (…)
- : [u, s, v, flag] = svds (…)
-
Найдите несколько сингулярных значений матрицы A.
Сингулярные значения вычисляются с помощью
[m, n] = size (A); s = eigs ([sparse(m, m), A; A', sparse(n, n)])Собственные значения, возвращаемые
eigs, соответствуют сингулярным значениям A. Количество сингулярных значений для вычисления задается k и по умолчанию равно 6.Аргумент sigma указывает, какие сингулярные значения нужно найти. Когда sigma — строка
'L', по умолчанию, находятся наибольшие сингулярные значения A. В противном случае sigma должен быть вещественным скаляром, и находятся сингулярные значения, наиболее близкие к sigma. Соответственно,sigma = 0находит наименьшие сингулярные значения. Обратите внимание, что для относительно малых значений sigma существует вероятность того, что запрошенное количество сингулярных значений не будет найдено. В этом случае sigma следует увеличить.opts — структура, определяющая параметры, которые
svdsпередастeigs. Возможные поля этой структуры описаны вeigs. По умолчаниюsvdsустанавливает следующие три поля:tol-
Требуемая точность сходимости для сингулярных значений. Значение по умолчанию равно 1e-10.
eigsпередаетсяtol / sqrt (2). maxit-
Максимальное количество итераций. По умолчанию — 300.
dispУровень диагностического вывода (0|1|2). Если
dispравно 0, то диагностика отключена. Значение по умолчанию равно 0.
Если запрашивается более одного результата, то
svdsвернет приближенное разложение по сингулярным значениям AA_approx = u*s*v'
где A_approx — матрица размера A, но только ранга k.
flag возвращает 0, если алгоритм успешно сошелся, и 1 в противном случае. Тест сходимости
norm (A*v - u*s, 1) <= tol * norm (A, 1)
svdsлучше всего подходит для нахождения лишь нескольких сингулярных значений большой разреженной матрицы. В противном случаеsvd (full (A))скорее всего будет более эффективным.
Примечания
(10)
Пакеты CHOLMOD, UMFPACK и CXSPARSE были написаны Тимом Дэвисом и доступны по адресу http://faculty.cse.tamu.edu/davis/suitesparse.html
© 1996–2022 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v6.4.0/Sparse-Linear-Algebra.html