Najprawdopodobniej jest to niezainicjowana tablica, taka jak zwracana przez np.empty
. To w połączeniu z recyklingiem pamięci może prowadzić do takiego efektu, jaki widzisz. Minimalny przykład to:
for a in range(5):
y = np.empty(3,int)
x = (np.arange(3)+a)**3
print(x,y)
del x
# [0 1 8] [94838139529536 0 0]
# [ 1 8 27] [0 1 8]
# [ 8 27 64] [ 1 8 27]
# [ 27 64 125] [ 8 27 64]
# [ 64 125 216] [ 27 64 125]
Obserwuj, jak przy pierwszej iteracji y
zawiera śmieci, a przy każdej kolejnej iteracji zawiera wartość poprzedniej, x
ponieważ przypisuje się jej pamięć, która została wcześniej zwolniona.
Możemy łatwo sprawdzić, czy w oryginalnym przykładzie tvec
pojawia się również poprzedni :
def changes():
rmat=np.eye(4)
tvec=np.array([4,0.0,2.5])
(rvec, jacobian)=cv2.Rodrigues(rmat)
print(rvec)
for i in range(3):
changes()
# [[4.6609787e-310]
# [0.0000000e+000]
# [0.0000000e+000]]
# [[4. ]
# [0. ]
# [2.5]]
# [[4. ]
# [0. ]
# [2.5]]
Możemy dalej spekulować, że to szczególny wybór rmat
powoduje błąd.
Prawdopodobnie jest to błąd, który eye(4)
w ogóle jest akceptowany, ponieważ oficjalnie rmat
powinien to być 3x1 1x3 lub 3x3. Rzeczywiście, 1D rmat
, który nie ma 3 elementów, jest poprawnie odrzucany przez opakowanie Pythona. Podejrzewam, że matematyka 2D nie jest poprawnie sprawdzana na poziomie Pythona. Kod C wykrywa następnie nieprawidłowy kształt i nic nie robi poza zwracaniem kodu błędu, którego kod Python nie sprawdza.
Rzeczywiście, użycie rmat=eye(3)
efektu znika:
def changes():
rmat=np.eye(3)
tvec=np.array([4,0.0,2.5])
(rvec, jacobian)=cv2.Rodrigues(rmat)
print(rvec)
for a in range(3):
changes()
# [[0.]
# [0.]
# [0.]]
# [[0.]
# [0.]
# [0.]]
# [[0.]
# [0.]
# [0.]]