22.1.4.3 Математические замечания
Была предпринята попытка сделать так, чтобы разреженные матрицы вели себя точно так же, как их полноразмерные аналоги. Однако существуют определенные различия, особенно по сравнению с реализациями разреженных матриц в других продуктах.
Во-первых, операторы "./" и ".^" следует использовать с осторожностью. Рассмотрим, что дадут примеры
s = speye (4); a1 = s .^ 2; a2 = s .^ s; a3 = s .^ -2; a4 = s ./ 2; a5 = 2 ./ s; a6 = s ./ s;
. Возведение s в степень 2 в первом примере не вызывает проблем. Однако поэлементное возведение s в степень самой себя включает большое число элементов 0 .^ 0, равных 1. Поэтому s .^
s — полноразмерная матрица.
Аналогично, s .^ -2 включает элементы вида 0 .^ -2, равные бесконечности, поэтому s .^ -2 также является полноразмерной матрицей.
Для оператора «./» s ./ 2 не вызывает проблем, но 2 ./ s также включает большое число элементов, равных бесконечности, и тоже является полноразмерной матрицей. В случае s ./ s используются элементы вида 0 ./ 0, которые являются NaN, поэтому результат также представляет собой полноразмерную матрицу, в которой нулевые элементы s заменены значениями NaN.
Описанное выше поведение соответствует поведению полноразмерных матриц, но отличается от поведения разреженных матриц в других продуктах.
Особая проблема разреженных матриц связана с тем, что нули не хранятся, а значит, не хранится и бит знака этих нулей. В некоторых случаях бит знака нуля имеет значение. Например:
a = 0 ./ [-1, 1; 1, -1];
b = 1 ./ a
⇒ -Inf Inf
Inf -Inf
c = 1 ./ sparse (a)
⇒ Inf Inf
Inf Inf Чтобы исправить это поведение, пришлось бы хранить в матрице нулевые элементы с отрицательным битом знака, чтобы обеспечить его сохранение. В настоящее время этого не делается из соображений эффективности, поэтому следует учитывать, что вычисления, в которых важен бит знака нуля, нельзя выполнять с использованием разреженных матриц.
В общем случае применение любой функции или оператора к разреженной матрице приводит к разреженной матрице с таким же или большим числом ненулевых элементов, чем в исходной матрице. Особенно это касается важного случая разложения разреженной матрицы. Обычно эту проблему решают переупорядочением матрицы таким образом, чтобы ее разложение было более разреженным, чем разложение исходной матрицы. Иными словами, разложение L * U = P * S * Q содержит более разреженные элементы L и U, чем соответствующее разложение L * U = S.
Для переупорядочения доступны несколько функций, выбор которых зависит от типа раскладываемой матрицы. Если матрица симметричная положительно определенная, следует использовать symamd или csymamd. В противном случае следует использовать amd, colamd или ccolamd. Также доступны функции переупорядочения colperm и randperm.
Пример структуры простой положительно определенной матрицы см. на рисунке 22.3.
Рисунок 22.3: Структура простой разреженной матрицы.
Стандартное разложение Холецкого этой матрицы можно получить той же командой, что и для полноразмерной матрицы. Его структуру можно визуализировать командой r = chol (A); spy (r);. См. рисунок 22.4. Исходная матрица содержала 598 ненулевых элементов, тогда как это разложение Холецкого содержит 10200 элементов, причем хранится только половина симметричной матрицы. Это значительное заполнение; хотя для такого небольшого тестового примера оно не представляет проблемы, при работе с другими разреженными матрицами оно может привести к существенным накладным расходам.
Подходящую перестановку исходной матрицы, сохраняющую разреженность, возвращает symamd; разложение с использованием этого переупорядочения можно визуализировать командой q = symamd (A);
r = chol (A(q,q)); spy (r). В результате получается 399 ненулевых элементов, что является значительным улучшением.
Само разложение Холецкого позволяет определить подходящее переупорядочение матрицы, сохраняющее разреженность, непосредственно в процессе разложения. В этом случае результат можно получить с помощью трех выходных аргументов, как в [r, p, q] = chol (A); spy (r).
Рисунок 22.4: Структура разложения Холецкого приведенной выше матрицы без перестановки.
Рисунок 22.5: Структура разложения Холецкого приведенной выше матрицы с перестановкой.
Для несимметричной матрицы подходящую перестановку, сохраняющую разреженность, возвращает colamd; разложение с использованием этого переупорядочения можно визуализировать командой q = colamd (A); [l, u, p] = lu (A(:,q)); spy (l+u).
Наконец, Octave неявно переупорядочивает матрицу при использовании операторов деления div (/) и ldiv (\), поэтому пользователю не нужно явно переупорядочивать матрицу для повышения производительности.
-
:
p =amd(S) -
:
p =amd(S, opts) -
Возвращает перестановку матрицы, соответствующую приближенной минимальной степени.
Это перестановка, при которой разложение Холецкого
S (p, p)обычно оказывается более разреженным, чем разложение Холецкого самой S. Как правило,amdработает быстрее, чемsymamd, но выполняет аналогичную задачу.Необязательный параметр opts — это структура, управляющая поведением
amd. Поля структуры:- opts.dense
-
Определяет, какие строки или столбцы входной матрицы
amdсчитает плотными. Строки или столбцы, содержащие болееmax (16, (dense * sqrt (n)))элементов, где n — порядок матрицы S, игнорируются функциейamdпри вычислении перестановки. Значение dense должно быть положительным скаляром; значение по умолчанию — 10.0 - opts.aggressive
Если это значение является ненулевым скаляром,
amdвыполняет агрессивное поглощение. По умолчанию агрессивное поглощение не выполняется.
Автор кода — Timothy A. Davis (см. http://faculty.cse.tamu.edu/davis/suitesparse.html).
-
:
p =ccolamd(S) -
:
p =ccolamd(S, knobs) -
:
p =ccolamd(S, knobs, cmember) -
:
[p, stats] =ccolamd(…) -
Перестановка столбцов с ограничениями, соответствующая приближенной минимальной степени.
p = ccolamd (S)возвращает вектор перестановки столбцов, соответствующий приближенной минимальной степени, для разреженной матрицы S. Для несимметричной матрицы S функцияS(:, p)обычно дает более разреженные множители LU, чем S.chol (S(:, p)' * S(:, p))также обычно дает более разреженный результат, чемchol (S' * S).p = ccolamd (S, 1)оптимизирует упорядочение дляlu (S(:, p)). После упорядочения выполняется постпорядоковое упорядочение дерева исключения столбцов.knobs — необязательный входной вектор длины от 1 до 5 элементов; если он отсутствует или пуст, используется значение по умолчанию
[0 10 10 1 0]. Отсутствующие элементы устанавливаются в значения по умолчанию.knobs(1)-
Если значение ненулевое, упорядочение оптимизируется для
lu (S(:, p)). Дляchol (S(:, p)' * S(:, p))оно будет неудачным. Это наиболее важный параметр ccolamd. knobs(2)-
Если матрица S имеет размер m на n, строки, содержащие более
max (16, knobs(2) * sqrt (n))элементов, игнорируются. knobs(3)-
Столбцы, содержащие более
max (16, knobs(3) * sqrt (min (m, n)))элементов, игнорируются и помещаются в конец выходной перестановки (с учетом ограничений cmember). knobs(4)-
Если значение ненулевое, выполняется агрессивное поглощение.
knobs(5)-
Если значение ненулевое, выводится статистика и значения knobs.
cmember — необязательный вектор длины n. Он задает ограничения на упорядочение столбцов. Если
cmember(j) = c, столбец j принадлежит множеству ограничений c (c должен находиться в диапазоне от 1 до n). В выходной перестановке p сначала идут все столбцы из множества 1, за ними — все столбцы из множества 2 и так далее.cmember = ones (1,n), если параметр отсутствует или пуст.ccolamd (S, [], 1 : n)возвращает1 : np = ccolamd (S)примерно эквивалентнаp = colamd (S). Параметр knobs и его значения по умолчанию отличаются.colamdвсегда выполняет агрессивное поглощение и находит упорядочение, подходящее как дляlu (S(:, p)), так и дляchol (S(:, p)' * S(:, p)); она не может оптимизировать упорядочение дляlu (S(:, p))в той же степени, что иccolamd (S, 1).stats — необязательный выходной вектор из 20 элементов, содержащий сведения об упорядочении и корректности входной матрицы S. Статистика упорядочения находится в
stats(1 : 3).stats(1)иstats(2)— число плотных или пустых строк и столбцов, игнорируемых CCOLAMD, аstats(3)— число сборок мусора, выполненных для внутренней структуры данных CCOLAMD (примерный размер —2.2 * nnz (S) + 4 * m + 7 * nцелых чисел).stats(4 : 7)содержит сведения о том, удалось ли CCOLAMD продолжить работу. Матрица корректна, еслиstats(4)равно нулю; значение 1 означает, что матрица некорректна.stats(5)— индекс самого правого столбца с неупорядоченными или повторяющимися элементами либо ноль, если такого столбца нет.stats(6)— последний обнаруженный повторяющийся или расположенный не по порядку индекс строки в столбце с индексомstats(5)либо ноль, если такого индекса строки нет.stats(7)— число повторяющихся или расположенных не по порядку индексов строк.stats(8 : 20)в текущей версии CCOLAMD всегда равно нулю (зарезервировано для будущего использования).Авторы кода — S. Larimore, T. Davis и S. Rajamanickam, работавшие совместно с J. Bilbert и E. Ng. Работа поддержана Национальным научным фондом (DMS-9504974, DMS-9803599, CCR-0203270) и грантом Национальной лаборатории Сандия. Описание ccolamd, csymamd, amd, colamd, symamd и других родственных алгоритмов упорядочения см. на странице http://faculty.cse.tamu.edu/davis/suitesparse.html.
-
:
p =colamd(S) -
:
p =colamd(S, knobs) -
:
[p, stats] =colamd(S) -
:
[p, stats] =colamd(S, knobs) -
Вычисляет перестановку столбцов, соответствующую приближенной минимальной степени.
p = colamd (S)возвращает вектор перестановки столбцов, соответствующий приближенной минимальной степени, для разреженной матрицы S. Для несимметричной матрицы S функцияS(:,p)обычно дает более разреженные множители LU, чем S. Разложение ХолецкогоS(:,p)' * S(:,p)также обычно оказывается более разреженным, чем разложениеS' * S.knobs — необязательный входной вектор длины от одного до трех элементов. Если матрица S имеет размер m на n, строки, содержащие более
max(16,knobs(1)*sqrt(n))элементов, игнорируются. Столбцы, содержащие болееmax (16,knobs(2)*sqrt(min(m,n)))элементов, удаляются перед упорядочением и помещаются в конец выходной перестановки p. Еслиknobs(1)иknobs(2)соответственно меньше 0, удаляются только полностью плотные строки или столбцы. Еслиknobs(3)не равно нулю, выводятся stats и knobs. Значение по умолчанию —knobs = [10 10 0]. Обратите внимание, что значения knobs отличаются от значений в предыдущих версиях colamd.stats — необязательный выходной вектор из 20 элементов, содержащий сведения об упорядочении и корректности входной матрицы S. Статистика упорядочения находится в
stats(1:3).stats(1)иstats(2)— число плотных или пустых строк и столбцов, игнорируемых COLAMD, аstats(3)— число сборок мусора, выполненных для внутренней структуры данных COLAMD (примерный размер —2.2 * nnz(S) + 4 * m + 7 * nцелых чисел).Встроенные функции Octave предназначены для создания корректных разреженных матриц без повторяющихся элементов, с возрастающими индексами строк ненулевых элементов в каждом столбце, с неотрицательным числом элементов в каждом столбце (!) и так далее. Если матрица некорректна, COLAMD может как продолжить, так и не продолжить работу. Если элементы повторяются (индекс строки встречается в одном столбце два или более раза) или индексы строк в столбце расположены не по порядку, COLAMD может исправить эти ошибки, игнорируя повторяющиеся элементы и сортируя каждый столбец во внутренней копии матрицы S (однако входная матрица S при этом не исправляется). Если матрица некорректна по другим причинам, COLAMD не может продолжить работу: выводится сообщение об ошибке, а выходные аргументы (p или stats) не возвращаются. Таким образом, COLAMD позволяет легко проверить корректность разреженной матрицы.
stats(4:7)содержит сведения о том, удалось ли COLAMD продолжить работу. Матрица корректна, еслиstats(4)равно нулю; значение 1 означает, что матрица некорректна.stats(5)— индекс самого правого столбца с неупорядоченными или повторяющимися элементами либо ноль, если такого столбца нет.stats(6)— последний обнаруженный повторяющийся или расположенный не по порядку индекс строки в столбце с индексомstats(5)либо ноль, если такого индекса строки нет.stats(7)— число повторяющихся или расположенных не по порядку индексов строк.stats(8:20)в текущей версии COLAMD всегда равно нулю (зарезервировано для будущего использования).После упорядочения выполняется постпорядоковое упорядочение дерева исключения столбцов.
Авторы кода — Stefan I. Larimore и Timothy A. Davis. Алгоритм разработан совместно с John Gilbert из Xerox PARC и Esmond Ng из Окриджской национальной лаборатории (см. http://faculty.cse.tamu.edu/davis/suitesparse.html).
-
:
p =colperm(s) -
Возвращает перестановку столбцов, при которой столбцы
s(:, p)упорядочены по возрастанию числа ненулевых элементов.Если s симметрична, то p выбирается так, чтобы
s(p, p)упорядочивала строки и столбцы по возрастанию числа ненулевых элементов.
-
:
p =csymamd(S) -
:
p =csymamd(S, knobs) -
:
p =csymamd(S, knobs, cmember) -
:
[p, stats] =csymamd(…) -
Для симметричной положительно определенной матрицы S возвращает вектор перестановки p, при котором
S(p,p)обычно дает более разреженный множитель Холецкого, чем S.Иногда
csymamdхорошо работает и для симметричных неопределенных матриц. Предполагается, что матрица S симметрична; используется только ее строго нижняя треугольная часть. Матрица S должна быть квадратной. После упорядочения выполняется постпорядоковое упорядочение дерева исключения.knobs — необязательный входной вектор длины от 1 до 3 элементов; значение по умолчанию —
[10 1 0]. Отсутствующие элементы устанавливаются в значения по умолчанию.knobs(1)-
Если матрица S имеет размер n на n, строки и столбцы, содержащие более
max(16,knobs(1)*sqrt(n))элементов, игнорируются и помещаются в конец выходной перестановки (с учетом ограничений cmember). knobs(2)-
Если значение ненулевое, выполняется агрессивное поглощение.
knobs(3)-
Если значение ненулевое, выводится статистика и значения knobs.
cmember — необязательный вектор длины n. Он задает ограничения на упорядочение. Если
cmember(j) = S, строка/столбец j принадлежит множеству ограничений c (c должен находиться в диапазоне от 1 до n). В выходной перестановке p сначала идут все строки/столбцы из множества 1, за ними — все строки/столбцы из множества 2 и так далее.cmember = ones (1,n), если параметр отсутствует или пуст.csymamd (S,[],1:n)возвращает1:n.p = csymamd (S)примерно эквивалентнаp = symamd (S). Параметр knobs и его значения по умолчанию отличаются.stats(4:7)содержит сведения о том, удалось ли CCOLAMD продолжить работу. Матрица корректна, еслиstats(4)равно нулю; значение 1 означает, что матрица некорректна.stats(5)— индекс самого правого столбца с неупорядоченными или повторяющимися элементами либо ноль, если такого столбца нет.stats(6)— последний обнаруженный повторяющийся или расположенный не по порядку индекс строки в столбце с индексомstats(5)либо ноль, если такого индекса строки нет.stats(7)— число повторяющихся или расположенных не по порядку индексов строк.stats(8:20)в текущей версии CCOLAMD всегда равно нулю (зарезервировано для будущего использования).Авторы кода — S. Larimore, T. Davis и S. Rajamanickam, работавшие совместно с J. Bilbert и E. Ng. Работа поддержана Национальным научным фондом (DMS-9504974, DMS-9803599, CCR-0203270) и грантом Национальной лаборатории Сандия. Описание ccolamd, colamd, csymamd, amd, colamd, symamd и других родственных алгоритмов упорядочения см. на странице http://faculty.cse.tamu.edu/davis/suitesparse.html.
-
:
p =dmperm(A) -
:
[p, q, r, s, cc, rr] =dmperm(A) -
Выполняет перестановку Далмажа—Мендельсона разреженной матрицы A.
При вызове с одним выходным аргументом
dmpermвозвращает максимальное паросочетание p, такое чтоp(j) = i, если столбцу j сопоставлена строка i, или 0, если столбец j не сопоставлен. Если A — квадратная матрица полного структурного ранга, p является перестановкой строк, аA(p,:)имеет диагональ без нулевых элементов. Структурный ранг A равенsprank(A) = sum(p>0).При вызове с двумя или более выходными аргументами возвращается разложение Далмажа—Мендельсона матрицы A. p и q — векторы перестановки. cc и rr — векторы длины 5.
c = A(p,q)разбивается на набор из 4 на 4 крупных блоков:A11 A12 A13 A14 0 0 A23 A24 0 0 0 A34 0 0 0 A44где
A12,A23иA34— квадратные матрицы с диагоналями без нулевых элементов. СтолбцыA11— несопоставленные столбцы, а строкиA44— несопоставленные строки. Любой из этих блоков может быть пустым. В «крупном» разложении блок с индексами (i,j) равенC(rr(i):rr(i+1)-1,cc(j):cc(j+1)-1). В терминах системы линейных уравнений[A11 A12]— недоопределенная часть системы (она всегда прямоугольная, с большим числом столбцов, чем строк, либо имеет размер 0 на 0),A23— однозначно определенная часть системы (она всегда квадратная), а[A34 ; A44]— переопределенная часть системы (она всегда прямоугольная, с большим числом строк, чем столбцов, либо имеет размер 0 на 0).Структурный ранг A равен
sprank (A) = rr(4)-1и является верхней границей численного ранга A.sprank(A) = rank(full(sprand(A)))с вероятностью 1 в точной арифметике.Подматрица
A23дополнительно разбивается на блочную верхнетреугольную форму с помощью «тонкого» разложения (компоненты сильной связностиA23). Если A квадратная и структурно невырожденная,A23является всей матрицей.C(r(i):r(i+1)-1,s(j):s(j+1)-1)— блок с индексами (i,j) в тонком разложении. Блок (1,1) — прямоугольный блок[A11 A12], если только этот блок не имеет размер 0 на 0. Блок (b,b) — прямоугольный блок[A34 ; A44], если только этот блок не имеет размер 0 на 0, гдеb = length(r)-1. Все остальные блоки видаC(r(i):r(i+1)-1,s(i):s(i+1)-1)— диагональные блокиA23; они квадратные и имеют диагональ без нулевых элементов.Используемый метод описан в работе: A. Pothen & C.-J. Fan. Вычисление блочной треугольной формы разреженной матрицы. ACM Trans. Math. Software, 16(4):303–324, 1990.
-
:
p =symamd(S) -
:
p =symamd(S, knobs) -
:
[p, stats] =symamd(S) -
:
[p, stats] =symamd(S, knobs) -
Для симметричной положительно определенной матрицы S возвращает вектор перестановки p, при котором
S(p, p)обычно дает более разреженный множитель Холецкого, чем S.Иногда
symamdхорошо работает и для симметричных неопределенных матриц. Предполагается, что матрица S симметрична; используется только ее строго нижняя треугольная часть. Матрица S должна быть квадратной.knobs — необязательный входной вектор длины от одного до двух элементов. Если матрица S имеет размер n на n, строки и столбцы, содержащие более
max (16,knobs(1)*sqrt(n))элементов, удаляются перед упорядочением и помещаются в конец выходной перестановки p. Еслиknobs(1) < 0, строки/столбцы не удаляются. Еслиknobs(2)не равно нулю, выводятся stats и knobs. Значение по умолчанию —knobs = [10 0]. Обратите внимание, что значения knobs отличаются от значений в предыдущих версияхsymamd.stats — необязательный выходной вектор из 20 элементов, содержащий сведения об упорядочении и корректности входной матрицы S. Статистика упорядочения находится в
stats(1:3).stats(1) = stats(2)— число плотных или пустых строк и столбцов, игнорируемых SYMAMD, аstats(3)— число сборок мусора, выполненных для внутренней структуры данных SYMAMD (примерный размер —8.4 * nnz (tril (S, -1)) + 9 * nцелых чисел).Встроенные функции Octave предназначены для создания корректных разреженных матриц без повторяющихся элементов, с возрастающими индексами строк ненулевых элементов в каждом столбце, с неотрицательным числом элементов в каждом столбце (!) и так далее. Если матрица некорректна, SYMAMD может как продолжить, так и не продолжить работу. Если элементы повторяются (индекс строки встречается в одном столбце два или более раза) или индексы строк в столбце расположены не по порядку, SYMAMD может исправить эти ошибки, игнорируя повторяющиеся элементы и сортируя каждый столбец во внутренней копии матрицы S (однако входная матрица S при этом не исправляется). Если матрица некорректна по другим причинам, SYMAMD не может продолжить работу: выводится сообщение об ошибке, а выходные аргументы (p или stats) не возвращаются. Таким образом, SYMAMD позволяет легко проверить корректность разреженной матрицы.
stats(4:7)содержит сведения о том, удалось ли SYMAMD продолжить работу. Матрица корректна, еслиstats (4)равно нулю; значение 1 означает, что матрица некорректна.stats(5)— индекс самого правого столбца с неупорядоченными или повторяющимися элементами либо ноль, если такого столбца нет.stats(6)— последний обнаруженный повторяющийся или расположенный не по порядку индекс строки в столбце с индексомstats(5)либо ноль, если такого индекса строки нет.stats(7)— число повторяющихся или расположенных не по порядку индексов строк.stats(8:20)в текущей версии SYMAMD всегда равно нулю (зарезервировано для будущего использования).После упорядочения выполняется постпорядоковое упорядочение дерева исключения столбцов.
Авторы кода — Stefan I. Larimore и Timothy A. Davis. Алгоритм разработан совместно с John Gilbert из Xerox PARC и Esmond Ng из Окриджской национальной лаборатории (см. http://faculty.cse.tamu.edu/davis/suitesparse.html).
-
:
p =symrcm(S) -
Возвращает симметричную перестановку в обратном порядке Катхилла — Макки для S.
p — вектор перестановки, такой что
S(p, p)обычно имеет диагональные элементы, расположенные ближе к диагонали, чем у S. Это хорошая предварительная перестановка для LU-разложения или разложения Холецкого матриц, возникающих в задачах с «длинными и узкими» областями. Метод работает как для симметричной, так и для несимметричной S.Алгоритм представляет собой эвристический подход к NP-полной задаче минимизации ширины полосы. Реализация основана на описаниях, приведённых в следующих работах:
E. Cuthill, J. McKee. Уменьшение ширины полосы разреженных симметричных матриц. Материалы 24-й национальной конференции ACM, 157–172, 1969, Brandon Press, Нью-Джерси.
A. George, J.W.H. Liu. Компьютерное решение больших разреженных систем с положительно определёнными матрицами, серия Prentice Hall по вычислительной математике, ISBN 0-13-165274-5, 1981.
© 1996–2026 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/v9.4.0/Mathematical-Considerations.html