Ich versuche, einen Zahlenbereich in einen anderen umzuwandeln, wobei das Verhältnis beibehalten wird. Mathe ist nicht meine Stärke.
Ich habe eine Bilddatei, in der die Punktwerte zwischen -16000,00 und 16000,00 liegen können, obwohl der typische Bereich viel geringer sein kann. Ich möchte diese Werte in den ganzzahligen Bereich 0-100 komprimieren, wobei 0 der Wert des kleinsten Punkts und 100 der Wert des größten ist. Alle Punkte dazwischen sollten ein relatives Verhältnis beibehalten, obwohl etwas Präzision verloren geht. Ich würde dies gerne in Python tun, aber selbst ein allgemeiner Algorithmus sollte ausreichen. Ich würde einen Algorithmus bevorzugen, bei dem der Min / Max- oder einer der Bereiche angepasst werden kann (dh der zweite Bereich könnte -50 bis 800 anstelle von 0 bis 100 sein).
Antworten:
Oder etwas lesbarer:
Oder wenn Sie für den Fall schützen möchten, dass der alte Bereich 0 ist ( OldMin = OldMax ):
Beachten Sie, dass wir in diesem Fall gezwungen sind, einen der möglichen neuen Bereichswerte willkürlich auszuwählen. Je nach Kontext können sinnvolle Entscheidungen getroffen werden:
NewMin
( siehe Beispiel )NewMax
oder(NewMin + NewMax) / 2
quelle
Das ist eine einfache lineare Konvertierung.
Die Umrechnung von 10000 auf der Skala von -16000 bis 16000 in eine neue Skala von 0 bis 100 ergibt also:
quelle
Tatsächlich gibt es einige Fälle, in denen die obigen Antworten brechen würden. Wie falsch eingegebener Wert, falsch eingegebener Bereich, negative Eingabe- / Ausgabebereiche.
quelle
Es gibt eine Bedingung, bei der alle von Ihnen überprüften Werte gleich sind und der Code von @ jerryjvl NaN zurückgibt.
quelle
Ich habe die BNF dafür nicht ausgegraben , aber die Arduino-Dokumentation hatte ein großartiges Beispiel für die Funktion und ihre Aufteilung. Ich konnte dies in Python verwenden, indem ich einfach eine Umbenennung für die Neuzuordnung hinzufügte (weil die Karte integriert ist) und die Typumwandlungen und geschweiften Klammern entfernte (dh einfach alle 'Longs' entfernte).
Original
Python
https://www.arduino.cc/en/reference/map
quelle
In der von PenguinTD bereitgestellten Liste verstehe ich nicht, warum die Bereiche umgekehrt werden. Es funktioniert, ohne dass die Bereiche umgekehrt werden müssen. Die lineare Bereichsumwandlung basiert auf der linearen Gleichung
Y=Xm+n
, wobeim
undn
aus den angegebenen Bereichen abgeleitet werden. Anstatt die Bereiche alsmin
und zu bezeichnenmax
, ist es besser, sie als 1 und 2 zu bezeichnen. Die Formel wäre also:Wo
Y=y1
wannX=x1
undY=y2
wannX=x2
.x1
,x2
,y1
&y2
Kann zu jedem gegebenen werdenpositive
odernegative
Wert. Das Definieren des Ausdrucks in einem Makro macht ihn nützlicher und kann dann mit beliebigen Argumentnamen verwendet werden.Die
float
Umwandlung würde eine Gleitkommadivision sicherstellen, wenn alle Argumenteinteger
Werte sind. Je nach Anwendung ist es möglicherweise nicht erforderlich, die Bereichex1=x2
und zu überprüfeny1==y2
.quelle
float RangeConv(float input, float x1, float x2, float y1, float y2) { return (((input - x1) * (y2 - y1)) / (x2 - x1)) + y1; }
Hier sind einige kurze Python-Funktionen zum einfachen Kopieren und Einfügen, einschließlich einer Funktion zum Skalieren einer gesamten Liste.
Welches kann so verwendet werden:
In meinem Fall wollte ich eine logarithmische Kurve wie folgt skalieren:
quelle
Ich habe diese Lösung in einem Problem verwendet, das ich in js gelöst habe, also dachte ich, ich würde die Übersetzung teilen. Danke für die Erklärung und Lösung.
quelle
C ++ Variante
Ich fand die Lösung von PenguinTD nützlich, also habe ich sie nach C ++ portiert, wenn jemand sie benötigt:
quelle
PHP-Port
Ich fand die Lösung von PenguinTD hilfreich, also habe ich sie auf PHP portiert. Bedienen Sie sich!
quelle
Hier ist eine Javascript-Version, die eine Funktion zurückgibt, die die Neuskalierung für vorgegebene Quell- und Zielbereiche durchführt und so den Rechenaufwand minimiert, der jedes Mal durchgeführt werden muss.
Hier ist ein Beispiel für die Verwendung dieser Funktion zum Skalieren von 0-1 in -0x80000000, 0x7FFFFFFF
quelle
Abkürzung / vereinfachter Vorschlag
Wayne
quelle
NewRange/OldRange
hierIch persönlich benutze die Helferklasse, die Generika unterstützt (Swift 3 kompatibel).
quelle
In diesem Beispiel wird die aktuelle Position eines Songs in einen Winkelbereich von 20 bis 40 konvertiert.
quelle
Listenverständnis Einzeiler-Lösung
Längere Version
quelle
Java-Version
Funktioniert immer, egal was Sie füttern!
Ich habe alles erweitert gelassen, damit es einfacher ist, dem Lernen zu folgen. Das Runden am Ende ist natürlich optional.
quelle