Вычислительная сложность разреженных операций пропорциональна 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 55P*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 5pr = (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.
Можно изменить различные параметры, связанные с деталями алгоритмов, используя spparms функция.
Для получения подробной информации о алгоритмах, используемых colamd и symamd, см. [5]. Приблизительная степень использования алгоритмов основана на [1].
Как и приблизительный минимальный порядок степеней, алгоритм вложенного порядка рассечения, реализованный dissect функция переупорядочивает строки и столбцы матрицы, рассматривая матрицу как матрицу смежности графа. Алгоритм сводит задачу к гораздо меньшему масштабу путём свертывания вместе пар вершин в графе. После переупорядочивания малого графа алгоритм затем применяет шаги проекции и уточнения, чтобы развернуть граф обратно до исходного размера.
Алгоритм вложенного рассечения производит высококачественные переупорядочивания и особенно хорошо работает с матрицами конечных элементов по сравнению с другими способами переупорядочивания. Для получения дополнительной информации об алгоритме упорядочения вложенных рассечений см. [7].
Если 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 не использует какую-либо символическую предварительную факторизацию логической единицы для определения требований к памяти и предварительной настройки структур данных.
Переупорядочивание и факторизация разреженных матриц
В этом примере показано влияние переупорядочивания и факторизации на разреженные матрицы.
Если вы получите хорошую перестановку столбцов 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')

Обратный заказ Катилла-Макки, r, уменьшает полосу пропускания и концентрирует все ненулевые элементы вблизи диагонали. Приблизительный минимальный порядок степеней, m, создает фракталоподобную структуру с большими блоками нулей.
Чтобы увидеть заполнение, сгенерированное в факторизации логической единицы шарика Баки, используйте speye, разреженная единичная матрица, для вставки -3s по диагонали 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
Хотя это небольшой пример, результаты типичны. Исходная схема нумерации приводит к наибольшему заполнению. Заполнение для обратного порядка Катилла-МакКи сосредоточено внутри полосы, но оно почти так же обширно, как и первые два порядка. Для приблизительной минимальной степени упорядочения относительно большие блоки нулей сохраняются во время исключения, и величина заполнения значительно меньше, чем генерируемая другими порядками.
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')

Если S - симметричная (или эрмитова), положительная определённая, разреженная матрица, приведённое ниже утверждение возвращает разреженную, верхнюю треугольную матрицу R чтобы R'*R = S.
R = chol(S)
chol автоматически не поворачивается для разреженности, но можно вычислить приблизительную минимальную степень и профиль, ограничивающие перестановки для использования с chol(S(p,p)).
Поскольку алгоритм Холеского не использует поворот для разреженности и не требует поворота для числовой устойчивости, chol выполняет быстрый расчет требуемого объема памяти и выделяет всю память в начале факторизации. Вы можете использовать symbfact, который использует тот же алгоритм, что и cholдля вычисления объема выделенной памяти.
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 позволяет решать задачи разреженных наименьших квадратов
с двумя шагами:
[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 функция производит три неполные нижние-верхние (ILU) факторизации: ILU с нулевым заполнением (ILU(0)), версия ILU Crout (ILUC(tau)) и ILU с понижением и поворотом порога (ILUTP(tau)). ILU(0) никогда не поворачивается, и результирующие факторы имеют только ненулевые значения в позициях, где входная матрица имела ненулевые значения. Оба ILUC(tau) и ILUTP(tau), однако, выполнять удаление на основе порогового значения с заданным пользователем допуском удаления tau.
Например:
A = gallery('neumann', 1600) + speye(1600);ans =
7840nnz(lu(A))
ans =
126478показывает, что A имеет 7840 ненулей, а его полная факторизация LU имеет 126478 ненулей. С другой стороны, следующий код показывает различные выходы ILU:
[L,U] = ilu(A); nnz(L)+nnz(U)-size(A,1)
ans =
7840norm(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 =
31147norm(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 =
31083norm(P*A-L*U,'fro')./norm(A,'fro')
ans = 9.7344e-05
Эти расчеты показывают, что коэффициенты заполнения нуля имеют 7840 ненулевых значений, ILUTP(1e-4) коэффициенты имеют 31147 ненулевых значений, и ILUC(1e-4) коэффициенты имеют 31083 ненулевых значения. Кроме того, относительная погрешность произведения коэффициентов заполнения нуля по существу равна нулю на рисунке A. Наконец, относительная ошибка в факторизациях, полученных с пороговым падением, находится в том же порядке допуска падения, хотя это не гарантировано. См. раздел ilu для получения дополнительных сведений и опций.
ichol функция обеспечивает нулевое заполнение неполных факторизаций Холеского (IC(0)), а также пороговое отбрасывание неполных факторизаций Холеского (ICT(tau)) симметричных, положительных определенных разреженных матриц. Эти факторизации являются аналогами неполных факторизаций LU выше и имеют много одинаковых характеристик. Например:
A = delsq(numgrid('S',200));
nnz(A)ans =
195228nnz(chol(A,'lower'))ans =
7762589A имеет 195228 ненулей, а его полная факторизация Холеского без переупорядочивания имеет 7762589 ненулей. Напротив:L = ichol(A); nnz(L)
ans =
117216norm(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 =
1166754norm(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.
Функции для вычисления нескольких собственных значений или сингулярных значений
Эти функции чаще всего используются с разреженными матрицами, но они могут использоваться с полными матрицами или даже с линейными операторами, определенными в коде MATLAB.
Заявление
[V,lambda] = eigs(A,k,sigma)
находит k собственные значения и соответствующие собственные векторы матрицы A ближайшие к «смене» sigma. Если sigma опущено, найдены собственные значения, наибольшие по величине. Если sigma равно нулю, найдены собственные значения, наименьшие по величине. Вторая матрица, B, может быть включен для обобщенной задачи собственного значения: A, = λ B,
Заявление
[U,S,V] = svds(A,k)
находит k наибольшие сингулярные значения A и
[U,S,V] = svds(A,k,'smallest')
находит k наименьшие сингулярные значения.
Численные методы, используемые в eigs и svds описаны в [6].
В этом примере показано, как найти наименьшее собственное значение и собственный вектор разреженной матрицы.
Установите пятиточечный оператор разности Лапласа на сетке 65 на 65 в Г-образной двумерной области.
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
[1] Аместой, П. Р., Т. А. Дэвис и И. С. Дафф, «Алгоритм упорядочения приблизительной минимальной степени», журнал SIAM по матричному анализу и приложениям, том 17, № 4, октябрь 1996, стр. 886-905.
[2] Барретт, Р., М. Берри, Т. Ф. Чан и др., Шаблоны для решения линейных систем: строительные блоки для итеративных методов, SIAM, Филадельфия, 1994.
[3] Дэвис, Т.А., Гилберт, Дж. Р., Ларимор, С.И., Нг, Э., Пейтон, Б., «Алгоритм упорядочения приближенной к минимальной степени колонки», Proc . SIAM Conference on Applied Linear Algebra, Oct. 1997, p. 29.
[4] Гилберт, Джон Р., Клеве Молер и Роберт Шрайбер, «Разреженные матрицы в MATLAB: дизайн и реализация», SIAM J. Matrix Anal. Appl., том 13, № 1, январь 1992, стр. 333-356.
[5] Ларимор, С. И., Примерный алгоритм упорядочения столбцов минимальной степени, MS Thesis, Департамент компьютерных и информационных наук и инженерии, Университет Флориды, Гейнсвилл, Флорида, 1998.
[6] Саад, Юсеф, Итерационные методы разреженных линейных уравнений. Издательская компания PWS, 1996.
[7] Карыпис, Георгий и Випин Кумар. «Многоуровневая схема быстрого и высокого качества для разбиения нерегулярных графиков». Журнал SIAM по научным вычислениям. Том 20, номер 1, 1999, стр. 359-392.