2016-06-29 2 views
1

대용량 3x3 대칭, 사후 한정 시스템을 Python으로 해결해야합니다. 지금까지, 그러나 나는 또한 n가 큰 경우 매우 느리게,많은 수의 작은 선형 시스템을 해결합니다.

res = numpy.zeros(n) 
for k, obj in enumerate(data_array): 
    # construct A, rhs, idx from obj 
    res[idx] += numpy.linalg.solve(A, rhs) 

이 올바른 결과를 생성했다. (음 ... 그래.) 아마도 3x3은 문제가되는 크기가 아니며 solve()을 호출하는 것이 좋습니다.

힌트가 있습니까?

답변

4

NumPy 1.8 이상에서는 numpy.linalg.solve actually broadcasts입니다. numpy.linalg.solve(a, b)의 경우 b.ndim == a.ndim - 1 인 경우 브로드 캐스트 된 행렬 벡터 해결을 수행합니다. 그렇지 않으면 브로드 캐스트 매트릭스 매트릭스 해결을 수행합니다. (이 결정 기준이 문서화되어 있지 않습니다;. 나는 소스에서 지켜 볼 수밖에 없었습니다)

효율적 A들과 rhs의 스택을 만들 수 있다면, 당신은 한 번 solve를 호출하고 파이썬 루프를 방지 할 수 있습니다.

+0

내가 필요한 것. 감사! –

+0

결정 기준은 문서에서 'a : (..., M, M) array_like'와'b : {(..., M), (..., M, K)} ' 다소 어렴풋한 형태 일지라도. –

+0

@pv .: 정말로. 예를 들어, 만약 당신이 그 모양을 가지고 있다면'a.shape == (5, 5, 5, 5)'와'b.shape == (5, 5, 4) 매트릭스, 그리고'a.shape == (5, 5, 5, 5)'와'b.shape == (5,)'가 행렬 - 벡터를 할 것을 기대하지만, NumPy는 반대 해석을 선택합니다. – user2357112

관련 문제