2017-12-07 4 views
0

저는 Matlab 스크립트를 파이썬으로 변환하고 있습니다. 10 ** - 4 순서로 다른 결과를 얻고 있습니다.Precision Matlab and Python (numpy)

f_mean=f_mean+nanmean(f); 
f = f - nanmean(f); 

f_t = gradient(f); 
f_tt = gradient(f_t); 

if n_loop==1 
    theta = atan2(sum(f.*f_tt), sum(f.^2)); 
end 

theta = -2.2011167e+03 

파이썬 : 매트랩

f_mean = f_mean + np.nanmean(vel) 

vel = vel - np.nanmean(vel) 

firstDerivative = np.gradient(vel) 
secondDerivative = np.gradient(firstDerivative) 


if numberLoop == 1: 
    theta = np.arctan2(np.sum(vel * secondDerivative), 
         np.sum([vel**2])) 
제 비록

및 secondDerivative 파이썬과 매트랩 동일한 결과를 얻을 수는 f_mean 약간 다르다 : -0.0066412 (matlab에) 및 -0.0066414 (파이썬); 그래서 theta : -0.4126186 (M)과 -0.4124718 (P). 그것은 작은 차이지만, 결국 내 스크립트에서 다른 결과로 연결됩니다.

나는이 차이점에 대해 물어 보는 사람들이 있지만 표준 값에 대해서는 항상 알고 있지만 평균값은 고려하지 않는다는 것을 알고 있습니다. 왜 그런지 궁금합니다.

+2

[최소한의 완전하고 검증 가능한 예] (https://stackoverflow.com/help/mcve)를 제공하면 도움이됩니다. 위 코드를 보았지만 입력 배열'f_mean'을 제공하지 않았으므로 코드를 실행하여 결과를 재현 할 수 없습니다. –

+0

파이썬 코드에서'f_mean'은 초기에 numpy 배열입니까? 그렇다면'f_mean.dtype'은 무엇입니까? –

+0

것은 배열이 백만 개가 넘는 거대합니다. 하지만 vel은 [-0.042 -0.028 -0.038 -0.013 -0.026 -0.031 -0.0560 ...]으로 시작합니다. –

답변

1
당신이 (수단 사이에) 설명하는 초기 차이

한 가지 소스가 될 수 일반적으로 순진 방법보다 상당히 더 정확할 것이다 큰 배열에 NumPy와의 usepairwise summation의 :

a = np.random.uniform(-1, 1, (10**6,)) 
a = np.r_[-a, a] 
# so the sum should be zero 

a.sum() 
# 7.815970093361102e-14 

# use cumsum to get naive summation: 
a.cumsum()[-1] 
# -1.3716805469243809e-11 

편집 (감사 @ 마지막 단어에 대한"provably exact" 기준으로는 사용할 수 math.fsum : 샤샤)

import math 
math.fsum(a) 
# 0.0 

D matlab을 가지고 있지 않으므로 그들이하는 일을 확인할 수 없습니다.

+0

그리고 단지 재미를 위해서 :'''math.fsum (a.tolist())'''(훨씬 더 정확하지만 아마 훨씬 느릴 것입니다). – sascha

+0

@sascha 깔끔함! 다소 느리지 만 funnily만큼 파이썬 합계보다 빠를 것 같습니다 ... –