Разреженные матричные операции

Эффективность операций

Вычислительная сложность

Вычислительная сложность разреженных операций пропорциональна nnz, количество ненулевых элементов в матрице. Вычислительная сложность также линейно зависит от размера строки m и размер столбца n матрицы, но не зависит от продукта m*n, общее количество нулевых и ненулевых элементов.

Сложность довольно сложных операций, таких как решение разреженных линейных уравнений, включает такие факторы, как упорядоченное расположение и заполнение, которые обсуждаются в предыдущем разделе. В целом, однако, компьютерное время, необходимое для операции разреженной матрицы, пропорционально количеству арифметических операций на ненулевых величинах.

Алгоритмические детали

Разреженные матрицы распространяются через расчеты согласно этим правилам:

  • Функции, которые принимают матрицу и возвращают скалярный или вектор постоянного размера, всегда выдают выход в полном формате памяти. Для примера, size функция всегда возвращает полный вектор, полный или разреженный ее вход.

  • Функции, которые принимают скаляры или векторы и возвращают матрицы, такие как zeros, ones, rand, и eye, всегда возвращайте полные результаты. Это необходимо, чтобы неожиданно избежать введения разреженности. Разреженный аналог zeros(m,n) просто sparse(m,n). Разреженные аналоги rand и eye являются sprand и speye, соответственно. Разреженного аналога для функции нет ones.

  • Унарные функции, которые принимают матрицу и возвращают матрицу или вектор, сохраняют класс памяти операнда. Если S является разреженной матрицей, тогда chol(S) также является разреженной матрицей, и diag(S) является разреженным вектором. Столбцовые функции, такие как max и sum также возвращают разреженные векторы, хотя эти векторы могут быть полностью ненулевыми. Важными исключениями из этого правила являются sparse и full функций.

  • Бинарные операторы дают разреженные результаты, если оба оператора разрежены, и полные результаты, если оба полны. Для смешанных операндов результат полон, если операция не сохраняет разреженность. Если S разрежен и F полно, тогда S+F, S*F, и F\S полны, в то время как S.*F и S&F разреженные. В некоторых случаях результат может быть разреженным, хотя матрица имеет несколько нулевых элементов.

  • Конкатенация матриц с использованием cat функция или квадратные скобки дают разреженные результаты для смешанных операндов.

Сочетания и переупорядочивание

Сочетание строк и столбцов разреженной матрицы S могут быть представлены двумя способами:

  • Матрица сочетаний P действует на строки S как P*S или на столбцах как S*P'.

  • Вектор сочетания p, который является полным вектором, содержащим сочетание 1:n, действует на строки S как S(p,:), или на столбцах как S(:,p).

Для примера:

p = [1 3 4 2 5]
I = eye(5,5);
P = I(p,:)
e = ones(4,1);
S = diag(11:11:55) + diag(e,1) + diag(e,-1)
p =

     1     3     4     2     5


P =

     1     0     0     0     0
     0     0     1     0     0
     0     0     0     1     0
     0     1     0     0     0
     0     0     0     0     1


S =

    11     1     0     0     0
     1    22     1     0     0
     0     1    33     1     0
     0     0     1    44     1
     0     0     0     1    55

Теперь можно попробовать некоторые сочетания, используя вектор сочетания p и матрицу сочетаний P. Для примера операторы S(p,:) и P*S возвращает ту же матрицу.

S(p,:)
ans =

    11     1     0     0     0
     0     1    33     1     0
     0     0     1    44     1
     1    22     1     0     0
     0     0     0     1    55
P*S
ans =

    11     1     0     0     0
     0     1    33     1     0
     0     0     1    44     1
     1    22     1     0     0
     0     0     0     1    55

Точно так же S(:,p) и S*P' обе производят

S*P'
ans =

    11     0     0     1     0
     1     1     0    22     0
     0    33     1     1     0
     0     1    44     0     1
     0     0     1     0    55

Если P является разреженной матрицей, тогда в обоих представлениях используется устройство хранения данных, пропорциональное n и вы можете применить либо к S во времени, пропорциональном nnz(S). Представление вектора немного компактнее и эффективнее, поэтому различные разреженные матричные сочетания обычно возвращают полные векторы-строки за исключением поворотного сочетания в LU (треугольном) факторизации, которая возвращает матрицу, совместимую с полной LU-факторизацией.

Чтобы преобразовать между двумя представлениями сочетания:

n = 5;
I = speye(n);
Pr = I(p,:);
Pc = I(:,p);
pc = (1:n)*Pc
pc =

     1     3     4     2     5
pr = (Pr*(1:n)')'
pr =

     1     3     4     2     5

Обратная P просто R = P'. Можно вычислить обратную p с   r(p) = 1:n.

r(p) = 1:5
r =

     1     4     2     3     5

Переупорядочивание для разреженности

Переупорядочивание столбцов матрицы может часто сделать его LU или QR-факторы более разреженными. Переупорядочивание строк и столбцов часто может сделать его факторы Холецкого более разреженными. Самым простым таким переупорядочением является сортировка столбцов по ненулевому счету. Это иногда является хорошим переупорядочением для матриц с очень неправильными структурами, особенно если существует большое изменение в ненулевых отсчетах строк или столбцов.

colperm вычисляет сочетание, которая упорядочивает столбцы матрицы по количеству ненулей в каждом столбце от наименьшего до самого большого.

Переупорядочивание для уменьшения пропускной способности

Обратное упорядоченное расположение Кутхилла-Макки предназначено для уменьшения профиля или полосы пропускания матрицы. Не гарантировано найти наименьшую возможную пропускную способность, но обычно это так. symrcm функция фактически действует на ненулевой структуре симметричной матрицы A + A', но результат также полезен для несимметричных матриц. Это упорядоченное расположение полезно для матриц, которые происходят из одномерных задач или задач, которые в некотором смысле длинны и тонки.

Аппроксимация минимальной степени Упорядоченного расположения

Степенью узла в графике является количество соединений с этим узлом. Это то же самое, что и количество недиагональных ненулевых элементов в соответствующей строке матрицы смежности. Приблизительный алгоритм минимальной степени генерирует упорядоченное расположение, основанное на том, как эти степени изменяются во время исключения Гауссова или факторизации Холесского. Это сложный и мощный алгоритм, который обычно приводит к более разреженным факторам, чем большинство других упорядоченных расположений, включая количество столбцов и обратный алгоритм Катхилла-Макки. Поскольку отслеживание степени каждого узла занимает очень много времени, приблизительный алгоритм минимальной степени использует приближение к степени, а не к точной степени.

Эти MATLAB® функции реализуют приблизительный алгоритм минимальной степени:

  • symamd - Использование с симметричными матрицами.

  • colamd - Использование с несимметричными матрицами и симметричными матрицами вида A*A' или A'*A.

Смотрите Переупорядочение и факторизация разреженных матриц для примера, используя symamd.

Можно изменить различные параметры, связанные с деталями алгоритмов, используя spparms функция.

Для получения дополнительной информации об алгоритмах, используемых colamd и symamd, см. [5]. Приблизительная степень использования алгоритмов основана на [1].

Вложенные Упорядоченные расположения рассечения

Как и приблизительное упорядоченное расположение минимальной степени, вложенный алгоритм упорядоченного расположения рассечений, реализованный dissect функция переупорядочивает строки матрицы и столбцы, рассматривая матрицу как матрицу смежности графика. Алгоритм сокращает задачу до гораздо меньшего масштаба путем свертывания пар вершин в графике. После переупорядочения малого графика алгоритм затем применяет шаги проекции и уточнения, чтобы расширить график обратно к исходному размеру.

Вложенный алгоритм рассечения производит высококачественные переупорядочения и особенно хорошо выполняет с матрицами конечных элементов по сравнению с другими методами переупорядочивания. Для получения дополнительной информации о вложенном алгоритме упорядоченного расположения рассечений см. [7].

Факторизация разреженных матриц

LU-факторизация

Если S является разреженной матрицей, следующая команда возвращает три разреженных матрицы L, U, и P таким образом P*S = L*U.

[L,U,P] = lu(S);

lu получает факторы Гауссовым исключением с частичным поворотом. Матрица сочетаний P имеет только n ненулевые элементы. Как и в случае с плотными матрицами, оператор [L,U] = lu(S) возвращает переопределенную единичную нижнюю треугольную матрицу и верхнюю треугольную матрицу, продукт которой S. Сам по себе, lu(S) возвращает L и U в одной матрице без информации о повороте.

Синтаксис трех выходных [L,U,P] = lu(S) выбирает P посредством численного частичного поворота, но не поворачивается, чтобы улучшить разреженность в LU факторы. С другой стороны, синтаксис четырех выходов [L,U,P,Q] = lu(S) выбирает P посредством порогового частичного поворота и выбирает P и Q улучшить разреженность в LU факторы.

Можно управлять поворотом в разреженных матрицах, используя

lu(S,thresh)

где thresh - порог поворота в [0,1]. Поворот происходит, когда диагональный элемент в столбце имеет величину меньше thresh умножает величину любого поддиагонального элемента в этом столбце. thresh = 0 сила диагонального поворота.   thresh = 1 является значением по умолчанию. (Значение по умолчанию для thresh является 0.1 для синтаксиса с четырьмя выходами).

Когда вы звоните lu с тремя или менее выходами MATLAB автоматически выделяет память, необходимую для удержания разреженного L и U факторов во время факторизации. За исключением синтаксиса четырех выходов, MATLAB не использует никакой символьной предварительной факторизации LU, чтобы определить требования к памяти и заранее настроить структуры данных.

Переупорядочение и факторизация разреженных матриц

Этот пример показывает эффекты переупорядочения и факторизации на разреженных матрицах.

Если вы получаете хорошее сочетание столбца p что уменьшает заполнение, возможно, от symrcm или colamd, затем вычислительные lu(S(:,p)) занимает меньше времени и памяти, чем вычислительные lu(S).

Создайте разреженную матрицу на примере мяча Баки.

B = bucky;

B имеет в точности три ненулевых элемента в каждой строке и столбце.

Создайте два сочетаний, r и m использование symrcm и symamd соответственно.

r = symrcm(B);
m = symamd(B);

Эти два сочетаний являются симметричными обратными алгоритмами Катхилла-Макки упорядоченного расположения и симметричными приблизительными минимальными упорядоченными расположениями степени.

Создайте шпионские графики, чтобы показать три матрицы смежности графа Баки- Мяча с этими тремя различными нумерациями. Локальная, основанная на пятиугольнике структура исходной нумерации не видна в других.

figure
subplot(1,3,1)
spy(B)
title('Original')

subplot(1,3,2)
spy(B(r,r))
title('Reverse Cuthill-McKee')

subplot(1,3,3)
spy(B(m,m))
title('Min Degree')

Figure contains 3 axes. Axes 1 with title Original contains an object of type line. Axes 2 with title Reverse Cuthill-McKee contains an object of type line. Axes 3 with title Min Degree contains an object of type line.

Обратное упорядоченное расположение Кутхилла-Макки, r, уменьшает полосу пропускания и концентрирует все ненулевые элементы около диагонали. Приблизительное минимальное упорядоченное расположение, m, производит фракталоподобную структуру с большими блоками нулей.

Чтобы увидеть заполнение, сгенерированное в LU-факторизации мяч, используйте speye, разреженная единичная матрица, для вставки -3 с на диагональ B.

B = B - 3*speye(size(B));

Поскольку каждая сумма строк теперь равна нулю, это новое B на самом деле сингулярна, но все еще поучительно вычислять его LU-факторизацию. При вызове с одним выходным аргументом, lu возвращает два треугольных множителей, L и U, в одной разреженной матрице. Количество ненулевых в этой матрице является мерой времени и памяти, необходимых для решения линейных систем, включающих B.

Вот ненулевые счетчики для трёх сочетаний.

  • lu(B) (Оригинал): 1022

  • lu(B(r,r)) (Обратный алгоритм Катхилла-Макки): 968

  • lu(B(m,m)) (Приблизительная минимальная степень): 636

Даже если это небольшой пример, результаты типичны. Исходная схема нумерации приводит к наибольшему заполнению. Заливка для обратного алгоритма Катхилла-Макки упорядоченного расположения сконцентрирована в пределах полосы, но она почти так же обширна, как и первые два упорядоченных расположений. Для приблизительного упорядоченного расположения минимальной степени относительно большие блоки нулей сохраняются во время удаления, и количество заливки значительно меньше, чем то, что генерируется другими упорядоченными расположениями.

The spy графики ниже отражают характеристики каждого изменения порядка.

figure
subplot(1,3,1)
spy(lu(B))
title('Original')

subplot(1,3,2)
spy(lu(B(r,r)))
title('Reverse Cuthill-McKee')

subplot(1,3,3)
spy(lu(B(m,m)))
title('Min Degree')

Figure contains 3 axes. Axes 1 with title Original contains an object of type line. Axes 2 with title Reverse Cuthill-McKee contains an object of type line. Axes 3 with title Min Degree contains an object of type line.

Факторизация Холесского

Если S является симметричной (или Эрмитовой), положительно определенной, разреженной матрицей, оператор ниже возвращает разреженную, верхнюю треугольную матрицу R так что R'*R = S.

R = chol(S)

chol не поворачивается автоматически для разреженности, но можно вычислить приблизительные сочетания ограничения минимальной степени и профиля для использования с chol(S(p,p)).

Поскольку алгоритм Холецкого не использует поворота для разреженности и не требует поворота для численной устойчивости, chol выполняет быстрое вычисление необходимого объема памяти и выделяет всю память в начале факторизации. Вы можете использовать symbfact, который использует тот же алгоритм, что и chol, чтобы вычислить, сколько памяти выделено.

QR-факторизация

MATLAB вычисляет полную QR-факторизацию разреженной матрицы S с

 [Q,R] = qr(S)
или
[Q,R,E] = qr(S)

но это часто непрактично. Унитарная матрица Q часто не имеет высокой доли нулевых элементов. Доступна более практичная альтернатива, иногда известная как «QR-факторизация без Q».

С одним разреженным входным параметром и одним выходным аргументом

R = qr(S)

Возвраты только верхний треугольный фрагмент QR-факторизации. Матрица R предоставляет факторизацию Холесского для матрицы, связанной с нормальными уравнениями:

R'*R = S'*S

Однако потеря числовой информации, присущей расчету S'*S избегается.

С два входных параметров, имеющими одинаковыми числами строк, и двумя выходными аргументами, оператор

[C,R] = qr(S,B)

применяет ортогональные преобразования к B, производство C = Q'*B без вычислений Q.

QR-факторизация без Q позволяет решить разреженные задачи методом наименьших квадратов

minimizeAx-b2

с двумя шагами:

[c,R] = qr(A,b);
x = R\c

Если A является разреженным, но не квадратным, MATLAB использует эти шаги для линейного оператора обратной косой черты, решающего уравнение:

x = A\b

Или можно сделать факторизацию самостоятельно и изучить R за дефицит ранга.

Также возможно решить последовательность линейных систем методом наименьших квадратов с различными правыми сторонами b, которые не обязательно известны, когда R = qr(A) вычисляется. Подход решает "полунормальные уравнения R'*R*x = A'*b с

x = R\(R'\(A'*b))

