2009-09-15 136 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。