문제

나는 다른 사람이 작성한 Matlab 에이 코드 라인이 있습니다.

c=a.'/b

파이썬으로 번역해야합니다. A, B 및 C는 모두 배열입니다. 코드를 테스트하기 위해 현재 사용하고있는 차원은 다음과 같습니다.

A : 18x1,
B : 25x18,

치수 1x25로 C를 제공합니다.

배열은 정사각형이 아니지만 코드가 실패하지 않기를 바랍니다. 누군가이 라인이 (수학적으로) 무엇을하고 있는지 정확히 설명하고 파이썬에서 어떻게하는지 설명 할 수 있습니까? (즉, Python에 존재하는 경우 MATLAB의 내장 MRDIVIDE 기능과 동일합니까?)

도움이 되었습니까?

해결책

라인

c = a.' / b

방정식의 솔루션을 계산합니다 CB = a ~을 위한 . Numpy에는 직접 수행하는 연산자가 없습니다. 대신 해결해야합니다 = a ~을 위한 결과를 전환하십시오.

c = numpy.linalg.lstsq(b.T, a.T)[0].T

다른 팁

상징물 / Matlab의 Matrix Right Division 연산자는 다음을 호출합니다. mrdivide 기능. 문서에서 Matrix Right Division은 매트릭스 왼쪽 부문 다음 방법으로 :

B/A = (A'\B')'

만약에 A 사각형 매트릭스입니다. B/A 대략 동일합니다 B*inv(A) (다른, 더 강력한 방식으로 계산되어 있지만). 그렇지 않으면, x = B/A 최소 제곱 의미의 해결책은 과도하게 결정된 방정식 시스템입니다. x*A = B. 방정식 시스템을 해결하는 데 사용되는 알고리즘에 대한 자세한 내용은 제공됩니다. 여기. 일반적으로 패키지와 같은 패키지 라크 또는 블라스 후드 아래에서 사용됩니다.

그만큼 Numpy 패키지 Python의 경우 루틴이 포함되어 있습니다 lstsq 방정식 시스템에 대한 최소 제곱 솔루션을 계산합니다. 이 루틴은 mrdivide Matlab에서 기능하지만 가능성은 거의 없습니다. 정확한. 각 함수에서 사용되는 기본 알고리즘의 차이는 서로 약간 다른 답변을 초래할 수 있습니다 (즉, 하나는 1.0의 값을 반환 할 수있는 반면, 다른 하나는 0.999의 값을 반환 할 수 있음). 이 오류의 상대 크기 ~할 수 있었다 해결하는 특정 방정식 시스템에 따라 크게 더 커집니다.

사용 lstsq, 문제를 약간 조정해야 할 수도 있습니다. 양식의 방정식을 해결하고 싶은 것 같습니다. CB = a, 어디 25 x 18, 1-18입니다 1 x-25입니다. 적용 a 바꾸어 놓다 양쪽에 방정식을 제공합니다 = a, 보다 표준적인 형태입니다 (즉 도끼 = b). 논쟁 lstsq (이 순서로) (18 x-25 배열) 및 (18 요소 배열). lstsq 25 요소 배열을 반환해야합니다 ().

참고 : Numpy는 1 x-n 또는 n-by-1 어레이를 구분하지는 않지만 Matlab은 확실히 그렇게하고, 적절한 것을 사용하지 않으면 당신에게 소리를지를 것입니다.

Matlab에서 A.' A 행렬을 전달하는 것을 의미합니다. 그래서 수학적으로 코드에서 달성되는 것은/비.


Python (또는 모든 언어)에서 Matrix Division 구현 방법 (참고 : 양식의 간단한 분할을 살펴 보겠습니다. A/B; 예를 들어, 당신은 a를해야합니다 먼저 그리고 a/b 다음, Python에서 전환 작업을 수행하는 것은 매우 쉽습니다.

매트릭스 방정식 C*B = A (C를 A/B로 찾으려면)가 있습니다.

오른쪽 부서 (/)는 다음과 같습니다.

*(비*) = a*

그런 다음 반전하여 C를 분리합니다 (b*)

즉,

c = a**(비*)' ----- [1]

따라서 Python (또는 모든 언어)에서 Matrix Division을 구현하려면 다음 세 가지 방법을 얻으십시오.

  • 매트릭스 곱셈
  • 매트릭스가 전달됩니다
  • 매트릭스 역수

그런 다음 [1]에서와 같이 분할을 달성하기 위해 반복적으로 적용하십시오.

만, 당신은 a를해야합니다/b, 따라서 세 가지 기본 방법을 구현 한 후 최종 작업은 다음과 같습니다.

**(비*)'

참고 : 연산자 우선 순위의 기본 규칙을 잊지 마십시오 :)

편집] Suvesh가 지적했듯이, 나는 전에 완전히 틀렸다. 그러나 Numpy는 여전히 자신의 게시물에서 제공하는 절차를 쉽게 수행 할 수 있습니다.

A = numpy.matrix(numpy.random.random((18, 1))) # as noted by others, your dimensions are off
B = numpy.matrix(numpy.random.random((25, 18)))
C = A.T * B.T * (B * B.T).I

의사의 의사를 사용하여 이에 접근 할 수도 있습니다 B 그런 다음 해당 결과를 곱하십시오 A. 사용해보십시오 numpy.linalg.pinv 그런 다음 이것을 매트릭스 곱셈을 통해 결합하십시오 numpy.dot:

c = numpy.dot(a, numpy.linalg.pinv(b))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top