2010-11-11 37 views

Trả lời

21

Sử dụng một ánh xạ tuyến tính:

y = ((x/99.0) * 2) - 1 

Cách hoạt động:

  • Divide bởi 99: Đây lại bình thường khoảng từ [0, 99] tới [0, 1].
  • Nhân với 2: Điều này làm tăng phạm vi thành [0, 2].
  • Trừ 1: Đây là bản dịch cung cấp cho [-1, 1].

Bạn có thể kết hợp các bước ((x/99.0) * 2) thành một bộ phận nếu bạn muốn. Tôi chỉ chia nó ra cho rõ ràng.

+1

này có quá nhiều nheo mắt để xem những gì thực sự dự định; loại ánh xạ này rất phổ biến và nên được viết theo cách dễ hiểu ngay lập tức. –

-1
n = (n/99) * 2 - 1; 
+2

Trong Python 2.x, điều này cần 'từ __future__ bộ phận nhập khẩu' để làm việc đúng. Điều đó, hoặc làm cho 99 một phao, như Mark Byers đã làm. –

6

Để ánh xạ giá trị x từ cự ly này:

[a..b] 

Để phạm vi này:

[a'..b'] 

Bạn sử dụng công thức này:

x' = (x/99) * 2 - 1 

Cách một ánh xạ đó đang công tác như sau:

x' = ((x - a)/(b - a)) * (b' - a') + a' 

Từng bước:

  1. Trước tiên, bạn tính toán một tỷ lệ bao xa vào a..b giá trị x là:

    (x - a)/(b - a) 
    

    Giá trị này sẽ nằm trong khoảng từ 0 đến 1.

  2. Sau đó, bạn sử dụng giá trị này để tính toán cách xa vào a'..b' giá trị nên là:

    ratio * (b' - a') + a' 
    

Trong trường hợp cụ thể của bạn:

x' = ((x - 0)/(99 - 0)) * (1.0 - (-1.0)) + (-1.0) 

hoặc dưới hình thức hợp đồng:

x' = (x/99) * 2 - 1 

Note: Nếu bạn đang làm điều này trong một ngôn ngữ lập trình mà số nguyên chia cho số nguyên khác là phân chia số nguyên, bạn nên phát huy các giá trị để dấu chấm động để tránh việc phải đối phó với mất độ chính xác:

x' = (x/99.0) * 2.0 - 1.0 
14

Đừng mở rộng quy mô thủ công; phải mất quá nhiều thời gian để tính toán những gì thực sự có ý định. Sử dụng hàm trợ giúp.

def scale(val, src, dst): 
    """ 
    Scale the given value from the scale of src to the scale of dst. 
    """ 
    return ((val - src[0])/(src[1]-src[0])) * (dst[1]-dst[0]) + dst[0] 

print scale(0, (0.0, 99.0), (-1.0, +1.0)) 
print scale(1, (0.0, 99.0), (-1.0, +1.0)) 
print scale(99, (0.0, 99.0), (-1.0, +1.0)) 

Tôi đã tìm thấy đây là một trong những chức năng hữu ích hơn có bằng bất kỳ ngôn ngữ nào; bạn có thể biết nhanh chóng các cuộc gọi scale().

+0

Tôi nhận được: TypeError: 'int'/'float' đối tượng không phải là subscriptable. : / –

2

Sử dụng tính năng này cho bất kỳ phạm vi nào (có thể là âm).

[minFrom..maxFrom] -> [minTo..maxTo]

mappedValue = minTo + (maxTo - minTo) * ((value - minFrom)/(maxFrom - minFrom)); 
2

Sử dụng numpy, đó sẽ là hiệu quả nhất

>>> from numpy import interp 
>>> interp(50, [0,99], [-1,1]) 
0.010101010101010166 
Các vấn đề liên quan