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

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

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

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

|

Похожие темы