Урок №12.

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

Матрицы без нулевых значений называются полными матрицами. Матрицы, содержащие некоторое число элементов с нулевыми значениями, в MATLAB называются разреженными матрицами. Вообще говоря, разреженными называют те матрицы, для которых разумно использовать численные методы, учитывающие упрощение арифметических операций с нулевыми элементами (например, получение нуля при умножении на нуль или пропуск операций сложения и вычитания при использовании этих операций с нулевыми элементами матриц). Они широко используются при решении прикладных задач. Например, моделировацие электронных и электротехнических линейных цепей часто приводит к появлению в матричном описании топологии схем сильно разреженных матриц. Для таких матриц создан ряд функций, обеспечивающих эффективную работу с ними и устраняющих тривиальные операции с нулевыми элементами матриц.

Элементарные разреженные матрицы

Вначале рассмотрим элементарные разреженные матрицы и относящиеся к ним функции системы MATLAB.

Функция spdiags расширяет возможности встроенной функции diag. Возможны четыре операции, различающиеся числом входных аргументов:

Пример:

» А=[1 3 4 6 8 0 0; 7 8 0 7 0 0 5;

0 0 0 0 0 9 8; 7 6 54 32 0 9 6];

» d=[l 322]

» В = spdlags(A.d)

В =

3644. 0077

0900

0699

» S = speye(4)

S =

(1,1)     1

(2.2)     1

(3.3)     1

(4.4)     1

Матрица R = sprand(S) имеет ту же структуру, что и разреженная матрица S, но ее элементы распределены по равномерному закону:

Пример: 

» d=sprand(4,3.0.6) 

d =

(1.1)     0.6614

(2.1)     0.2844

(4,1)     0.0648

(3,3)     0.4692

(4,3)     0.9883

Пример:

» f=sprandn(3,4.0.3) 

f =

(2.1) -0.4326

(2.2) -1.6656

(2.3) 0.1253

(2.4) 0.2877

Пример:

» a=sprandsym(4,0.3.0.8) 

а =

(1.1) 0.9818

(3.1) 0.0468

(2,2) -0.9283

(1,3) 0.0468

(3.3) 0.8800

(4.4) -0.8000

Преобразование разреженных матриц

Теперь рассмотрим функции преобразования разреженных матриц. Они представлены ниже:

Пример:

» q=sprand(3.4.0.6)

q =

(1.1) 0.7266

(1.2) 0.4120

(3.2) 0.2679

(3.3) 0.4399

(2.4) 0.7446

(3.4) 0.9334

i=

3

2

3

j =

1

2

2

3

4

4

Примеры:

» q=sprand(3,4,0.6)

q=

(1.1) 0.0129

(1.2) 0.3840 

(2.2) 0.6831 

(3,3) 0.0928 

» d=full(q)

 d =

0.0129     0.3840     0     0 

0              0.6831     0     0 

0               0     0.0928    0

Все встроенные в MATLAB арифметические, логические и индексные операции могут быть применены и к -разреженным, и к полным матрицам. Операции над разреженными матрицами возвращают разреженные матрицы, а операции над полными матрицами возвращают полные матрицы. В большинстве случаев операции над смешанными матрицами возвращают полные матрицы. Исключение составляют случаи, когда результат смешанной операции явно сохраняет разреженный тип. Так бывает при поэлементном умножении массивов А.*S, где S — разреженный массив.

Пример:

» i=[2.4.3]:j-[1.3.8]:s-[4.5+5i.9]:

t = sparse(i.j.s,5,8)

t =

(2.1) 4.0000

(4.3) 5.0000+5.00001

(3.8) 9.0000

Функция spconvert используется для создания разреженных матриц из простых разреженных форматов, легко производимых вне средств MATLAB:

»load mydata.dat

»А = spconvert (rnydata);

Работа с ненулевыми элементами разреженных матриц

Поскольку разреженные матрицы содержат ненулевые элементы, то предусмотрен ряд функций для работы с ними:

h = sparse(hilb(10)); 

» nnz(h) 

ans = 

100

» g=nonzeros(sparse(hankel([1,2.8])))

g =

1

2

Пример:

» q=nzmax(sparse(hankel([1.7.23])))

q =

 6

Пример:

» S = spalloc(5.4.5);

Пример:

» S=spfun(@exp.sprand(4,5.0.4))

