2009-09-15 6 views
1

대칭적인 주소 지정 (즉, 행렬 [2,3]과 행렬 [3,2]가 동일한 값을 반환하는)의 2 차원 행렬을 파이썬에서 작성하려고합니다. 정수는 덧셈과 뺄셈을 수행하고 논리적 비교에 사용됩니다. 필자의 초기 아이디어는 앞에 정수 객체를 생성하고 포인터 목록과 비슷한 파이썬 목록을 채우는 것이 었습니다. 그래도 어떻게해야할지 모르겠다. 이것을 구현하는 가장 좋은 방법은 무엇이며 목록이나 다른 데이터 구조를 사용해야합니까?대칭 적으로 주소를 지정할 수있는 행렬

+0

하지만이 작동하지합니다 - 석회질 1의 내 기억이 맞다면 적어도 – warren

+0

나는 아니에요 나는 이해한다. 무엇이 작동하지 않을까요? – Lonnen

답변

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

Golub과 밴 대출의는 "매트릭스 계산은"책은 가능한 주소 체계 설명 :

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

당신에게 다음과 같이

당신은 내가> = J 가정, 벡터 등의 데이터를 팩 및 액세스를 아마도 정사각형 전체 행렬을 사용하는 것이 좋습니다. 예, 중복 값을 저장하는 메모리의 절반을 낭비하지만 파이썬에서 자신의 대칭 행렬을 굴리면 정수를 파이썬 객체로 저장하고 처리함으로써 더 많은 메모리와 CPU를 낭비하게됩니다.

관련 문제