J'essaie de convertir une plage de nombres en une autre, en maintenant le ratio. Les mathématiques ne sont pas mon point fort.
J'ai un fichier image où les valeurs en points peuvent varier de -16000,00 à 16000,00 bien que la plage typique puisse être beaucoup moins. Ce que je veux faire, c'est compresser ces valeurs dans la plage entière 0-100, où 0 est la valeur du plus petit point et 100 est la valeur du plus grand. Tous les points entre les deux devraient garder un rapport relatif même si une certaine précision est perdue. J'aimerais le faire en python, mais même un algorithme général devrait suffire. Je préférerais un algorithme dans lequel la plage min / max ou l'une des deux peut être ajustée (c'est-à-dire que la deuxième plage pourrait être de -50 à 800 au lieu de 0 à 100).
Réponses:
Ou un peu plus lisible:
Ou si vous souhaitez vous protéger dans le cas où l'ancienne plage est 0 ( OldMin = OldMax ):
Notez que dans ce cas, nous sommes obligés de choisir arbitrairement l'une des nouvelles valeurs de plage possibles. Selon le contexte, des choix judicieux pourraient être:
NewMin
( voir exemple ),NewMax
ou(NewMin + NewMax) / 2
la source
C'est une simple conversion linéaire.
Ainsi, la conversion de 10000 sur une échelle de -16000 à 16000 vers une nouvelle échelle de 0 à 100 donne:
la source
En fait, il y a des cas où les réponses ci-dessus se briseraient. Tels que la valeur d'entrée incorrecte, la plage d'entrée incorrecte, les plages d'entrée / sortie négatives.
la source
Il y a une condition, lorsque toutes les valeurs que vous vérifiez sont les mêmes, où le code de @ jerryjvl retournerait NaN.
la source
Je n'ai pas déterré le BNF pour cela, mais la documentation Arduino avait un excellent exemple de la fonction et de sa panne. J'ai pu utiliser cela en Python en ajoutant simplement un changement de nom à remapper (car la carte est intégrée) et en supprimant les types et les accolades (c.-à-d. Supprimez simplement tous les «longs»).
Original
Python
https://www.arduino.cc/en/reference/map
la source
Dans la liste fournie par PenguinTD, je ne comprends pas pourquoi les plages sont inversées, cela fonctionne sans avoir à inverser les plages. La conversion de plage linéaire est basée sur l'équation linéaire
Y=Xm+n
, oùm
etn
sont dérivées des plages données. Plutôt que de se référer aux plages commemin
etmax
, il serait préférable de les désigner comme 1 et 2. La formule serait donc:Où,
Y=y1
quandX=x1
etY=y2
quandX=x2
.x1
,x2
,y1
Ety2
peut donner unepositive
ounegative
valeur. La définition de l'expression dans une macro la rend plus utile, elle peut ensuite être utilisée avec n'importe quel nom d'argument.Le
float
transtypage garantirait une division en virgule flottante dans le cas où tous les arguments sont desinteger
valeurs. Selon l'application, il peut ne pas être nécessaire de vérifier les plagesx1=x2
ety1==y2
.la source
float RangeConv(float input, float x1, float x2, float y1, float y2) { return (((input - x1) * (y2 - y1)) / (x2 - x1)) + y1; }
Voici quelques fonctions Python courtes pour votre facilité de copier-coller, y compris une fonction pour mettre à l'échelle une liste entière.
Qui peut être utilisé comme ceci:
Dans mon cas, je voulais mettre à l'échelle une courbe logarithmique, comme ceci:
la source
J'ai utilisé cette solution dans un problème que je résolvais en js, alors j'ai pensé partager la traduction. Merci pour l'explication et la solution.
la source
Variante C ++
J'ai trouvé la solution de PenguinTD utile, donc je l'ai portée en C ++ si quelqu'un en a besoin:
la source
Port PHP
La solution de PenguinTD a été utile, alors je l'ai portée sur PHP. Aide-toi!
la source
Voici une version Javascript qui renvoie une fonction qui effectue le redimensionnement pour des plages de source et de destination prédéterminées, minimisant la quantité de calcul qui doit être effectuée à chaque fois.
Voici un exemple d'utilisation de cette fonction pour mettre à l'échelle 0-1 en -0x80000000, 0x7FFFFFFF
la source
Proposition raccourcie / simplifiée
Wayne
la source
NewRange/OldRange
ici?J'utilise personnellement la classe d'assistance qui prend en charge les génériques (compatible avec Swift 3)
la source
Cet exemple convertit la position actuelle d'un morceau dans une plage d'angle de 20 à 40.
la source
Comprendre la liste d'une solution de doublure
Version plus longue
la source
Version Java
Fonctionne toujours, peu importe ce que vous lui donnez!
J'ai laissé tout développé afin qu'il soit plus facile à suivre pour apprendre. L'arrondi à la fin est bien entendu facultatif.
la source