我正在將一個matlab代碼轉換為Python。在matlab中,有一行將復數轉換為int16的代碼:
real = int16(real(-3. 406578165491512e 04 9.054663292273188e 03i)。)
imag= int16(imag(-3. 406578165491512e 04 9.054663292273188e 03i)。)
real= 32768
imag=9055
在python中,我試著這樣做:
real = np.int16(round(np. real(-3.406578165491512e 04 9.054663292273188e 03j)))
imag = np.int16(round(np. imag(-3.406578165491512e 04 9.054663292273188e 03j)))
real= 31470
imag=9055
結果是不同的(我有許多其他的值,如(1.815808483565253e 04 3.533772674703890e 04j),答案也不同!)請你幫助我得到相同的答案?
uj5u.com熱心網友回復:
MATLAB的輸出在intmin('int16') = -32768(docs)時已經飽和,即它可以作為int16變數表示的最負值。
Python對int16也有同樣的范圍(docs),但它沒有在最負值處飽和,而是經歷了下溢,包裹到范圍的頂部
k = round(-3.406578165491512e 04) = -34066>
k = k (32768*2) = 31470
當輸入仍然是浮點值時,你可以通過強制執行這些行為中的任何一種來解決這個問題,然后當輸入在-32768到32767范圍內時,你可以把它投到int16。
uj5u.com熱心網友回復:
Wolfie說的是區別,這是關于如何解決這個問題。如果你對剪切沒有意見,那么你可以使用iinfo來獲得一個整數型別的最小和最大值(或者硬編碼,如果你知道你永遠不會從int16改變它),然后使用clip來約束浮點數,使其在投遞前處于這些范圍之內。
n = -3.406578165491512e 04。
ii = np.iinfo(np.int16)
print(f "min = {ii.min}"/span>) # min = -32768
print(f "max = {ii.max}"/span>) # max = 32767
np.int16(np.clip(n, ii.min, ii.max)
# -32768;/span>。
重要提示:只有當你的float的大小大于int的大小時,這才是可靠的,因為它依賴于能夠將ii.max完全表示為一個float。請參閱這里關于何時不正確的討論。
下面是一個失敗的例子
n = np.float64(1e100)
ii = np.iinfo(np.int64)
print(f "max: {ii.max}") # max = 9223372036854775807
clipped = np.clip(n, ii.min, ii.max)
print(f "clipped to: {int(clipped)}") # clipped to: 9223372036854775808
print(f "as int: {np.int64(clipped)}") # as int: -9223372036854775808
(發生這種情況是因為ii.max不能被表示為浮點。超過9007199254740992,我們就失去了1的精度位置,只能指定偶數整數,所以剪裁的邊界就不正確了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/309722.html
標籤:
