Hallo, ich habe folgendes Problem: Ich muss einen Wert in einen anderen umverteilen. Die Werte von 20 bis 36 sollen belegt werden. Aus einer anderen Berechnung bekomme ich Werte zwischen 0 und 255. Jetzt muss ich diese 256 Werte auf die 17 Werte von 20 bis 36 aufteilen. Die Werte von ca. 100 bis 156 sollen allerdings immer dem Wert 18 entsprechen. Dadurch kommt eine gewisse Nichtlineraität ins Spiel... Ohne die Nichtlinearität kein Problem...aber mit?? Wie kann ich dies in C möglichst SCHNELL bewerkstelligen? Im Moment mache ich es ungefähr so: (Die Werte stimmen nicht, nur ein Bsp) if (wert < 10) { ee = 20; } if ((wert >= 10) && (wert <= 20)) { ee = 21; } Diese Art ist mir aber zu aufwendig, da ich alle Werte (10,20...usw.) von Hand berechnen muss. Das ist in diesem Beispiel relativ schnell passiert, aber wie gehts einfacher? Kann mir da jemand weiterhelfen? Wie würdet ihr sowas machen?
Du brauchst eine Abschnittsweise definierte Funktion:
1 | float m1, m2; |
2 | int b1, b2, y; |
3 | |
4 | |
5 | if (x < 100) { |
6 | y = m1 * x + b1; |
7 | } else if (x > 156) { |
8 | y = m2 * x + b2; |
9 | } else { |
10 | y = 18; |
11 | }
|
m1, m2, b1, b2 musst du dir mit 2 Punkten, die auf der Geraden liegen ausrechnen. (m = Steigung, b = y-Achsenabschnitt) b1 währe in deinem Fall z.B. 20.
> Wie kann ich dies in C möglichst SCHNELL bewerkstelligen?
Da's noch keiner geschrieben hat: die Tabelle ist natürlich die
schnellste Lösung. Für 256 Elemente normalerweise auch kein
Problem, wenn man sie im ROM ablegt.
Das mit der abschnittsweisen Funktion hab ich schon probiert. Leider führt das teilweise zu einem verschobenen Ergebnis, da das Runden nicht ganz hinhaut, aber vielen Dank für den Tipp. Sie erfüllt den Zweck in dieser Aufgabe. Auf so eine einfache Lösung bin ich im ersten Moment nicht gekommen... Tabelle ist schön und recht bei 256 Elementen, aber wie gesagt, gibt auch größere Beispiele bei meinen Problemen... DANKE
> da das Runden nicht ganz hinhaut
Im vom Peter geposteten Code wird überhaupt nicht gerundet.
C-Standard ist, dass bei einer Umwandlung von double zu
int, die Nachkommastellen einfach abgeschnitten werden.
Wenn du auf runden aus bist, musst du eine Rundungskorrektur
anbringen:
y = m1 * x + b1 + 0.5;
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.