Saya mencoba mengonversi satu rentang angka ke yang lain, dengan mempertahankan rasio. Matematika bukan kelebihan saya.
Saya memiliki file gambar di mana nilai poin dapat berkisar dari -16000.00 hingga 16000.00 meskipun rentang tipikal mungkin jauh lebih sedikit. Yang ingin saya lakukan adalah kompres nilai-nilai ini ke dalam kisaran integer 0-100, di mana 0 adalah nilai titik terkecil, dan 100 adalah nilai terbesar. Semua titik di antaranya harus menjaga rasio relatif meskipun beberapa presisi hilang Saya ingin melakukan ini dalam python tetapi bahkan algoritma umum sudah cukup. Saya lebih suka algoritma di mana rentang min / max atau salah satu dapat disesuaikan (yaitu, rentang kedua bisa -50 hingga 800 bukannya 0 hingga 100).
Jawaban:
Atau sedikit lebih mudah dibaca:
Atau jika Anda ingin melindungi untuk kasus di mana rentang lama adalah 0 ( OldMin = OldMax ):
Perhatikan bahwa dalam hal ini kami dipaksa untuk memilih salah satu dari nilai rentang yang mungkin baru secara sewenang-wenang. Tergantung pada konteksnya, pilihan yang masuk akal dapat berupa:
NewMin
( lihat sampel ),NewMax
atau(NewMin + NewMax) / 2
sumber
Itu konversi linear sederhana.
Jadi, konversi 10.000 pada skala -16000 hingga 16000 ke skala baru dari 0 hingga 100 hasil:
sumber
Sebenarnya ada beberapa kasus yang jawaban di atas akan pecah. Seperti nilai input salah, rentang input salah, rentang input / output negatif.
sumber
Ada suatu kondisi, ketika semua nilai yang Anda periksa adalah sama, di mana kode @ jerryjvl akan mengembalikan NaN.
sumber
Saya tidak menggali BNF untuk ini, tetapi dokumentasi Arduino memiliki contoh yang bagus dari fungsi dan itu rusak. Saya bisa menggunakan ini dengan Python hanya dengan menambahkan def mengubah nama menjadi remap (peta disebabkan built-in) dan menghapus tipe gips dan kurung kurawal (yaitu hanya menghapus semua 'lama').
Asli
Python
https://www.arduino.cc/en/reference/map
sumber
Dalam daftar yang disediakan oleh PenguinTD, saya tidak mengerti mengapa rentangnya terbalik, ia bekerja tanpa harus membalikkan rentang tersebut. Konversi rentang linear didasarkan pada persamaan linear
Y=Xm+n
, di manam
dann
diturunkan dari rentang yang diberikan. Daripada merujuk ke rentang sebagaimin
danmax
, akan lebih baik untuk merujuknya sebagai 1 dan 2. Jadi rumusnya adalah:Di mana
Y=y1
kapanX=x1
, danY=y2
kapanX=x2
.x1
,x2
,y1
&y2
Dapat diberikan setiappositive
ataunegative
nilai. Menentukan ekspresi dalam makro membuatnya lebih bermanfaat, kemudian dapat digunakan dengan nama argumen apa pun.Para
float
pemain akan memastikan pembagian floating point dalam kasus di mana semua argumen adalahinteger
nilai. Tergantung pada aplikasi, mungkin tidak perlu memeriksa rentangx1=x2
dany1==y2
.sumber
float RangeConv(float input, float x1, float x2, float y1, float y2) { return (((input - x1) * (y2 - y1)) / (x2 - x1)) + y1; }
Berikut ini beberapa fungsi Python pendek untuk kemudahan salin dan rekat Anda, termasuk fungsi untuk menskalakan seluruh daftar.
Yang bisa digunakan seperti ini:
Dalam kasus saya, saya ingin skala kurva logaritmik, seperti:
sumber
Saya menggunakan solusi ini dalam masalah yang saya pecahkan dalam js, jadi saya pikir saya akan membagikan terjemahannya. Terima kasih atas penjelasan dan solusinya.
sumber
C ++ Varian
Saya menemukan Solusi PenguinTD berguna, jadi saya porting ke C ++ jika ada yang membutuhkannya:
sumber
Port PHP
Menemukan solusi PenguinTD sangat membantu jadi saya porting ke PHP. Silahkan!
sumber
Berikut ini adalah versi Javascript yang mengembalikan fungsi yang melakukan penyetelan ulang untuk rentang sumber dan tujuan yang telah ditentukan, meminimalkan jumlah perhitungan yang harus dilakukan setiap kali.
Berikut adalah contoh penggunaan fungsi ini untuk skala 0-1 menjadi -0x80000000, 0x7FFFFFFF
sumber
Usulan pintas / disederhanakan
wayne
sumber
NewRange/OldRange
disiniSaya pribadi menggunakan kelas pembantu yang mendukung obat generik (kompatibel Swift 3)
sumber
Contoh ini mengubah posisi lagu saat ini menjadi rentang sudut 20 - 40.
sumber
Daftar pemahaman satu solusi liner
Versi yang lebih panjang
sumber
Versi Java
Selalu berfungsi, apa pun yang Anda berikan!
Saya membiarkan semuanya diperluas sehingga lebih mudah diikuti untuk belajar. Pembulatan di akhir, tentu saja, adalah opsional.
sumber