и затем использует один шаг итерационного уточнения для уменьшения ошибки округления:

r = b - A*x;
e = R\(R'\(A'*r));
x = x + e

Неполные факторизации

ilu и ichol функции обеспечивают приблизительные, неполные факторизации, которые применяются в качестве предварительных кондиционеров для разреженных итерационных методов.

ilu функция производит три incomplete lower-upper (ILU) факторизации: zero-fill ILU (ILU(0)), Crout-версия ILU (ILUC(tau)), и ILU с пороговым снижением и поворотом (ILUTP(tau)). The ILU(0) никогда не поворачивается, и результирующие множители имеют только ненули в положениях, где входная матрица имела ненули. Оба ILUC(tau) и ILUTP(tau)однако выполняйте отбрасывание на основе порога с пользовательским допуском отбрасывания tau.

Для примера:

A = gallery('neumann', 1600) + speye(1600);
ans =

        7840
nnz(lu(A))
ans =

      126478

показывает, что A имеет 7840 ненулевых, и его полная LU-факторизация имеет 126478 ненулевых. С другой стороны, следующий код показывает различные выходы ILU:

[L,U] = ilu(A);
nnz(L)+nnz(U)-size(A,1)
ans =

        7840
norm(A-(L*U).*spones(A),'fro')./norm(A,'fro')
ans =

   4.8874e-17
