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

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

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 на диагонали и 1 с на супер - и поддиагонали. Существует много способов сгенерировать, это — вот одна возможность.

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

Смотрите также

|

Похожие темы