Python 对称可寻址矩阵
我希望在python中创建一个具有对称寻址的二维整数矩阵(即矩阵[2,3]和矩阵[3,2]将返回相同的值)。整数将进行加法和减法运算,并用于逻辑比较。我最初的想法是先创建integer对象,然后尝试用一些python等价的指针填充列表。不过我不知道怎么做。实现这一点的最佳方法是什么?我应该使用列表还是其他数据结构?您只需要存储矩阵的下三角。通常,这是通过一个n(n+1)/2长度列表完成的。您需要重载Python 对称可寻址矩阵,python,data-structures,matrix,Python,Data Structures,Matrix,我希望在python中创建一个具有对称寻址的二维整数矩阵(即矩阵[2,3]和矩阵[3,2]将返回相同的值)。整数将进行加法和减法运算,并用于逻辑比较。我最初的想法是先创建integer对象,然后尝试用一些python等价的指针填充列表。不过我不知道怎么做。实现这一点的最佳方法是什么?我应该使用列表还是其他数据结构?您只需要存储矩阵的下三角。通常,这是通过一个n(n+1)/2长度列表完成的。您需要重载\uuu getitem\uuu方法来解释条目的含义。您只需要存储矩阵的下三角。通常,这是通过一个
\uuu getitem\uuu
方法来解释条目的含义。您只需要存储矩阵的下三角。通常,这是通过一个n(n+1)/2长度列表完成的。您需要重载\uuu getitem\uuu
方法来解释条目的含义。Golub和Van Loan的《矩阵计算》一书概述了一个可行的寻址方案:
假设i>=j,将数据打包到向量中并按如下方式访问:
a_ij = A.vec((j-1)n - j(j-1)/2 + i)
Golub和Van Loan的《矩阵计算》一书概述了一个可行的寻址方案:
假设i>=j,将数据打包到向量中并按如下方式访问:
a_ij = A.vec((j-1)n - j(j-1)/2 + i)
你最好使用一个完整的正方形numpy矩阵。是的,它浪费了存储冗余值的一半内存,但是在Python中滚动自己的对称矩阵将浪费更多的内存和CPU,因为它将整数作为Python对象存储和处理 您最好使用一个完整的正方形numpy矩阵。是的,它浪费了存储冗余值的一半内存,但是在Python中滚动自己的对称矩阵将浪费更多的内存和CPU,因为它将整数作为Python对象存储和处理 一种更简单、更简洁的方法是只使用带有排序元组的字典作为键。元组与矩阵索引相对应。覆盖
\uuuuu getitem\uuuuuuuuuuuuuuuu
和\uuuuuuuuu setitem\uuuuuuuuuuuuuuuuuuuu
以按排序元组访问字典;下面是一个示例类:
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)
矩阵=矩阵()
>>>矩阵[2,3]=1066
>>>打印矩阵
{(2, 3): 1066}
>>>矩阵[2,3]
1066
>>>矩阵[3,2]
1066
>>>矩阵[1,1]
回溯(最近一次呼叫最后一次):
文件“”,第1行,是否在中?
文件“z.py”,第3行,在_getitem中__
返回super(矩阵,self)。\uuuu getitem\uuuuu(元组(排序(索引)))
键错误:(1,1)
一种更简单、更简洁的方法是只使用带有排序元组的字典作为键。元组与矩阵索引相对应。覆盖
\uuuuu getitem\uuuuuuuuuuuuuuuu
和\uuuuuuuuu setitem\uuuuuuuuuuuuuuuuuuuu
以按排序元组访问字典;下面是一个示例类:
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)
矩阵=矩阵()
>>>矩阵[2,3]=1066
>>>打印矩阵
{(2, 3): 1066}
>>>矩阵[2,3]
1066
>>>矩阵[3,2]
1066
>>>矩阵[1,1]
回溯(最近一次呼叫最后一次):
文件“”,第1行,是否在中?
文件“z.py”,第3行,在_getitem中__
返回super(矩阵,self)。\uuuu getitem\uuuuu(元组(排序(索引)))
键错误:(1,1)
但从数学上讲,这不应该奏效——至少,如果我对Calc 1的记忆是正确的,我不确定我是否理解。什么是行不通的?但从数学上讲,这是行不通的——至少,如果我对Calc 1的记忆是正确的,我不确定我是否理解。什么不起作用?