Симметрично адресуемая матрица - PullRequest
1 голос
/ 15 сентября 2009

Я ищу создание двумерной матрицы целых чисел с симметричной адресацией (то есть матрица [2,3] и матрица [3,2] будут возвращать одно и то же значение) в python. Целые числа будут иметь сложение и вычитание, и будут использоваться для логических сравнений. Моя первоначальная идея состояла в том, чтобы создать целочисленные объекты заранее и попытаться заполнить список списков каким-нибудь python-эквивалентом указателей. Я не уверен, как это сделать, хотя. Каков наилучший способ реализовать это, и я должен использовать списки или другую структуру данных?

Ответы [ 4 ]

3 голосов
/ 15 сентября 2009

В книге «Матричные вычисления» Голуба и Ван Лоан излагается схема возможной адресации:

Вы упаковываете данные в вектор и получаете доступ следующим образом, предполагая, что i> = j:

a_ij = A.vec((j-1)n - j(j-1)/2 + i)    
2 голосов
/ 15 сентября 2009

Вам, вероятно, лучше использовать матрицу с квадратными углами. Да, он тратит впустую половину памяти, сохраняя избыточные значения, но сворачивание вашей собственной симметричной матрицы в Python приведет к потере еще больше памяти и ЦП, сохраняя и обрабатывая целые числа как объекты Python.

1 голос
/ 16 сентября 2009

Более простой и понятный способ - просто использовать словарь с отсортированными кортежами в качестве ключей. Кортежи соответствуют вашему матричному индексу. Переопределите __getitem__ и __setitem__ для доступа к словарю по отсортированным кортежам; Вот пример класса:

class Matrix(dict):
    def __getitem__(self, index):
        return super(Matrix, self).__getitem__(tuple(sorted(index)))
    def __setitem__(self, index, value):
        return super(Matrix, self).__setitem__(tuple(sorted(index)), value)

А затем используйте это так:

>>> matrix = Matrix()
>>> matrix[2,3] = 1066
>>> print matrix
{(2, 3): 1066}
>>> matrix[2,3]
1066
>>> matrix[3,2]
1066
>>> matrix[1,1]
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "z.py", line 3, in __getitem__
    return super(Matrix, self).__getitem__(tuple(sorted(index)))
KeyError: (1, 1)
1 голос
/ 15 сентября 2009

Вам нужно только сохранить нижний треугольник матрицы. Обычно это делается с одним списком длины n (n + 1) / 2. Вам потребуется перегрузить метод __getitem__, чтобы интерпретировать, что означает эта запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...