opts.type = 'ilutp';
opts.droptol = 1e-4;
[L,U,P] = ilu(A, opts);
nnz(L)+nnz(U)-size(A,1)
ans =

       31147
norm(P*A - L*U,'fro')./norm(A,'fro')
ans =

   9.9224e-05
opts.type = 'crout';
[L,U,P] = ilu(A, opts);
nnz(L)+nnz(U)-size(A,1)
ans =

       31083
norm(P*A-L*U,'fro')./norm(A,'fro')
ans =

   9.7344e-05

Эти вычисления показывают, что коэффициенты нулевого заполнения имеют 7840 ненулевых, ILUTP(1e-4) факторы имеют 31147 ненули, и ILUC(1e-4) факторы имеют 31083 ненулевых. Кроме того, относительная погрешность продукта коэффициентов нулевого заполнения по существу равна нулю на шаблоне A. Наконец, относительная погрешность в факторизациях, полученных с пороговым снижением, находится в том же порядке допуска падения, хотя это не гарантировано. См. ilu Страница с описанием для получения дополнительных опций и подробностей.

ichol функция обеспечивает zero-fill incomplete Cholesky factorizations (IC(0)) а также основанное на пороге падение неполных факторизаций Холесского (ICT(tau)) симметричных, положительно определенных разреженных матриц. Эти факторизации являются аналогами неполных LU-факторизаций выше и имеют много одинаковых характеристик. Для примера:

A = delsq(numgrid('S',200));
nnz(A)
ans =

      195228
nnz(chol(A,'lower'))
ans =

     7762589
