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

Der Doppelpunktoperator

 

bandchef
Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2011, 15:10     Titel: Der Doppelpunktoperator
  Antworten mit Zitat      
Code:

for m=1:5
    for k=1:5
        R(m,k)=2 * max( abs(X(:,m)-X(:,k)) ./ (X(:,m)+X(:,k)) );
    end;
end;
 



Hi Leute!

Ich hab ein Problem mit diesem Code. Mir ist hier der Doppelpunktoperator nicht ganz klar. Gehe ich richtig in der Annahme, dass der Doppelpunkt in der Adressierung der Matrix X so funktioniert:

In der ersten Iteration steht m=1 und k=1. Nun werden in der inneren Schleifen alle Zeilen der Matrix durchgegangen währen m und k nicht erhöht werden. Stimmt das so?
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.11.2011, 15:22     Titel:
  Antworten mit Zitat      
Hallo,

nicht die Zeilen, sondern die Spalten.
Innerhalb jeder Iteration ändern sich m und k nicht. Zunächst ist m = 1, und für k = 1 bis 5 wird R(m, k) berechnet. Dann dasselbe für m = 2 etc.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bandchef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2011, 15:34     Titel:
  Antworten mit Zitat      
Wenn ich nun in X diese Werte stehen hab:
Code:

    1.6460    1.6460    1.6460    1.6460    1.6460
   -1.1978   -1.1978   -1.1978   -1.1978   -1.1978
   -0.0732   -0.0732   -0.0732   -0.0732   -0.0732
    0.8267    0.8267    0.8267    0.8267    0.8267
   -2.8530   -2.8530   -2.8530   -2.8530   -2.8530
 

dann hab ich das so verstanden, dass er mir die 1. Spalte Minus der 1. Spalte dann elementweise durch 1. spalte + 1. spalte teilt. Da kommt doch dann zwangsweise 0 raus weil ich ja gleiche Werte voneinander abziehe!

Wenn nun die innere schleife, also k, um eins erhöht wird, rechnet er mir die 1.Spalte Minus der 2. spalte dann elementweise durch 1. spalte + 2. spalte. da komm aber dann immer noch nur 0 raus weil ich ja wieder gleiche Werte subtrahiere!



Die Lösungsmatrix die mit diesem Code rauskommt sieht übrigens so aus:
Code:

         0       0.0229         0       0.1457    0.0703
    0.0229         0       0.0229    0.1429    0.0613
         0       0.0229         0       0.1457    0.0703
    0.1457    0.1429    0.1457         0       0.1267
    0.0703    0.0613    0.0703    0.1267         0
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.11.2011, 16:22     Titel:
  Antworten mit Zitat      
Hallo,

wenn X genau diese Werte hat, ist dein Schluss richtig.
Wenn die Werte in X allerdings irgendwie errechnet wurden, kann es sein, dass die Werte nur auf 4 Stellen gerundet gleich erscheinen.

Steht über der Lösungsmatrix vielleicht noch ein 1e-0x * ... ?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bandchef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2011, 16:46     Titel:
  Antworten mit Zitat      
Ja!!!
Du hast Recht!!!

Wenn ich das Programm nun nochmal laufen lasse und in der Matrix X dann allerdings neue Werte stehen, dann steht vor der Lösungsmatrix R eine Potenz nämlich:
Code:
1.0e-009 *



Hm, jetzt hab ich verstanden warum ich mit "händischer Rechnung" nie auf die Werte der Lösungsmatrix gekommen bin. Ich konnte es nicht weil eben die Unterschiede der Werte erst bei größeren Nachkommastellen als vier auftreten! Ich konnte nie auf das richtige Ergebnis gekommen obwohl ich die "Algorithmus" der durch die beiden for-Schleifen ausgedrückt wird richtig analysiert habe! Ich darf also nicht mit den gerundeten bzw. abgeschnittenen Werten weiterarbeiten sondern muss die "echten" Werte aus der vorhergehenden Berechnung mit durchziehen!

Danke, das hat schon mal sehr geholfen!

Ich werde mich nochmal melden wenn ich den Algorithmus in "meine Lösung" übertragen habe und dann in der Tat die richtige Lösungsmatrix rauskommt!
Private Nachricht senden Benutzer-Profile anzeigen
 
bandchef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2011, 17:05     Titel:
  Antworten mit Zitat      
So, dann bin's ich nochmal!


Hier ist jetzt nun mein fertiger Code:

Code:
X = horzcat(v, w, x, y, z');
R = zeros(5,5)

for m = 1:5,
   
    for k = 1:5,
        R(m,k) = 2 * max( abs([X(:,m) - X(:,k)]) ./ ([X(:,m) + X(:,k)]));
    end
   
end;

disp(R);




Kleine Fragen dazu hab ich dennoch noch:

1.) In Matrix X stehen nun die "richtigen" nicht gerundeten/abgeschnitten Werte der vorhergehenden Berechnungen. Warum berechnet mir Matlab mehr Werte wenn ich die Lösungsmatrix vor den Iterationen der beiden for-Schleifen nicht auf eine 5x5-Nullmatrix definiert/beschränkt habe? Ich meine, normalerweise kann doch Matlab gar nicht mehr Werte berechnen weil das Ende der höchstmöglichen Iterationen ja mit 5 beschränkt ist!

2.) Wie kann man sich mit dem Befehl disp() eine oder mehrere Leerzeilen ausgeben lassen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.11.2011, 17:21     Titel:
  Antworten mit Zitat      
Hallo,

1) ich verstehe die Frage nicht. Ob du R vorbelegst oder nicht sollte im Ergebnis keinen Unterschied machen, außer es gab zuvor ein anderes R.
2)
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bandchef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2011, 17:29     Titel:
  Antworten mit Zitat      
Hm, ok. Ich kopiere dir nun unten mal den gesamten Code hinein:

Code:
clear; close all; format compact;


N = 250;

for n = 10:10:N
    A = randn(n,n);
    b = rand(n,1);
   
   
    %1. Methode
    tic;
    v = A\b;
    T(1,n/10) = toc;
   
   
    %2. Methode
    tic;
    w = inv(A) * b;
    T(2,n/10) = toc;
   
   
    %3. Methode
    tic;
    [L,U] = lu(A);
    x = U\(L\b);
    T(3,n/10) = toc;
   
   
    %4. Methode
    tic;
    [Q,R] = qr(A);
    y = R\(Q'*b);
    T(4,n/10) = toc;
   
   
    %5. Methode
    tic;
    k = 1;
    detZaehler = det(A);
    for k=1:1:n
        z(:,k) = det([A(:,1:k-1), b, A(:,k+1:n)])/detZaehler;
    end
    T(5,n/10) = toc;
   
end




%-> plot 1. - 5. Methode
% hold on;
% plot((10:10:N), T(1,Smile, 'b');
% plot((10:10:N), T(2,Smile, 'm');
% plot((10:10:N), T(3,Smile, 'c');
% plot((10:10:N), T(4,Smile, 'r');
% plot((10:10:N), T(5,Smile, 'g');



%-> plot 1. - 5. Methode
colors = 'bmcrg';
hold on;
for i=1:1:5
    plot((10:10:N), T(i,:), colors(i));
end



%-> Zeilensumme von Matrix T
disp('Zeilensumme(T) = ');
for i = 1:1:5
    Zeilensumme = sum(T(i,:));
    disp(Zeilensumme);
end



%-> Berechnung der relativen Abweichung
X = horzcat(v, w, x, y, z');
%R = zeros(5,5);

for m = 1:5
   
    for k = 1:5
        R(m,k) = 2 * max( abs([X(:,m) - X(:,k)]) ./ ([X(:,m) + X(:,k)]));
    end
   
end;

disp(R);


Bits = log2(R)
Dez = log10(R)
 



Wie du selber sehen kannst, benutze bzw. führe ich die Matrix R erst vor den beiden for-Schleifen ein. Ich habe auch gedacht, dass es keinen Unterschied machen sollte ob ich die Matrix R nun mit Nullen vorbelege oder nicht, aber wenn ich es nicht tue, dann bekomme ich unheimlich viele Ergebnisse ausgedruckt! Das verstehe ich nicht.

Ich soll nun bei einer letzten Aufgabe mit dem log2() und log10() (jeweils auf die Matrix R angewendet) bestimmen wie viel Bits bzw. Dezimalstellen in den Komponenten der Lösungsvektoren übereinstimmen. Das mache ich in den letzten beiden Zeilen. Wenn ich nun ein paar Werte händisch mit dem Taschenrechner ausrechne, bekomme ich auch wieder ganz andere Werte als das was mir Matlab da präsentiert... An was liegt das?

Gutes Beispiel:

Matlab: log2(0) = inf
Taschenrechner log2(0) = Mathematik Error => (ist ja auch logisch weil ein Logarithmus von 0 eben nicht geht...
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.11.2011, 19:35     Titel:
  Antworten mit Zitat      
Hallo,

du musst ein wenig genauer hinsehen: deine vierte Variante führt die QR-Zerlegung von A durch und speichert die eine Matrix in R.

Zu deinem Beispiel:
"Error" oder "Inf" oder "NaN" sind verschiedene Wege, um ein nicht endliches Ergebnis oder nicht berechenbares Ergebnis zum Ausdruck zu bringen - also nicht so unterschiedlich.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bandchef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2011, 19:52     Titel:
  Antworten mit Zitat      
Oh mein Gott! Ich muss in der Tat aufmerksamer werden! Danke nun ist es klar.

Auch die Sache mit inf usw. leuchtet ein.

Wie aber erklärt sich z.B. ein anderer Matlab-Wert von z.B. log2(0.3757) gegenüber dem log2(0.3757) auf meinem Taschenrechner? Das sind nicht gleich Ergebnisse!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.11.2011, 20:22     Titel:
  Antworten mit Zitat      
Hallo bandchef,

Zitat:
Wie aber erklärt sich z.B. ein anderer Matlab-Wert von z.B. log2(0.3757) gegenüber dem log2(0.3757) auf meinem Taschenrechner?

Dafür gibt es drei mögliche Erklärungen:
1. Du hast die Funktion log2 umdefiniert, z.B.
Code:

2. Der Taschenrechner ist kaputt.
3. Du verwendest ein ungewöhnliches Ausgabeformat in Matlab:
Code:
format hex
log2(0.3757)
% >>   bff698f9255034c3
format long g
log2(0.3757)
% >> -1.41234697890768

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.11.2011, 22:03     Titel:
  Antworten mit Zitat      
Hallo,

ich würde ein weiteres Problem vermuten. Wenn du in MATLAB als Ausgabe 0.3757 hast, dann kann das etwas zwischen 0.375650... und 0.375749... sein. Der gleiche Effekt, wie du ja auch schon festgestellt hast, dass in deinem X nicht alle Spalten gleich waren.
Um das analysieren zu können, müsste man wissen: was *genau* hast du in MATLAB eingegeben? Was kommt in MATLAB heraus, was auf deinem Taschenrechner?
Ich habe jedenfalls Zweifel, dass eine so elementare Operation in MATLAB nicht korrekt ist.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bandchef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2011, 15:33     Titel:
  Antworten mit Zitat      
Hallo!

Ich konnte mich jetzt leider ein paar Tage zu diesem Theman nciht melden. Ich hab jetzt versucht die Tips durchzführen:

Neue Frage:

Wie kann man sich in Matlab alle Stellen ausgeben lassen mit denen Matlab rechnet? Sprich ich möchte die Werte der Matrix X mit voller Stellenanzahl sehen. Geht das?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.11.2011, 15:37     Titel:
  Antworten mit Zitat      
Hallo,

Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
bandchef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.11.2011, 18:18     Titel:
  Antworten mit Zitat      
Großes Danke für eure Hilfe!

Ich bin dann mit der Aufgabe durch! Und sieht laut Lösung auch so aus, als ob sie richtig ist Smile

Danke!
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.