|
|
Max und floating-point relative accuracy |
|
AgentZero |

Forum-Anfänger
|
 |
Beiträge: 12
|
 |
|
 |
Anmeldedatum: 06.06.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2015a
|
 |
|
|
 |
|
Verfasst am: 24.11.2015, 16:47
Titel: Max und floating-point relative accuracy
|
 |
|
 |
|
Hallo zusammen!
Ich hänge nun schon den ganzen Tag an folgendem Problem und hoffe, dass mir hier jemand helfen kann. Eine Google Suche hat zwar dazu geführt, dass ich nun genau weiß, warum ich folgendes Problem habe; einen Lösungsvorschlag, der genau für "mein" Problem passt, habe ich aber bislang leider nicht.
Also, worum geht es? Ein einfaches Bsp: Ich möchte mir alle möglichen Kombinationen von 3 Zahlen erzeugen lassen, die folgende Bedingungen erfüllen: 1) Die Zahlen müssen aus dem Intervall [0,1] stammen, 2) Die Summe der Zahlen muss 1 ergeben und 3) ich kann festlegen in welchen bzw. wie vielen Schritten die einzelnen Zahlen von 0 bis 1 laufen.
Das klingt wahrscheinlich zunächst unklar, ist aber eigentlich ganz einfach. Siehe folgendes Minimalbeispiel:
Wie genau die Matrix A erzeugt wird, ist aber eigentlich auch zweitrangig. Das eigentliche Problem taucht nämlich jetzt auf: Was ich, ganz vereinfacht gesagt, brauche, ist eine Prozedur, die mir für jede Zeile der Matrix A das Maximum ermittelt und diesen Wert durch eine "1" ersetzt; alle anderen Werte der Zeile sollen gleich "0" gesetzt werden. Gibt es in einer Zeile mehr als ein Maximum, sollen diese Maxima durch 1/(Anzahl der Maxima) ersetzt werden; alle anderen Werte werden wieder gleich "0" gesetzt.
An Zeile 1 meiner Matrix A würde sich dann nichts ändern, da [0 0 1] zu [0 0 1] wird. Zeile 2 würde hingegen von [0 0.2 0.8] zu [0 0 1]. Interessant ist nun z.B. Zeile 13. Diese soll gemäß der beschriebenen Prozedur von [0.4 0.2 0.4] zu [0.5 0 0.5] werden.
Für eine geg. Zeile, im folgenden Beispiel v genannt, habe ich das folgendermaßen umgesetzt:
Ok, soweit so gut. Nun das Problem: Gebe ich die oben erzeugte Matrix A (bzw. einen Zeilenvektor v) per Hand ein, funktioniert alles genau wie ich es mir vorstelle. Sobald ich mir A aber "automatisch" erzeugen lasse, passiert z.B. in Zeile 13 folgendes: Ich erhalte nicht [0.5 0 0.5] sondern [1 0 0]. Eine einfache Abfrage
liefert nun auch, wie befürchtet, nicht "1" sondern "0". Obwohl also sowohl in Spalte 1 als auch in Spalte 3 eine 0.4 steht, ist der erste Wert größer als der 2.
liefert 5.5511e-17.
Ich weiß, dass ich beim Vergleich 2er numerischer Werte a und b mit abs(a-b)<eps arbeiten kann. Gibt es etwas ähnliches in Verbindung mit der Ermittlung des Maximums? Klar, ich könnte natürlich im Prinzip einfach alle Werte einer Zeile gemäß abs(a-b)<eps miteinander vergleichen. Dies wäre aber sehr aufwendig und umständlich. Vor allem da mein hier verwendetes Beispiel sehr einfach gestrickt ist und lediglich 3 Zahlen erzeugt, von denen jeweils das Maximum gefunden werden soll. Mein Code ist aber eigentlich so geschrieben, dass er auch für größere Zahlen funktioniert. Lasse ich mir z.B. 10 Zahlen erzeugen, hat meine Matrix A auch 10 Spalten und ich müsste mir dann für jede Zeile (9*9+9)/2 paarweise Vergleiche ansehen...
Ok, das war im wesentlich mein Problem. Sorry für die lange Beschreibung, aber ich habe mir Mühe gegeben, es so verständlich wie möglich zu erklären. Für jegliche Ideen und Lösungsvorschläge wäre ich sehr dankbar
|
|
|
|
|
Winkow |

Moderator
|
 |
Beiträge: 3.842
|
 |
|
 |
Anmeldedatum: 04.11.11
|
 |
|
 |
Wohnort: Dresden
|
 |
|
 |
Version: R2014a 2015a
|
 |
|
|
 |
|
Verfasst am: 24.11.2015, 17:34
Titel:
|
 |
|
|
AgentZero |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 12
|
 |
|
 |
Anmeldedatum: 06.06.12
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: R2015a
|
 |
|
|
 |
|
Verfasst am: 25.11.2015, 11:03
Titel:
|
 |
Hallo Winkow,
ja, genau sowas brauche ich! Jetzt wo ich es sehe, hätte man da vielleicht auch selber draufkommen können. Aber ist ja meistens so Auf jeden Fall nochmals vielen Dank für die schnelle Hilfe - echt klasse
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|