ich arbeite zur Zeit mit einem ziemlich komplizierten Code. Es geht grob gesagt um die Lösung einer Quasi-Variationellen Ungleichung. Das Ganze besteht aus mehreren Files und ist ziemlich lang. Der Debugger läuft auch ordentlich durch bis er zum Graphenteil kommt. Ich veröffentliche den ganzen Code nur ungerne, da er mir privat weitergereicht wurde. Deshalb stelle ich hier erstmal nur die wichtigen Passagen rein. Es geht um den Fehler "??? Index Exceeds Matrix Dimension".
Ich weiß was das bedeutet, habe mich aber heute erfolglos um eine Lösung bemüht.
Erstmal wird ein Gitter erzeugt (wie gesagt, alles nur Ausschnitte)
Der Befehl "reshape" wird nun neu definiert und auf das Problem angepasst. Ich denke, dass der Fehler nicht hier liegt, deswegen erspare ich euch den Code und zeige euch nur die Beschreibung:
Code:
function[V,Anew] = newreshape(v,A,default)
%
% Returns the vector v reshaped in the form of A - % v Vector (or array) to be reshaped % A Matrix of 0,1 giving the shape (sum(A) = length(v)) % default Scalar value to put on 'non-defined' points where A=0 % Example: % newreshape(1:6,[1 1 1; 0 1 1; 0 0 1],0) = % 1 2 4 % 0 3 5 % 0 0 6
vor. Ich weiß, das ist alles ziemlich kompliziert und ich war mir die ganze Zeit auch unsicher, ob ich hier um Hilfe fragen soll. Aber ich versuchs mal, verlieren kann ich ja wenig bis nichts
Also der zeigt keine weitere Fehlermeldung an. Er rechnet halt verschiedene Schritte durch, im Command Fenster erscheint dann die jeweilige Elapsed Time und zusätzlich
Assigned 3721 new values (numel(X_orig)=3721).
Dein Tipp hat mir insofern weitergeholfen, dass ich mit
Code:
plot(2,2)
v_graph = newreshape(v_history,Shape,0);
surface(X_resh,Y_resh,v_graph,'LineStyle','none') xlabel('x'); ylabel('y') view(0,90) end
jetzt immerhin keinen Fehler bekomme und auch einen Plot erhalte. Leider reicht das nicht für meine Zwecke. Ich hab das Gefühl, dass nur eine Kleinigkeit fehlt, nur komme ich nicht darauf
Zuletzt bearbeitet von r4nt4npl4n am 17.11.2011, 22:53, insgesamt einmal bearbeitet
wenn du ein Programm laufen lässt, kommt immer die Zeilenangabe sowie der fehlerhafte Code.
Wenn man dir weiterhelfen soll, müsstest du sagen:
- was newreshape macht
- warum der Code "nicht reicht" (wie soll das Ergebnis aussehen? wie sieht es aus?)
also der Code für newreshape sieht folgendermaßen aus ( Beschreibung habe ich ja oben schon angehängt)
Code:
function[V,Anew] = newreshape(v,A,default,varargin) % V = newreshape(v,A,default) % V = newreshape(v,A,default,'contRow') % V = newreshape(v,A,default,'contCol') % [V,Anew] = newreshape(v,A,default,'contCol') % 'contRow', 'contCol': optional to extend function values from where A=1 % to adjacent points with A=0 either in the same row ('contRow') % or vertically % 'contCompleteRow', 'contCompleteCol': constant extrapolation horizontally % or vertically (recursive call)
VonRechts = A - [zeros(an,1) A(:,1:end-1)];
VonLinks = A - [A(:,2:end)zeros(an,1)];
[x,y]=find(VonRechts==-1);
for i=1:length(x)
V(x(i),y(i)) = V(x(i),y(i)-1);
Anew(x(i),y(i)) = 1;
end [x,y]=find(VonLinks==-1);
for i=1:length(x)
V(x(i),y(i)) = V(x(i),y(i)+1);
Anew(x(i),y(i)) = 1;
end
VonUnten = A - [zeros(1,am); A(1:end-1,:)];
VonOben = A - [A(2:end,:); zeros(1,am)];
[x,y]=find(VonUnten==-1);
for i=1:length(x)
V(x(i),y(i)) = V(x(i)-1,y(i));
Anew(x(i),y(i)) = 1;
end [x,y]=find(VonOben==-1);
for i=1:length(x)
V(x(i),y(i)) = V(x(i)+1,y(i));
Anew(x(i),y(i)) = 1;
end
elseifstrcmp(varargin{1},'contCompleteCol') [V,Anew] = newreshape(v,A,default,'contCol');
v = V(Anew>0);
whilenumel(v)<numel(A) [V,Anew] = newreshape(v,Anew,default,'contCol');
v = V(Anew>0);
end
elseifstrcmp(varargin{1},'contCompleteRow') [V,Anew] = newreshape(v,A,default,'contRow');
v = V(Anew>0);
whilenumel(v)<numel(A) [V,Anew] = newreshape(v,Anew,default,'contRow');
v = V(Anew>0);
end
Das Ergebnis durch meine obige Modifikation nützt mir nichts, da ich einen Iterations (konvergenz) Graphen brauche. Und beispielsweise könnte ich (wenn dieser blöde Fehler nicht wäre) auch Wertefunktionen anzeigen lassen, die die Differenz zwischen iter3 und iter1 anzeigt, also bspw.
Das Ergebnis durch meine obige Modifikation nützt mir nichts, da ich einen Iterations (konvergenz) Graphen brauche. Und beispielsweise könnte ich (wenn dieser blöde Fehler nicht wäre) auch Wertefunktionen anzeigen lassen, die die Differenz zwischen iter3 und iter1 anzeigt,
bitte bedenke bei deinen Beschreibungen, dass die Leser deine Anwendung nicht kennen. Ich werde aus deiner Beschreibung nicht schlau.
Bzgl. "blöder Fehler": wenn du in Richtung der dritten Dimension nur ein "Blatt" (als Erweiterung von Zeilen und Spalten) definierst, kannst du eben auch nur ein Blatt abfragen. Der Fehler mag dich zwar bei deiner Arbeit stören, ist aber absolut nachvollziehbar.
Anders gesagt: wenn du das dritte Blatt abfragen willst, musst du auch drei Blätter definieren.
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
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.