показывает, что A имеет 5228 nonzeros, и его полная факторизация Холецкого без переупорядочивания имеет 7762589 nonzeros. Напротив:
L = ichol(A);
nnz(L)
ans =

      117216
norm(A-(L*L').*spones(A),'fro')./norm(A,'fro')
ans =

   3.5805e-17
opts.type = 'ict';
opts.droptol = 1e-4;
L = ichol(A,opts);
nnz(L)
ans =

     1166754
norm(A-L*L','fro')./norm(A,'fro')
ans =

   2.3997e-04

IC(0) имеет ненули только в шаблоне нижнего треугольника A, и по шаблону A, продукт факторов совпадает. Кроме того, ICT(1e-4) факторы значительно разреженнее полного фактора Холецкого и относительной погрешности между A и L*L' находится в том же порядке, что и допуск. Важно отметить, что в отличие от факторов, обеспечиваемых chol, коэффициенты по умолчанию, предоставляемые ichol являются нижними треугольными. См. ichol Страница с описанием для получения дополнительной информации.

Собственные значения и сингулярные значения

Доступны две функции, которые вычисляют несколько заданных собственных значений или сингулярных значений. svds основана на eigs.

Функции для вычисления нескольких собственных значений или сингулярных значений

Функция

Описание

eigs

Немного собственных значений

svds

Немного сингулярных значений

Эти функции чаще всего используются с разреженными матрицами, но они могут использоваться с полными матрицами или даже с линейными операторами, определенными в коде MATLAB.

Оператор

[V,lambda] = eigs(A,k,sigma)

находит k собственные значения и соответствующие собственные векторы матрицы A которые являются ближайшими к «сдвигу» sigma. Если sigma опущено, найдены собственные значения, наибольшие по величине. Если sigma равен нулю, найдены собственные значения, наименьшие по величине. Вторая матрица, B, может быть включена для обобщенной задачи собственного значения: A

Оператор

[U,S,V] = svds(A,k)

находит k наибольшие сингулярные значения A и

[U,S,V] = svds(A,k,'smallest')

находит k наименьшие сингулярные значения.

Числовые методы, используемые в eigs и svds описаны в [6].

Наименьшее Собственное значение Разреженной Матрицы

Этот пример показывает, как найти наименьшие собственное значение и собственный вектор разреженной матрицы.

Установите пятиточечный Дифференциального оператора Лапласа на сетке 65 на 65 в L-образной двумерной области.

L = numgrid('L',65);
A = delsq(L);

Определите порядок и количество ненулевых элементов.

size(A)
ans = 1×2

        2945        2945

nnz(A)
ans = 14473

A является матрицей порядка 2945 с 14 473 ненулевыми элементами.

Вычислите наименьшие собственные значения и собственный вектор.

[v,d] = eigs(A,1,'smallestabs');

Распределите компоненты собственного вектора по соответствующим точкам сетки и получите контурный график результата.

L(L>0) = full(v(L(L>0)));
x = -1:1/32:1;
contour(x,x,L,15)
axis square

Figure contains an axes. The axes contains an object of type contour.

Ссылки

[1] Amestoy, P. R., T. A. Davis, and I. S. Duff, «An Approvate Minimum Degree Ordering Algorithm», SIAM Journal on Matrix Analysis and Applications, vol . 17, no 4, Oct. 1996, pp. 8886-905.

[2] Barrett, R., M. Berry, T. F. Chan, et al., Templates for the Solution of Линейные Системы: Базовые блоки for Итерационные Методы, SIAM, Philadelphia, 1994.

[3] Davis, T.A., Gilbert, J. R., Larimore, S.I., Ng, E., Peyton, B., «A Столбца Approximate Minimum Степени Упорядоченного расположения Algorithm», Proc . SIAM Conference on Applied Линейной алгебры, oKt. 1997, p. 29, p.

[4] Gilbert, John R., Cleve Moler, and Robert Schreiber, «Sparse Matrices in MATLAB: Design and Implementation», SIAM J. Matrix Analy. Appl., Vol. 13, no. 1, JAnanuary 1992, p. 333-35.

[5] Larimore, S. I., Приблизительный алгоритм заказа столбцов минимальной степени, MS Thesis, Deptt of Computer and Information Science and Engineering, University of Florida, Gainesville, FL, 1998.

[6] Саад, Юсеф, итерационные методы для разреженных линейных уравнений. PWS Publishing Company, 1996.

[7] Karypis, George and Vipin Kumar. «Быстрая и высококачественная многоуровневая схема для разбиения неправильных графиков». SIAM Journal on Scientific Computing. Том 20, № 1, 1999, стр. 359-392.

Похожие темы