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
The 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)
-by - p. Столбцы 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 74
spdiags
может также извлечь диагональные элементы из разреженной матрицы или заменить матричные диагональные элементы новыми значениями. Тип help
spdiags
для получения дополнительной информации.
Можно импортировать разреженные матрицы из расчетов вне окружения MATLAB. Используйте spconvert
функция в сочетании с load
команда для импорта текстовых файлов, содержащих списки индексов и ненулевых элементов. Например, рассмотрим текстовый файл с тремя столбцами T.dat
чей первый столбец является списком индексов строк, второй - списком индексов столбцов, а третий - списком ненулевых значений. Эти операторы загружают T.dat
в MATLAB и преобразовать его в разреженную матрицу S
:
load T.dat
S = spconvert(T)
save
и load
команды могут также обрабатывать разреженные матрицы, хранящиеся в виде двоичных данных в MAT-файлах.