Самый эффективный способ хранения больших симметричных разреженных матриц в Python - PullRequest
5 голосов
/ 29 августа 2011

Я работал над составлением / тестированием техники, которую я разработал для решения дифференциальных уравнений для скорости и эффективности.

Это потребовало бы сохранения, манипулирования, изменения размера и (в некоторой точке) диагонализации очень больших разреженных матриц. Я хотел бы иметь возможность иметь строки, состоящие из нулей и нескольких (скажем, <5), и добавлять их по нескольку за раз (в порядке количества используемых процессоров.) </p>

Я подумал, что было бы полезно иметь ускорение GPU - поэтому любые предложения о том, как наилучшим образом воспользоваться этим преимуществом, также будут оценены (скажем, Pycuda, Theano и т.

Ответы [ 3 ]

7 голосов
/ 29 августа 2011

Наиболее эффективным методом хранения для симметричных разреженных матриц является, вероятно, формат разреженного горизонта (это, например, то, что использует Intel MKL).AFAIK scipy.sparse не содержит разреженный, симметричный матричный формат. Pysparse , однако, делает .Используя Pysparse, вы можете постепенно построить матрицу, используя формат списка ссылок, а затем преобразовать матрицу в формат разреженного горизонта.Что касается производительности, я обычно обнаружил, что Pysparse превосходит scipy с большими разреженными системами и всеми основными строительными блоками (матричный продукт, решатель собственных значений, прямой решатель, итеративный решатель), хотя диапазон процедур, возможно, немного меньшечем то, что доступно в Scipy.

4 голосов
/ 29 августа 2011

Вы можете использовать словарь и кортежи для доступа к данным:

>>> size = (4,4)
>>> mat = {}
>>> mat[0,1] = 3
>>> mat[2,3] = 5
>>> for i in range(size[0]):
        for j in range(size[1]):
            print mat.get((i,j), 0) ,
        print

0 3 0 0
0 0 0 0
0 0 0 5
0 0 0 0

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

class Sparse(dict):
    pass

Кстати, Вы также можете использовать scipy.sparse из scipy lib

3 голосов
/ 29 августа 2011

Использование scipy.sparse .

...