문제

나는 대칭 주소 지정 (즉, 매트릭스 [2,3] 및 매트릭스 [3,2]가 Python에서 동일한 값을 반환하는 2D 매트릭스를 만들려고합니다. 정수는 추가 및 뺄셈을 수행하고 논리적 비교에 사용됩니다. 나의 초기 아이디어는 정수 객체를 앞쪽으로 만들고 포인터와 동등한 일부 파이썬으로 목록 목록을 채우는 것이 었습니다. 그래도 어떻게 해야할지 잘 모르겠습니다. 이를 구현하는 가장 좋은 방법은 무엇이며 목록이나 다른 데이터 구조를 사용해야합니까?

도움이 되었습니까?

해결책

더 간단하고 깨끗한 방법은 튜플이 키로 분류 된 사전을 사용하는 것입니다. 튜플은 매트릭스 지수에 해당합니다. 우세하다 __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의 "Matrix Computations"책은 실현 가능한 주소 지정 체계를 간략하게 설명합니다.

i> = j를 가정하면 데이터를 벡터에 넣고 다음과 같이 액세스합니다.

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

전체 정사각형 Numpy 매트릭스를 사용하는 것이 좋습니다. 예, 중복 값을 저장하는 메모리 저장의 절반을 낭비하지만 파이썬에서 자신의 대칭 행렬을 굴리면 정수를 Python 객체로 저장하고 처리하여 더 많은 메모리와 CPU를 낭비합니다.

매트릭스의 하단 삼각형 만 저장하면됩니다. 일반적으로 이것은 하나의 n (n+1)/2 길이 목록으로 수행됩니다. 과부하가 필요합니다 __getitem__ 입력의 의미를 해석하는 방법.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top