Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Work with Sparse Matrices - Wolfram Mathematica

Работа с разреженными матрицами

Разреженное представление матриц является полезным, так как оно не хранит каждый элемент. Если одно значение встречается очень часто, использование разреженных представлений становится очень удобным. Mathematica предлагает разреженные представления для матриц, векторов и тензоров при помощи функции SparseArray. Они очень тесно связаны с плотными матрицами, отображаемыми в виде списков. Большинство операций, работающих со списками, работают и с разреженными массивами.

Существует несколько способов создания разреженных массивов. Многие из них используют функцию SparseArray.

Так из плотной матрицы создается разреженная матрица. Разреженная матрица не отображается в привычном для матрицы виде, так как она может быть слишком большой:

In[2]:=

WorkWithSparseMatricesRU_1.gif

Out[2]=

WorkWithSparseMatricesRU_2.gif

Однако, возможность отобразить матрицу в матричном представлении сохраняется:

In[3]:=

WorkWithSparseMatricesRU_3.gif

Out[3]//MatrixForm=

WorkWithSparseMatricesRU_4.gif

Еще один способ создания разреженной матрицы - указать не равные нулю элементы:

In[4]:=

WorkWithSparseMatricesRU_5.gif

Out[4]=

WorkWithSparseMatricesRU_6.gif

Кроме этого, можно воспользоваться синтаксисом Mathematica для правил и шаблонов. Так, например, создается трехдиагональная матрица:

In[5]:=

WorkWithSparseMatricesRU_7.gif

Out[6]//MatrixForm=

WorkWithSparseMatricesRU_8.gif

Более сложные матрицы могут быть созданы с помощью функции Band. В этом примере группа создается вдоль антидиагонали:

In[7]:=

WorkWithSparseMatricesRU_9.gif

Out[8]//MatrixForm=

WorkWithSparseMatricesRU_10.gif

Можно создавать разреженные матрицы путем их импорта из форматов разреженных матриц, таких как  Harwell–Boeing или Matrix Market.

Вот пример импорта матрицы 961?961, которая содержит 10591 ненулевых элементов:

In[9]:=

WorkWithSparseMatricesRU_11.gif

Out[9]=

WorkWithSparseMatricesRU_12.gif

    

Функции, которые работают с плотными матрицами, как правило, применимы и для разреженных матриц. Зачастую они используют специальные алгоритмы для разреженных матриц, которые работают быстрее и не нуждаются в преобразованиях в плотные матрицы. Это приводит к значительной экономии времени и памяти.

Так создается разреженная ленточная матрица:

In[10]:=

WorkWithSparseMatricesRU_13.gif

Out[10]=

WorkWithSparseMatricesRU_14.gif

Это ее отображение:

In[11]:=

WorkWithSparseMatricesRU_15.gif

Out[11]//MatrixForm=

WorkWithSparseMatricesRU_16.gif

Когда разреженная матрица умножается сама на себя, в результате получается также разреженная матрица, однако, количество нулевых элементов может уменьшиться:

In[12]:=

WorkWithSparseMatricesRU_17.gif

Out[12]=

WorkWithSparseMatricesRU_18.gif

Ниже приведен результат умножения. Можно видеть, что количество нулевых элементов сократилось:

In[13]:=

WorkWithSparseMatricesRU_19.gif

Out[13]//MatrixForm=

WorkWithSparseMatricesRU_20.gif

    

Вы можете извлекать и обновлять элементы разреженных матриц точно так же, как Вы делаете это с плотными матрицами:

In[14]:=

WorkWithSparseMatricesRU_21.gif

Out[14]=

WorkWithSparseMatricesRU_22.gif

Так извлекается элемент (2, 3):

In[15]:=

WorkWithSparseMatricesRU_23.gif

Out[15]=

WorkWithSparseMatricesRU_24.gif

Так элементу (2, 3) задается новое значение 20:

In[16]:=

WorkWithSparseMatricesRU_25.gif

Out[17]//MatrixForm=

WorkWithSparseMatricesRU_26.gif

    

Иногда бывает полезно получить представление о расположении ненулевых элементов разреженной матрицы. Это может быть сделано с помощью функции MatrixPlot. Даже если матрица имеет много элементов,  MatrixPlot обеспечивает эффективное отображение структуры разреженной матрицы.

Загрузим большую матрицу с помощью функции Import:

In[18]:=

WorkWithSparseMatricesRU_27.gif

Out[18]=

WorkWithSparseMatricesRU_28.gif

Теперь построим график матрицы, иллюстрирующий ее структуру:

In[19]:=

WorkWithSparseMatricesRU_29.gif

Out[19]=

WorkWithSparseMatricesRU_30.gif