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

Wo ist der Fehler in der Formel?

 

DPA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2013, 15:15     Titel: Wo ist der Fehler in der Formel?
  Antworten mit Zitat      
Hallo allerseits,
ich bin recht neu in Matlab und versuche gerade eine Formel in Matlab zu realisieren.



Ich möchte die Matrix r erhalten.
Die einzelnen Werte erhält man indem man sie mit der darüberstehenden Formel ausrechnet. Diese Formel muss ich programmieren, allerdings komme ich momentan nicht weiter und ich bin mir auch recht sicher, dass ich es das einem sehr umständlichen Weg mache, deshalb bitte ich um Tipps zur optimierung. Das ganze soll so schnell wie möglich gerechnet werden.

Was ich bisher habe:
Code:

        for i = 0:255
            speicherOffset = 1;
            oben = 0;
            unten1 = 0;
            unten2 = 0;
           
     
           for j = 1:T
               
                             
                %===========1==============
                for d = 1 : D
                   
                    x1 = double(hypHW(d,i+1))-double(mean(hypHW(:,i+1)));
                    x2 = double(Traces(d,j))-double(mean(Traces(j,:)));   %***
                    oben =  oben + (x1*x2);
                                   
                    speicherOffset = speicherOffset + 1;
           
                end
                 %============2===============
                 for d = 1 : D
               
                    unten1 = (double(hypHW(d,i+1))-double(mean(hypHW(:,i+1))))^2;
                   
                    speicherOffset = speicherOffset + 1;
           
                 end
                 %=========3==========
                  for d = 1 : D
               
                    unten2 = (double(Traces(d,j))-double(mean(Traces(j,:))))^2;
                 
                    speicherOffset = speicherOffset + 1;
           
                  end
                 
                 
                  r(i+1,j) = oben / sqrt( unten1*unten2);
           
                                                     
            end
         
       
        end
       


Momentan geh ich so vor, dass ich erstmal den Teil über dem Bruchstrich berechnet (oben), dann die beiden Teile unter dem Bruchstriche (unten1 und unten2)

Diese rechne ich dann am Ende zusammen um so auf die Matrix r zu kommen.

D ist 1000
T ist 100000
K ist 256

Traces entspricht der Matrix t im Bild und ist 1000x100000 groß
hypHW entspricht der Matrix h im Bild und ist 1000x256 groß
r ist 256x100000 groß.

Momentan habe ich einen Fehler in der Zeile mit dem Kommentar "***" Hier kommt "??? Index exceeds matrix dimensions." Allerdings verstehe ich nicht warum.

Gibt es sonst noch Optimierungsmöglichkeiten die das ganze schneller und vor allem übersichtlichen machen?

Danke schonmal und Gruß

PS.: Das ganze soll übrigens der Korrelationskoeffizient sein. Es gibt zwar mehrere fertige Funktionen die diesen berechnen, allerdings weiss ich nicht wie ich da die Parameter für meinen Fall richtig eingebe, falls das überhaupt geht. Das würde das ganze jedenfalls ziemlich einfacher machen.


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2013, 22:42     Titel:
  Antworten mit Zitat      
warum schreibst Du Traces(j,:) und nicht Traces(:,j) ?
double ist in 99.9% der Fälle (chars mal ausgenommen) überflüssig, weil Matlab defaultmäßig mit doubles rechnet, es sei denn Du gibst explizit etwas anderes an.

ungetestet:
Code:

% Abweichung vom Spaltenmittelwert
dhyp = hypHW-repmat(mean(hypHW,1),[size(hypHW,1) 1]);
dtrac = Traces-repmat(mean(Traces,1),[size(Traces,1) 1]);

% Quadratsumme über Zeilen:
qhyp = sum(dhyp.^2,2);
qtrac = sum(dtrac.^2,2);

oben = dhyp * dtrac';
unten = sqrt(qhyp * qtrac');
r = oben./unten;
 


Wenn es nicht auf anhieb funktioniert, trotzdem versuchen zu verstehen.
Private Nachricht senden Benutzer-Profile anzeigen
 
DPA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.01.2013, 14:45     Titel:
  Antworten mit Zitat      
Ok danke schonmal,

Ja stimmt, das mit Traces war ein Fehler.

Zu dem Double.
In der Zeile
Code:
 x1 = double(hypHW(d,i+1))-double(mean(hypHW(:,i+1)));

hab es hier ohne double immer Probleme. Eine zahl wurde zu double konvertiert, die andere zu int. Und die linke Seite, das x1, war auch Int. Das führte zu falschen Ergebnissen.

Danke schonmal
 
DPA

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2013, 13:29     Titel:
  Antworten mit Zitat      
Hier ist schon das erste Problem:

wenn Zeile
Code:
dhyp = hypHW-repmat(mean(hypHW,1),[size(hypHW,1) 1]);

ausgeführt wird, kommt immer
"??? Error using ==> minus
Integers can only be combined with integers of the same class, or scalar doubles."
 
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.