S=

(2.2) 1.6864

(2.3) 2.4112

(3.3) 2.6638

(2.4) 1.1888

(3.4) 1.3119

(4.4) 2.4007

(3.5) 1.2870

Пример:

» S=sprand(3.2,0.3) 

S=

(3.1) 0.2987 

(1.2) 0.1991 

» spones(S) 

ans =

(3.1) 1 

(1.2) 1

Визуализация разреженных матриц

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

Пример:

»S=sparse(sprandn(20.30.0.9)):spy(S.'.r'.6)

Построенный по этому примеру график показан на рис. 12.1.

Рис. 12.1. Визуализация разреженной матрицы

Алгоритмы упорядочения

Упорядочение — это еще одна характерная для разреженных матриц операция. Ее алгоритм реализуется несколькими функциями:

Пример:

» S=sparse([2.3.1.4.2].[l,3.2.3.2],[4.3,5.6.7].4.5);full(S) 

ans =

0    5    0    0    0

4    7    0    0    0

0    0    3    0    0

0    0    6    0    0 

» t=colperm(S)

t=






5

1

2

3

»full(S(;,t))

ans =





0

0

0

5

0

0

0

4

7

0

0

0

0

0

3

0

0

0

0

6

Если А — приводимая матрица, [Квадратная матрица А называется приводимой, если она подобна клеточной матрице, квадратные элементы которой соответствуют индукции линейного оператора А в отдельные подпространства. — Примеч. ред.]  линейная система Ах=b может быть решена приведением А к верхней блочной треугольной форме с неприводимым диагональным блоком. Решение может быть найдено методом обратной подстановки.

Третий выходной аргумент г — целочисленный вектор, описывающий границы блоков. К-й блок матрицы A(p,q) имеет индексы r(k):r(k+l)-l.

В терминах теории графов диагональные блоки соответствуют сильным компонентам Холла графа смежности матрицы А.

Примеры:

» A=sparse([1.2,1.3.2].[3.2.1.1.1].[7.6,4.5,4],3,3)

:full(A) 

ans =

4 0 

4 6 0

5 0 0  

»[p.q.r]=dmperm(A)

Р=

1 2 3

q =

3 2 1 

r =

1 2 3 4 

» fulKA(p.q)) 

ans =

7 0 4

0 6 4

0 0 5

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

Алгоритм упорядочения для симметрических матриц основан на алгоритме упорядочения по разреженности столбцов. Фактически symmmd(S) только формирует матрицу К с такой структурой ненулевых элементов, что К' *К имеет тот же трафик разреженности, что и S, и затем вызывает алгоритм упорядочения по разреженности столбцов для К. На рис. 12.2 приводится пример применения функции symmmd к элементам разреженной матрицы.

Пример:

» B=bucky;p=symmmd(B);

» R=B(p.p):

» subp1ot(1.2.1),spy(B);subplot(1.2,2).spy(R)

Для вещественной симметрической разреженной матрицы S (такой, что S=ST) собственные значения S(r.r) совпадают с собственными значениями S, но для вычисления eig(S(r,r)) требуется меньше времени, чем для вычисления eig(S).

Рис. 12.2. Пример применения функции symmmd

Пример:

» B=bucky;p=symrcm(B);

» R=B(p.p);

» subplot(l,2,l).spy(B);subp1ot(l,2.2).spy(R)

На рис. 12.3 приведен пример концентрации ненулевых элементов разреженной матрицы вблизи главной диагонали.

Рис. 12.3. Пример применения функции symrcm

Норма, число обусловленности и ранг разреженной матрицы

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

» F=wi1kinson(150); » condest(sparse(F)) 

ans =

460.2219

» normest(sparse(F)) 

ans =

75.2453

Пример:

» S-[3 0004: 54080; 00013]; 

» r=sprank(S)

Разложение Холецкого разреженных матриц

Пример:

» S = delsqCnumgndCC' .4)) 

S =

(1.1) 4

(2.1) -1

(1.2) -1

(2.2) 4

(3.2) -1

(2.3) -1

(3.3) 4

» RD=cholinc(S,'0')

R0=

(1.1)  2.0000

(1.2)  -0.5000

(2.2) 1.9365

(2.3) -0.5164

(3.3) 1.9322

LU-разложение разреженных матриц

