Matlab에서 작동하는 알고리즘을 numpy로 포팅하고 이상한 동작을 관찰했습니다. 코드의 관련 부분은 내가 matlab에 함께 실행할 때,Matlab/Octave/Numpy 숫자 차이
P = eye(4)*1e20;
A = [1 -0.015 -0.025 -0.035; 0.015 1 0.035 -0.025; 0.025 -0.035 1 0.015; 0.035 0.025 -0.015 1];
V1 = A*(P*A')
V2 = (A*P)*A'
이 코드는 다음과 같은 행렬을 제공 : 예상대로 V1 및 V2가 동일한 지
V1 = 1.0021e+20 0 -8.0000e+00 0
0 1.0021e+20 0 0
-8.0000e+00 0 1.0021e+20 0
0 0 0 1.0021e+20
V2 = 1.0021e+20 0 -8.0000e+00 0
0 1.0021e+20 0 0
-8.0000e+00 0 1.0021e+20 0
0 0 0 1.0021e+20
참고. 동일한 코드 옥타브에서 실행될 때
, 그것이 제공 NumPy와에서는
V1 = 1.0021e+20 4.6172e+01 -1.3800e+02 1.8250e+02
-4.6172e+01 1.0021e+20 -1.8258e+02 -1.3800e+02
1.3801e+02 1.8239e+02 1.0021e+20 -4.6125e+01
-1.8250e+02 1.3800e+02 4.6125e+01 1.0021e+20
V2 = 1.0021e+20 -4.6172e+01 1.3801e+02 -1.8250e+02
4.6172e+01 1.0021e+20 1.8239e+02 1.3800e+02
-1.3800e+02 -1.8258e+02 1.0021e+20 4.6125e+01
1.8250e+02 -1.3800e+02 -4.6125e+01 1.0021e+20
는 세그먼트 그래서
[[ 1.00207500e+20 4.61718750e+01 -1.37996094e+02 1.82500000e+02]
[ -4.61718750e+01 1.00207500e+20 -1.82582031e+02 -1.38000000e+02]
[ 1.38011719e+02 1.82386719e+02 1.00207500e+20 -4.61250000e+01]
[ -1.82500000e+02 1.38000000e+02 4.61250000e+01 1.00207500e+20]]
[[ 1.00207500e+20 -4.61718750e+01 1.38011719e+02 -1.82500000e+02]
[ 4.61718750e+01 1.00207500e+20 1.82386719e+02 1.38000000e+02]
[ -1.37996094e+02 -1.82582031e+02 1.00207500e+20 4.61250000e+01]
[ 1.82500000e+02 -1.38000000e+02 -4.61250000e+01 1.00207500e+20]]
출력
from numpy import array, dot, eye
A = numpy.array([[1, -0.015, -0.025, -0.035],[0.015, 1, 0.035, -0.025],[0.025, -0.035, 1, 0.015],[0.035, 0.025, -0.015, 1]])
P = numpy.eye(4)*1e20
print numpy.dot(A,numpy.dot(P,A.transpose()))
print numpy.dot(numpy.dot(A,P),A.transpose())
되고, 옥타브 NumPy와 두 동일한 답변을 제공하지만 Matlab과 매우 다릅니다. 첫 번째 요점은 V1! = V2이며, 이는 옳지 않은 것입니다. 다른 점은 대각선이 아닌 요소가 대각선의 요소보다 훨씬 더 큰 차수이지만 이것이 알고리즘에서 문제를 일으키는 것 같습니다.
누구나 numpy와 Octave가이 방식으로 작동하는 것을 알고 있습니까?
그다지 옳지 않습니다. float128 데이터 유형이 있지만 정밀도가 항상 잘 정의 된 것은 아닙니다. – seberg
@Sebastian, float128 유형에 대한 참조는 전혀 발견되지 않았습니다. 단지 complex128입니다 (두 개의 float64가 실수 및 허수 부와 함께 하나의 숫자로 표시되기 때문입니다). http://docs.scipy.org/doc/numpy/user/basics.types.html – Lucero
예 ... thats 왜냐하면 float128은 실행중인 컴퓨터에 따라 사용할 수 있기 때문입니다. 하지만 일반적인 PC에서는 그렇습니다. – seberg