2009-09-15 148 views
1

我正在寻找在python中使用对称寻址(即矩阵[2,3]和矩阵[3,2]将返回相同值)的整数的2d矩阵。整数将在它们上进行加法和减法,并用于逻辑比较。我最初的想法是先创建整型对象,然后尝试用一些python等价的指针填充列表。不过,我不知道该怎么做。什么是实现这一点的最佳方式,我应该使用列表还是其他数据结构?对称地址矩阵

+0

但在数学上,这不应该工作的 - 至少,如果我的计算器1的回忆是正确 – warren 2009-09-15 04:51:15

+0

我不是当然我明白。什么不行? – Lonnen 2009-09-15 05:07:23

回答

1

一个更简单和更简洁的方法是只使用一个带有排序元组作为关键字的字典。这些元组与您的矩阵索引相对应。重写__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

您只需要存储矩阵的下三角。通常这是通过一个n(n + 1)/ 2长度列表完成的。您需要重载__getitem__方法来解释条目的含义。

3

戈卢布和Van贷款的“矩阵计算”一书中概括了可行的解决方案:

您将数据打包到一个向量和访问如下,假设我> = j的:

a_ij = A.vec((j-1)n - j(j-1)/2 + i)  
2

你使用完整的方形numpy矩阵可能会更好。是的,它浪费了存储冗余值的一半内存,但是在Python中滚动自己的对称矩阵将通过将整数存储并处理为Python对象,浪费更多的内存和CPU。