Функция luinc осуществляет неполное LU-разложение и возвращает нижнюю треугольную матрицу, верхнюю треугольную матрицу и матрицу перестановок для разреженных матриц [Благодаря LAPACK в MATLAB 6 появилась отсутствующая в прежних версиях возможность использовать команду lu для точного LU-разложения разреженных матриц. — Примеч. ред.]. Используется в следующих формах:

Вычисление собственных значений  и сингулярных чисел разреженных матриц

Применение функции eigs решает проблему собственных значений, состоящую в нахождении нетривиальных решений системы уравнений, которая может быть интерпретирована как алгебраический эквивалент системы обыкновенных дифференциальных уравнений в явной форме Коши: A*v=l*v.[Усовершенствованный алгоритм eig позволяет использовать eig для расчета собственных значений и полных, и разреженных матриц, но для получения собственных векторов разреженных матриц по-прежнему желательно использовать именно eigs. — Примеч. ред.] Вычисляются только отдельные выбранные собственные значения или собственные значения и собственные векторы:

В случае одного выходного параметра D — вектор, содержащий 6 самых больших собственных значений матрицы А. В случае двух выходных аргументов [V.D] = eigs(A) D — диагональная матрица размера 6x6, содержащая эти 6 самых больших собственных значений, и V — матрица, содержащая б столбцов, являющихся соответствующими собственными векторами. [V.D.flag] = eigs(A) возвращает флаг, равный 0, если все возвращенные собственные значения сходятся, и 1 в противном случае.

  1. eigs(A.K) и eigs(A,B,K) возвращают не 6, а К самых больших собственных значений. eigs(A,K,sigma) Heigs(A,B,K.sigma) возвращают не 6, а К собственных значений, выбранных в зависимости от значения параметра sigma;

  2. 'lm' — самые большие (как и по умолчанию) по абсолютной величине;

  3. ' sm' — самые малые по абсолютной величине;

  4. ' l а' и ' sa' — соответственно самые большие и самые малые алгебраически собственные значения для действительных симметрических матриц;

  5. 'be' — для действительных симметрических матриц возвращает и самые большие, и самые малые алгебраически собственные значения поровну, но если К нечетное, то самых больших значений на 1 больше, чем самых малых;

  6. 'lr' и 'sr' — для несимметрических и комплексных матриц возвращают соответственно собственные значения с самыми большими и самыми малыми действительными частями;

  7. '1i' и 'si'— для несимметрических и комплексных матриц возвращают соответственно собственные значения с самыми большими и самыми малыми мнимыми частями;

  8. скаляр - ближайшие к величине slgma. В этом случае матрица В может быть только симметрической (или эрмитовой) положительно полуопределенной, а функция Y = AFUN(X) должна возвращать Y = (A-SIGMA*B)\X.

  1. OPTS.issym: симметрия А или A-SIGMA*B, представленной AFUN [{0} | 1];

  2. OPTS.isreal: комплексные А или A-SIGMA*B, представленной AFUN [0 | {1}];

  3. OPTS.tol: сходимость: аbs(с1_вычисленное-с1_действительное) < tоl*аbs(с1_вычисленное) [скаляр){eps}];

  4. OPTS.maxit: наибольшее число итераций [положительное целое | {300}];

  5. OPTS.р: число векторов Ланцо (Lanczos): K+l<p<=N [положительное целое | {2К}];

  6. OPTS.v0: начальный вектор [вектор размера N| {произвольно выбирается библиотекой ARPACK}];

  7. OPTS.disp: уровень вывода диагностической информации [0 | {1} | 2J;

  8. OPTS.cholВ: В — это множитель Холецкого chol (В) [{0} | 1];

  9. OPTS.permB: разреженная матрица В равна chol (B(perm(B) .perm(B)) [perm(B) | {1:N}], perm — перестановка.

Функция svds служит для вычисления небольшого числа сингулярных чисел и векторов большой разреженной матрицы. По мере возможности старайтесь использовать svd(fulKA)) вместо svds(A). Если А прямоугольная матрица mxn, svds(A....) манипулирует с несколькими собственными значениями и собственными векторами, возвращенными EIGS(B,...), где В = [SPARSE(М.М) A: A' SPARSE(N.N)]. Положительные собственные значения симметрической матрицы В равны сингулярным числам А.

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

Что нового мы узнали?

В этом уроке мы научились: