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

Linearer Fit

 

Julia87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2014, 18:22     Titel: Linearer Fit
  Antworten mit Zitat      
Schönen Sonntag zusammen,

Auch zu Ostern bleiben die Matlab-Probleme nicht aus Smile

Ich habe eine Aufgabe bekommen, mittels angegebener Formel (hab ich angehängt) einen linearen Fit über N=30 Punkte von der Größe rho zu berechnen.

rho ist eine 800x300 Matrix, der linear Fit wird über die Zeilen, also die 800 Werte berechnet. Für A sollte am Ende wieder eine 800x300 große Matrix rauskommen. Das ganze sollte so berechnet werden, dass ich zB. die Punkte 1-30 nehme, daraus einen Koeffizienten mittels Least square fit bestimme, dann springe ich auf den nächsten Punkte und berechne mir den Koeffizienten für die Punkte 2-31 usw. Als Hinweis haben wir erhalten, dass die Vorgangsweise so ähnlich wie bei einem Gleitendem Mittel ist, man bekommt für einen gewisse Anzahl von Punkten einen Wert, geht dann einen Punkt weiter, bekommt wieder einen Wert ... und am Ende komme eine Kurve heraus. Leider muss ich gestehen, dass mir dieser Hinweise für die Programmierarbeit gar nicht weiterhilft.

Probiert hab ich das ganze jetzt mal so:

Code:

rho  %meine matrix 800x300


rho_mean =  13;
N = 30; %Anzahl der Punkte, die für den LSF herangezogen werden
dr = 0.55;
 
for ii = 1:size(rho,1);
    for jj = 1:size(rho,2);
        for kk = 1:N;
    zahler(ii,jj) = (rho(kk:kk+N,jj)-rho_mean)*((ii-((N+1)/2))*dr);
    nenner(ii,jj) = (1/6)*N*(N-1)*(N+1)*(dr)^2;
   A = cumsum(zahler)./nenner;
        end
    end
end

 


Ich hab mir überlegt eine Schleife mit über 3 Indexes zu machen. ii läuft über die 800 Zeilenwert, jj über die 300 Spaltenwerte und kk läuft von 1:30. Die Summe bilde ich dann am Schluss.
So ganz funktioniert das noch nicht. Die Fehlermeldung, die ich bekomme:

??? Subscripted assignment dimension mismatch.

Error in ==>
zahler(ii,jj) = (rho(kk:kk+N,jj)-rho_mean)*((ii-((N+1)/2))*dr);

Hoffe, dass mir von euch einer Helfen kann.

Frohe Ostern!

LG.
Julia

rho.png
 Beschreibung:

Download
 Dateiname:  rho.png
 Dateigröße:  7.38 KB
 Heruntergeladen:  186 mal


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.04.2014, 18:33     Titel:
  Antworten mit Zitat      
Hallo,

du versuchst einen Vektor einem Element einer Matrix zuzuweisen.

Warum nicht gleich
Code:
zahler(ii,jj) = sum( (rho(kk:kk+N,jj)-rho_mean)*((ii-((N+1)/2))*dr) );


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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2014, 19:25     Titel:
  Antworten mit Zitat      
Hallo Harald,

danke für deine schnelle Antwort.

Berechne die Summe jetzt gleich und hab cumsum in der untersten Zeile weggeben.
Leider dauert die Berechnung jetzt ziemlich lange. Ich habe mir eine Nullmatrix von A angelegt um Zeit zu sparen

Code:

A = zeros(size(rho,1),size(rho,2));

for ii = 1:size(rho,1);
    for jj = 1:size(rho,2);
        for kk = 1:N;
    zahler(ii,jj) = sum((rho(kk:kk+N,jj)-rho_mean)*((ii-((N+1)/2))*dr));
    nenner(ii,jj) = (1/6)*N*(N-1)*(N+1)*(dr)^2;
    A = zahler./nenner;
        end
    end
end

 


Gibts noch einen andere, einfachere Art, die unten angefügte Gleichung zu lösen? Mir fällt außer der Schleifen-Bildung kein anderer Weg ein, das Problem zu lösen.

LG.
Julia
 
Harald
Forum-Meister

Forum-Meister


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

die Schleife über kk ist in der Form sinnlos, da die Resultate jedes Mal überschrieben werden. Meines Erachtens ist diese Schleife überflüssig, da das ja in der Summe enthalten ist.
A wird übrigens auch ständig überschrieben.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2014, 21:41     Titel:
  Antworten mit Zitat      
Hallo,

okay. Die Schleife über kk hab ich jetzt weggeben. Wie arbeitet die Schleife für die Variable zahler genau? Fängt Matlab bei ii = 1 an und läuft die Variable rho von 1 bis 1+24 durch, führt die Berechnungen aus und geht dann in der Schleife für ii = 2 weiter?

Wie kann ich jetzt das Überschreiben vermeiden? Reicht es nicht aus, Indexes zu verwenden? Wenn ich bei A die Schleifenvariablen ii und jj angebe, bekomme ich eine Fehlermeldung:

??? Subscripted assignment dimension mismatch.

Error in ==>
A(ii,jj) = zahler./nenner;



Code:


for ii = 1:size(rho,1)-N;
    for jj = 1:size(rho,2);
        zahler(ii,jj) = sum((rho(ii:ii+N,jj)-rho_mean))*((ii-((N+1)/2))*dr);      
        nenner = (1/6)*N*(N-1)*(N+1)*(dr)^2;
        A(ii,jj) = zahler./nenner;
    end
end
 


Danke.
Julia
 
Harald
Forum-Meister

Forum-Meister


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

du kannst auch den Debugger verwenden, um den Code durchzugehen. Du möchtest wohl
Code:
A(ii,jj) = zahler(ii,jj)./nenner;


nenner könnte man auch einmalig berechnen und die Division ganz am Ende durchführen.
Vermutlich kann man auch die jj-Schleife weglassen mit
Code:
zahler(ii,:) = sum((rho(ii:ii+N,:)-rho_mean),2)*((ii-((N+1)/2))*dr);  


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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2014, 22:29     Titel:
  Antworten mit Zitat      
Hallo,

stimmt, den Nenner kann man aus der Schleife ziehen.


Code:

nenner = (1/6)*N*(N-1)*(N+1)*(dr)^2;
for ii = 1:size(rho,1)-N;
          zahler(ii,:) = sum((rho(ii:ii+N,:)-rho_mean),2)*((ii-((N+1)/2))*dr);  
         A(ii,:) = zahler(ii,:)./nenner;
end
 


Jetzt bekomme ich statt 300 spalten nur mehr 25. Das versteh ich jetzt gar nicht, wie kommt Matlab auf 25?

LG.
J
 
Harald
Forum-Meister

Forum-Meister


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

bitte ein reproduzierbares Beispiel.
Es ist für uns sonst unmöglich zu sagen, ob hier 25 Spalten herauskommen sollen und warum.

Hast du zahler vorbelegt?

Falls über die Zeilen gemittelt werden soll, ist bei sum das ",2" zuviel.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2014, 23:14     Titel:
  Antworten mit Zitat      
Hallo,

ich häng mal ein mat-file an, die Matrix hat in diesem Fall eine Größe von 896x360.

Code:

load('M_uncorr.mat')

rho_mean = nanmean(rho(:));
N = 24;
dr = 0.55;
 
nenner = (1/6)*N*(N-1)*(N+1)*(dr)^2;
for ii = 1:size(rho,1)-N;
    zahler(ii,:) = sum((rho(ii:ii+N,:)-rho_mean)*((ii-((N+1)/2))*dr));
    A(ii,:) = zahler(ii,:)./nenner;
end

 


Wenn ich die '2' weggebe, dann bekomme ich die richtige Spaltenanzahl.
Ich glaube, dass in der Formel noch irgendwo der Wurm drinn ist, ich weiß das bei der Bsp.Matrix dass das Ergebnis an einer bestimmten Stelle ca. bei 5 liegen soll, mit dieser Formel kommen Werte von 10^3 raus. Aber irgendwie steh ich gerade voll auf der Leitung und komm nicht drauf, wo genau der Fehler liegen könnte.

rho.zip
 Beschreibung:

Download
 Dateiname:  rho.zip
 Dateigröße:  35.96 KB
 Heruntergeladen:  180 mal
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.04.2014, 09:25     Titel:
  Antworten mit Zitat      
Hallo,

ein Fehler: die Summe in der Formel soll wohl das (ii - (N+1)/2) einschließen. Das macht der Code aber nicht.

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



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2014, 20:31     Titel:
  Antworten mit Zitat      
Hallo,

ich hab das ganze jetzt noch etwas anderes probiert und den teil der Matrix ausgeschnitten, um den es eigentlich gut, diese hat jetzt eine Größe von 109x51.

Die Mittelwertsberechnung hab ich jetzt auch anderes gemacht, und mir jetzt nicht mehr ein Mittel über die gesamte Matrix ausgerechnet, sondern, nur über die Zeilen, dass ich am Ende einen Vektor mit der Länge 1x51.


Code:

rho_mittel = mean(rho_vc);

N = 24;
nenner = (1/6)*N*(N-1)*(N+1)*0.25^2;

for jj = 1:size(rho_vc,1)-N;
    zahler(jj,:) = sum( (rho_vc(jj:jj+N,:)-rho_mittel*(jj-(N+1)/2) *0.25) );
    A(jj,:) = zahler(jj,:)./nenner;
end

 


da ich jetzt aber keinen Mittelwert-Wert abziehe sondern einen Vektor, bekomm ich immer die Fehlermeldung:

Error using ==> minus
Matrix dimensions must agree.

Error in ==>
zahler(jj,Smile = sum( (rho_vc(jj:jj+N,Smile-rho_mittel*(jj-(N+1)/2) *0.25) );

Wenn ich eine zusätzliche Schleife über die Länge von rho_mittel laufen lasse, bekomme ich immer den gleichen Wert raus. Wie müsste ich die Schleife richtig laufen lassen, dass der jeweilige Mittelwert abgezogen wird?

LG.
Julia
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 21.04.2014, 20:43     Titel:
  Antworten mit Zitat      
Code:
zahler(jj,:) = sum( (rho_vc(jj:jj+N,:)-rho_mittel*(jj-(N+1)/2) *0.25) );

du versuchst von einer 25x51 matrix
Code:
rho_vc(jj:jj+N,:)
eine 1*51 matrix
Code:
rho_mittel
abzuhiehen. das klappt halt nicht. ^^
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2014, 21:02     Titel:
  Antworten mit Zitat      
das es nicht klappt, weiß ich selber auch. Aber wie kann ich eine Schleife drüber basteln, dass es funktioniert, oder geht das in dieser Weise gar nicht?
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 21.04.2014, 21:12     Titel:
  Antworten mit Zitat      
klar geht das. du hast blos nicht gesagt was du erreichen willst. ich kann natürlich raten was du vorhast. . wenn du von jedem der 25 werte in den 51 spalten den entsprechenden mittelwert abzihen willst wäre eine lösung mit
Code:
einfach denke ich.
_________________

richtig Fragen
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.