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

Bitte um Hilfe bei Logikfehler

 

^nina^
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.05.09
Wohnort: Muenchen
Version: ---
     Beitrag Verfasst am: 26.08.2009, 00:29     Titel: Bitte um Hilfe bei Logikfehler
  Antworten mit Zitat      
Hallo ich muss mal wieder nerven ^__^

Eure Hilfestellungen waren bis jetzt immer extrem gut und haben mir immer weiter geholfen (scheiss deutsch, ich weiss, aber ich bin auch schon Muede).

Nun habe ich wieder ein neues Problem, die for schleife an sich funktioniert - ich habs schon ausprobert.
Das Problem scheint sich auf die Beiden Gleichungen:

g(i,j) = G*(1./layer_depth{1,p})*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));

und

V=G*(1./(layer_depth{1,p}-layer_depth{1,k}))*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));

zu beziehen:

Matlab wirft mir immer die Fehlermeldung raus: Inner Matrix dimensions must agree...

Ich versteh das irgendwie nicht - in den Arrays stecken jeweils 22 Matrizen. Jede der Matrizen ist gleich gross, naehmlich 90x180, wo bitte kommt der Fehler her? Was habe ich falsch gemacht? Und wie kann man es richtig machen?
Koennte es vielleicht daran liegen wie ich die Arrays aufgebaut habe? Ganz unten poste ich noch schnell ein Beispiel wie ich das gemacht habe, dann koennt ihr Euch entweder ueber mich scheckig lachen, weil ich einen Anfaengerfehler gemacht habe, oder mit mir zusammen raetzeln was genau nicht stimmt... Ich hatte schon mehrere Probleme mit dieser Passage, alle hab ich loesen koennen, aber es scheint als wuerde hinter jeder Loesung ein neues Problem lauern...

Das ist der Code - veilleicht liegt es doch an der Schleife???

Code:
g(i,j)=0;
 for l = 1:180
      delta_theta(l) =theta(l)-theta(l+1);
      for m=1:360
          delta_phi(m) = phi(m)-phi(m+1);
            for i=1:90
                 for j=1:180
                      for p=1:22
                            g(i,j) = G*(1./layer_depth{1,p})*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));
                            for a=1:90
                                for b=1:180
                                    for k=1:22
                                    V=G*(1./(layer_depth{1,p}-layer_depth{1,k}))*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));
                                    end
                                end
                            end
                      end
                 end
            end
      end
 end


Das ist ein Beispiel dafuer wie ich die beiden Arrays aufgebaut habe:

Code:
layer_depth = cell(1,22);
layer_depth{1,1}= radi1;
layer_depth{1,2}= radi2;
layer_depth{1,3}= radi3;
layer_depth{1,4}= radi4;
layer_depth{1,5}= radi5;
layer_depth{1,6}= radi6;
layer_depth{1,7}= radi7;
layer_depth{1,8}= radi8;
layer_depth{1,9}= radi9;
layer_depth{1,10}= radi10;
layer_depth{1,11}= radi11;
layer_depth{1,12}= radius12;
layer_depth{1,13}= radius13;
layer_depth{1,14}= radius14;
layer_depth{1,15}= radius15;
layer_depth{1,16}= radius16;
layer_depth{1,17}= radius17;
layer_depth{1,18}= radius18;
layer_depth{1,19}= radius19;
layer_depth{1,20}= radius20;
layer_depth{1,21}= radius21;
layer_depth{1,22}= radius22;


Vielen Dank fuer Eure Gedult Smile

verzweifelte Gruesse,
Nina
Private Nachricht senden Benutzer-Profile anzeigen


tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 26.08.2009, 10:32     Titel:
  Antworten mit Zitat      
Hallo Nina,

wie groß sind denn die densities-Matrizen?

Außerdem bekommst Du sicher ein Problem bei p=22, denn dann ist layer_depth{1,p+1} nicht mehr definiert, oder hast Du da vorgesorgt?
Private Nachricht senden Benutzer-Profile anzeigen
 
tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 26.08.2009, 10:34     Titel:
  Antworten mit Zitat      
Noch eine Frage:

Wozu sind denn bitteschön die beiden Schleifen for a=1:90 und for b=1:180 ?
Diese Indices werden doch gar nicht angesprochen?
Private Nachricht senden Benutzer-Profile anzeigen
 
^nina^
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.05.09
Wohnort: Muenchen
Version: ---
     Beitrag Verfasst am: 26.08.2009, 13:40     Titel:
  Antworten mit Zitat      
Hallo,
die densities Matrizen sind ebenfalls 90x180 gross und der arry ist genauso aufgebaut wie der von layer_depth.

Ja, mit dem p+1 das waere auch noch so ein Problem...

Die Indizes a und b sind fuer das V - ich hab gestern abend vergessen sie da mit einzutragen, also es wuerde dann so in etwa aussehen V(a,b)=......

Liebe Gruesse
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.08.2009, 14:19     Titel:
  Antworten mit Zitat      
Die Fehlermeldung kommt vermutlich von mtimes und bedeutet dann, dass bei einer Matrixmultiplikation die inneren Dimensionen nicht übereinstimmen.

Bei einer Rechnung A*B*C*D*... würde ich einen Haltepunkt vor diese Zeile setzen und folgendes überprüfen:
size(A)
size(B)
size(C)
etc.

Die Spaltenanzahl von A muss mit der Zeilenanzahl von B übereinstimmen,
die Spaltenanzahl von B muss mit der Zeilenanzahl von C übereinstimmen, etc.

Damit sollte identifiziert werden können, wo genau das Problem liegt.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.05.09
Wohnort: Muenchen
Version: ---
     Beitrag Verfasst am: 26.08.2009, 14:58     Titel:
  Antworten mit Zitat      
Hm,
aber genau dafuer hab ich doch die Differenz der beiden Matrizen transponiert...
aber vielen Dank fuer den Hinweis Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.08.2009, 16:39     Titel:
  Antworten mit Zitat      
Ich kann mir nicht vorstellen, dass der Code das beabsichtigte tut, da die rechten Seiten in den Zuweisungen für g(i,j) und V(a,b) nicht von i, j bzw. a, b abhängen.
Zudem habe ich persönlich noch nie einen Fall gesehen, wo ein derartiges Ineinanderschachteln von 8 for-Schleifen notwendig oder sinnvoll war. Die innerste Schleife würde 180*360*90*180*22*90*180*22 = 8.231e+015 Mal durchlaufen. Dann mal viel Geduld Wink

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.05.09
Wohnort: Muenchen
Version: ---
     Beitrag Verfasst am: 27.08.2009, 00:26     Titel:
  Antworten mit Zitat      
Das problem ist das ich das Gravitationspotential von 180*90*22 Bloecken ausrechen muss und jeder Block wird nun mal durch alle anderen auch beeinflusst - der Einfluss mag gering sein je weiter weg der Block ist, aber er ist immernoch da. Deswegen sehe ich keinen anderen Weg als die Schleifen so zu bauen.

Mir ist schon klar das Matlab vielleicht nicht die passende Sprache ist um dieses Problem umzusetzen, aber es ist nun mal die einzige mit der ich wenigstens ein bisschen Erfahrung habe - minimalst - und Programmieren ist ohnehin nicht so meine Staerke, aber ich glaube ich hab durch dieses Projekt schon eine ganze Menge gelernt und bin da auch sehr stolz drauf. Die Sache ist nur die, da ich eben schon so weit vortgeschritten bin und auch nicht mehr so viel Zeit habe muss ich es einfach irgendwie mit Matlab hinbekommen.

Koennte ich die Schleifen vielleicht mit der eval() Funktion umgehen und das alles damit etwas beschleunigen? Aber leider werde ich aus dem was auf dem helpdesk steht ueber die eval() funktion nicht wirklich schlau... Und koennte diese Funktion vielleicht mein Problem loesen?
Private Nachricht senden Benutzer-Profile anzeigen
 
tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 27.08.2009, 11:18     Titel:
  Antworten mit Zitat      
Hallo,

hier 2 Punkte, die in Deinem Programm nicht richtig sein können:

1. Das Ergebnis sollte jeweils eine (90x180)-Matrix sein, richtig? In g(i,j) steht aber ein Skalar (Du initialisierst ja mit g(i,j)=0), und da gibt es sicher die Fehlermeldung "??? Subscripted assignment dimension mismatch." Probier's mal mit g{i,j} statt g(i,j).

2. Wie schon erwähnt, läuft p+1 bis 23, d.h. Du mußt entweder layer_depth bis 23 definieren oder diesen Fall anders behandeln.

Alles andere sollte stimmen - wenn auch nicht besonders effizient gelöst Shocked

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

Forum-Meister


Beiträge: 24.450
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 27.08.2009, 11:21     Titel:
  Antworten mit Zitat      
Hallo Nina,

das von mir beschriebene Problem der vielen Iterationen ist kein MATLAB-spezifisches, sondern ein konzeptionelles, das unabhängig von der Programmiersprache auftauchen wird.
Vielleicht können wir dir besser weiterhelfen, wenn du mal die Formeln zur Verfügung stellst, die du modellieren willst.

Viele Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
^nina^
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 16.05.09
Wohnort: Muenchen
Version: ---
     Beitrag Verfasst am: 27.08.2009, 14:43     Titel:
  Antworten mit Zitat      
Danke fuer die Tipps ich hab jetzt die initialisierung statt von Matrizen in arrys umgebaut (also mit den geschrweiften Klammern) und mit zeros(90,180) statt mit 0. Leider schmeisst es noch den selben Fehler raus....

Die Formel die ich versuche umzusetzen ist:

g{i,j}=G*1/r*Summe ueber die Dichte in jedem Kugelschalensegment* Volumen Kugelschalensegment

V{a,b,p}=G*1/(distanz vom in g{i,j} beobachteten Segment zu allen anderen jeweils) * Summe ueber die jeweilige dichte des Kugelschalensegments dessen Distanz zur g{i,j} betrachtet wird * Volumen dieses Kugelschalensegments

und letztendlich sollte es dann so aussehen:
Potential{i,j} = g{i,j} + V{a,b,p} + Potential{i,j}

Vielen Dank fuer Eure Hilfe ^__^

Im Moment sieht es so aus:

Code:
potential{i,j}=zeros(90,180);
 g{i,j}=zeros(90,180);
 V{a,b,k}=zeros(90,180,22);
 for l = 1:180
      delta_theta(l) =theta(l)-theta(l+1);
      for m=1:360
          delta_phi(m) = phi(m)-phi(m+1);
            for i=1:90
                 for j=1:180
                      for p=1:22
                            g{i,j} = G*(1./layer_depth{1,p})*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));
                            for a=1:90
                                for b=1:180
                                    for k=1:22
                                    V{a,b,k}=G*(1./(layer_depth{1,p}-layer_depth{1,k}))*densities{1,p}'*(4/3)*pi*((layer_depth{1,p}.^3)-(layer_depth{1,p+1}.^3))*(cos(delta_theta(l))*cos(delta_phi(m)));
                                    end
                                    potential{i,j}=g{i,j}+V{a,b,k}+potential{i,j};
                                end
                            end
                      end
                 end
            end
      end
 end


Viele Gruesse
_________________

Herr, gib mir Geduld - ABER PRONTO!!!!!
Private Nachricht senden Benutzer-Profile anzeigen
 
tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 27.08.2009, 16:23     Titel:
  Antworten mit Zitat      
Hallo,

noch eine letzte Zwischenfrage, bevor wird völlig aneinander vorbeireden: Sind die Größen radi1, radi2 usw. Skalare oder (90x180)-Matrizen?
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 - 2024 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.