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

Создание разреженных матриц

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-файлах.

См. также

|

Похожие темы