реобразование
разреженных матриц
Теперь рассмотрим
функции преобразования разреженных матриц. Они представлены ниже:
-
k = f
ind(X) — возвращает индексы вектора х для его ненулевых элементов. Если
таких элементов нет, то find возвращает пустой вектор. find(X>100) возвращает
индексы элементов вектора с Х>100;
-
[1,j]
= find(X) — возвращает индексы строки и столбца для ненулевого элемента
матрицы X;
-
[1 . j
. v] = find(X) — возвращает вектор столбец v ненулевых элементов матрицы
X и индексы строки i и столбца j. Вместо X можно вставить (X, операция отношения,
параметр), и тогда индексы и вектор-столбец будут отражать элементы матрицы,
удовлетворяющие данному отношение. Единственное исключение — f ind(x ~=
0). Индексы те же, что и при исполнении find(X), но вектор v содержит только
единицы.
Пример:
»
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=
1
1
3
3
2
3
j
=
1
2
2
3
4
4
-
full(S)
— преобразует разреженную матрицу S в полную; если исходная матрица S была
полной, то full (S) возвращает S. Пусть X — матрица размера mxn с nz=nnz(X)
ненулевыми элементами. Тогда full(X) требует такой объем памяти, чтобы хранить
mxn действительных чисел, в то время как sparse(X) требует пространство
для хранения лишь nz действительных чисел и (nxz+n) целых чисел — индексов.
Большинству компьютеров для хранения действительного числа требуется вдвое
больше пространства, чем для целого. Для таких компьютеров sparse(X) требует
меньше пространства, чем full(X), если плотность nnz/prod(s1ze(X))<2/3.
Выполнение операций над разреженными матрицами, однако, требует больше затрат
времени, чем над полными, поэтому для эффективной работы с разреженными
матрицами плотность расположения ненулевых элементов должна быть много меньше
2/3.
Примеры:
»
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
-
S=sparse(A)
— преобразует полную матрицу в разреженную, удаляя нулевые элементы. Если
матрица S уже разреженная, то sparse(S) возвращает S. Функция sparse — это
встроенная функция, которая формирует матрицы в соответствии с правилами
записи разреженных матриц, принятыми в системе MATLAB;
-
S=sparse(i,j,s,m,n,nzmax)
— использует векторы 1, j и s для того, чтобы генерировать разреженную матрицу
размера mxn с ненулевыми элементами, количество которых не превышает nzmax.
Векторы 1 и j задают позиции элементов и являются целочисленными, а вектор
s определяет числовое значение элемента матрицы, которое может быть действительным
или комплексным. Все элементы вектора s, равные нулю, игнорируются вместе
с соответствующими значениями i и j. Векторы i, j и s должны быть одной
и той же длины;
-
S = sparsed'
. j.s.m.n) — использует nzmax=length(s).
-
S = sparsed
, j .s) — использует m=maxd) и n=max(j). Максимумы вычисляются раньше, чем
нулевые строки столбца S будут удалены;
-
S = sparse(m.n)
равносильно sparse ([ ].[ ].[ ]. m.n, 0). Эта команда генерирует предельную
разреженную матрицу, где mxn элементов нулевые.
Все встроенные
в 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.0000i
(3.8)
9.0000
Функция spconvert
используется для создания разреженных матриц из простых разреженных форматов,
легко производимых вне средств MATLAB:
-
S = spconvert(D)
— преобразует матрицу D со строками, содержащими [i.j.r] или [i,j,r.s],
где i — индекс ряда, j — индекс строки, г — численное значение, в соответствующую
разреженную матрицу. Матрица D может иметь nnz или nnz+1 строк и три или
четыре столбца. Три элемента в строке генерируют действительную матрицу,
четыре элемента в строке генерируют комплексную матрицу (s преобразуется
во мнимую часть значения элемента). Последняя строка массива D типа [m n
0] или [m n 0 0] может быть использована для определения size(S). Команда
spconvert может быть использована только после того, как матрица D загружена
или из МАТ-файла, или из ASCII-файла при помощи команд load, uiload и т.
д.:
»load
mydata.dat
»А
= spconvert (rnydata);
Содержание раздела