WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Max und floating-point relative accuracy

 

AgentZero
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 06.06.12
Wohnort: ---
Version: R2015a
     Beitrag Verfasst am: 24.11.2015, 16:47     Titel: Max und floating-point relative accuracy
  Antworten mit Zitat      
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:

Code:

t=5;

s=1/t

A=zeros(1,3);

for i=0:1:t
    w_1=i*s;
    for j=0:1:(t-i)
        w_2=j*s;
        w_3=1-w_1-w_2;
        w=[w_1 w_2 w_3];
        A=[A;w];
    end
end

A=A(2:size(A,1),:);
 


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:

Code:

max_v=max(v);
    idx_max_v=zeros(1,3);
       
    for k=1:3
        if v(k)==max_v
            idx_max_v(k)=1;
        end
    end

v(1,:)=idx_max_v/sum(idx_max_v)
 


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

Code:

A(13,1)==A(13,3)
 


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.

Code:

abs(A(13,1)-A(13,3))


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 Smile
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 24.11.2015, 17:34     Titel:
  Antworten mit Zitat      
Code:
t=5;

s=1/t

A=zeros(1,3);

for i=0:1:t
    w_1=i*s;
    for j=0:1:(t-i)
        w_2=j*s;
        w_3=1-w_1-w_2;
        w=[w_1 w_2 w_3];
        A=[A;w];
    end
end

A=A(2:size(A,1),:);
maxA=max(A,[],2);
B=zeros(size(A));
for k=1:size(A,1)
    B(k,abs(A(k,:)-maxA(k))<eps)=1/sum(abs(A(k,:)-maxA(k))<eps);
end

sowas?
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
AgentZero
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 06.06.12
Wohnort: ---
Version: R2015a
     Beitrag Verfasst am: 25.11.2015, 11:03     Titel:
  Antworten mit Zitat      
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 Wink Auf jeden Fall nochmals vielen Dank für die schnelle Hilfe - echt klasse Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button 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.