MATLAB ® никогда не создает разреженные матрицы автоматически. Вместо этого необходимо определить, содержит ли матрица достаточно большой процент нулей, чтобы извлечь выгоду из разреженных методов.
Плотность матрицы - это число ненулевых элементов, деленное на общее число элементов матрицы. Для матрицы M, это будет
nnz(M) / prod(size(M));
nnz(M) / numel(M);
Матрицы с очень низкой плотностью часто являются хорошими кандидатами для использования разреженного формата.
Полную матрицу можно преобразовать в разреженное хранилище с помощью sparse с одним аргументом.
Например:
A = [ 0 0 0 5
0 2 0 0
1 3 0 0
0 0 4 0];
S = sparse(A) S =
(3,1) 1
(2,2) 2
(3,2) 3
(4,3) 4
(1,4) 5В выводе на печать перечислены ненулевые элементы Sвместе с индексами строк и столбцов. Элементы сортируются по столбцам, отражающим внутреннюю структуру данных.
Разреженную матрицу можно преобразовать в полное хранилище с помощью full при условии, что порядок матрицы не слишком велик. Например, A = full(S) отменяет преобразование примера.
Преобразование полной матрицы в разреженное хранилище не является наиболее частым способом формирования разреженных матриц. Если порядок матрицы настолько мал, что возможно полное хранение, то преобразование в разреженное хранение редко обеспечивает значительную экономию.
Можно создать разреженную матрицу из списка ненулевых элементов, используя sparse функция с пятью аргументами.
S = sparse(i,j,s,m,n)
i и j являются векторами индексов строк и столбцов соответственно для ненулевых элементов матрицы. s - вектор ненулевых значений, индексы которого задаются соответствующим (i,j) пар. m - размер строки результирующей матрицы, и n - размер столбца.
Матрица S предыдущего примера можно создать непосредственно с помощью
S = sparse([3 2 3 4 1],[1 2 2 3 4],[1 2 3 4 5],4,4)
S = (3,1) 1 (2,2) 2 (3,2) 3 (4,3) 4 (1,4) 5
sparse имеет ряд альтернативных форм. В приведенном выше примере используется форма, задающая максимальное количество ненулевых элементов в матрице равным length(s). При необходимости можно добавить шестой аргумент, указывающий больший максимум, что позволит добавить ненулевые элементы позже без перераспределения разреженной матрицы.
Матричное представление второго дифференциального оператора является хорошим примером разреженной матрицы. Представляет собой тридиагональную матрицу с -2s на диагонали и 1s на сверх- и субдиагональной. Есть много способов его генерации - вот одна возможность.
n = 5; D = sparse(1:n,1:n,-2*ones(1,n),n,n); E = sparse(2:n,1:n-1,ones(1,n-1),n,n); S = E+D+E'
S = (1,1) -2 (2,1) 1 (1,2) 1 (2,2) -2 (3,2) 1 (2,3) 1 (3,3) -2 (4,3) 1 (3,4) 1 (4,4) -2 (5,4) 1 (4,5) 1 (5,5) -2
Сейчас F = full(S) отображает соответствующую полную матрицу.
F = full(S)
F =
-2 1 0 0 0
1 -2 1 0 0
0 1 -2 1 0
0 0 1 -2 1
0 0 0 1 -2Создание разреженных матриц на основе их диагональных элементов является общей операцией, поэтому функция spdiags обрабатывает эту задачу. Его синтаксис:
S = spdiags(B,d,m,n)
Создание выходной матрицы S размера m-by-n с элементами на p диагонали:
B является матрицей размера min(m,n)-по-п. Столбцы B являются значениями для заполнения диагоналей S.
d - вектор длины p целочисленные элементы которых определяют, какие диагонали S для заполнения.
То есть элементы в столбце j из B заполнить диагональ, заданную элементом j из d.
Примечание
Если столбец B длиннее заменяющей его диагонали, супердиагонали взяты из нижней части столбца B, и субдиагонали взяты из верхней части столбца B.
В качестве примера рассмотрим матрицу B и вектор d.
B = [ 41 11 0
52 22 0
63 33 13
74 44 24 ];
d = [-3
0
2];Используйте эти матрицы для создания разреженной матрицы 7 на 4 A:
A = spdiags(B,d,7,4)
A = (1,1) 11 (4,1) 41 (2,2) 22 (5,2) 52 (1,3) 13 (3,3) 33 (6,3) 63 (2,4) 24 (4,4) 44 (7,4) 74
В полном виде, A выглядит следующим образом:
full(A)
ans =
11 0 13 0
0 22 0 24
0 0 33 0
41 0 0 44
0 52 0 0
0 0 63 0
0 0 0 74spdiags может также извлекать диагональные элементы из разреженной матрицы или заменять диагональные элементы матрицы новыми значениями. Напечатать help
spdiags для получения подробной информации.
Можно импортировать разреженные матрицы из вычислений вне среды MATLAB. Используйте spconvert в сочетании с load для импорта текстовых файлов, содержащих списки индексов и ненулевых элементов. Например, рассмотрим текстовый файл из трех столбцов T.dat первый столбец которого является списком индексов строк, второй столбец - списком индексов столбцов, а третий столбец - списком ненулевых значений. Эти инструкции загружаются T.dat в MATLAB и преобразовать его в разреженную матрицу S:
load T.dat
S = spconvert(T) save и load команды также могут обрабатывать разреженные матрицы, хранящиеся как двоичные данные в MAT-файлах.