対称的にアドレス可能なマトリックス
-
07-07-2019 - |
質問
Pythonで対称アドレッシング(つまり、matrix [2,3]とmatrix [3,2]が同じ値を返す)を持つ整数の2Dマトリックスを作成しようとしています。整数には加算と減算が行われ、論理比較に使用されます。私の最初のアイデアは、整数オブジェクトを前もって作成し、Pythonの同等のポインターでリストのリストを埋めることでした。しかし、どうすればいいのかわかりません。これを実装する最良の方法は何ですか?リストまたは別のデータ構造を使用する必要がありますか?
解決
よりシンプルでクリーンな方法は、ソートされたタプルをキーとして辞書を使用することです。タプルはマトリックスインデックスに対応します。ソートされたタプルによって辞書にアクセスするには、 __ 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)
他のヒント
GolubとVan Loanの「行列計算」本は、実行可能なアドレス指定スキームの概要を示しています。
i&gt; = jを想定して、データをベクトルにパックし、次のようにアクセスします:
a_ij = A.vec((j-1)n - j(j-1)/2 + i)
おそらく、完全な正方形のnumpy行列を使用する方が良いでしょう。はい、冗長な値を保存するメモリの半分が無駄になりますが、Pythonで独自の対称行列をローリングすると、整数をPythonオブジェクトとして保存および処理することにより、さらに多くのメモリとCPUが無駄になります。
マトリックスの下三角部分のみを保存する必要があります。通常、これは1つのn(n + 1)/ 2長リストで行われます。エントリの意味を解釈するには、 __ getitem __
メソッドをオーバーロードする必要があります。