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

Index Exceeds Matrix Dimension (komplizierter Code)

 

r4nt4npl4n
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2011, 18:18     Titel: Index Exceeds Matrix Dimension (komplizierter Code)
  Antworten mit Zitat      
Hallo Leute,

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)

Code:
xmax = 20; ymax = 10;
f_domain = @(x,y) max(-x, max(-x-y, max(y-ymax, max(x-xmax, 0))));  % x+y-ymax
f_domain2 = @(x,y) max(-x, max(-x-y, max(y-2*ymax, max(x-2*xmax, 0)))); % x+y-2*ymax
% describes domain: x,y in domain iff f_domain(x,y)<=0

x = linspace(0,xmax,61);  
y = linspace(-xmax,ymax,91);
x2 = linspace(0,2*xmax,121);  
y2 = linspace(-2*xmax,2*ymax,181);
t = linspace(0,10,21);    
T = t(end); yend = y(end);
[X,Y] = meshgrid(x,y);  
Shape = ones(size(X));
Shape(f_domain(X,Y)>1e-6) = 0;
Xnew = X(f_domain(X,Y)<=1e-6);
Ynew = Y(f_domain(X,Y)<=1e-6);
X = Xnew; Y = Ynew;  

n = numel(X);


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
 


Jetzt kommt der Teil, wo der Fehler kommt:

Code:

X_resh = newreshape(X,Shape,0);
Y_resh = newreshape(Y,Shape,0);
time = 3;
figure
for iter=1:3
  subplot(2,2,iter)
  v_graph = newreshape(v_history(:,time,iter),Shape,0);
  surface(X_resh,Y_resh,v_graph,'LineStyle','none')
    xlabel('x'); ylabel('y')
  view(0,90)
end


wobei

Code:
Shape = ones(size(X));
v_history = zeros(n,tn,1);
tn = length(t)
t = linspace(0,10,21);
 


Also der Fehler "Index Exceeds Matrix Dimension" kommt hier
Code:
 v_graph = newreshape(v_history(:,time,iter),Shape,0);
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 Smile

Viele Grüße
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: 17.11.2011, 19:13     Titel:
  Antworten mit Zitat      
Hallo,

bitte poste die gesamte Fehlermeldung, inkl. Stack Information.

Das Problem scheint mir zu sein:
Dimension von v_history ist n x tn x 1 (warum auch immer du hier 1 nimmst).

Du indizierst dort mit
Code:
v_history(:,time,iter)


wobei iter von 1 bis 3 läuft, also ist der dritte Index zu groß.

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2011, 21:24     Titel:
  Antworten mit Zitat      
Danke für deine Antwort.

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 Confused

Zuletzt bearbeitet von r4nt4npl4n am 17.11.2011, 22:53, insgesamt einmal bearbeitet
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: 17.11.2011, 22:42     Titel:
  Antworten mit Zitat      
Hallo,

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?)

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 14.11.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.11.2011, 23:08     Titel:
  Antworten mit Zitat      
Hallo,

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)

V = default*ones(size(A));
wo = find(A>0);
Anew = A;  
if length(wo)~=length(v); error('v does not have same length as 1 in A'); end
       
for i=1:length(v)
    V(wo(i)) = v(i);
end

%%Row /column continuation

if nargin>3
  [an,am] = size(A);
  if strcmp(varargin{1},'contRow')
       
    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

  elseif strcmp(varargin{1},'contCol')

    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
   
  elseif strcmp(varargin{1},'contCompleteCol')
    [V,Anew] = newreshape(v,A,default,'contCol');
    v = V(Anew>0);
    while numel(v)<numel(A)
      [V,Anew] = newreshape(v,Anew,default,'contCol');
      v = V(Anew>0);
    end

  elseif strcmp(varargin{1},'contCompleteRow')
    [V,Anew] = newreshape(v,A,default,'contRow');
    v = V(Anew>0);
    while numel(v)<numel(A)
      [V,Anew] = newreshape(v,Anew,default,'contRow');
      v = V(Anew>0);
    end
   
  else
    error('Option not implemented');
  end
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.

Code:
subplot(2,2,4)
v_graph = newreshape(v_history(:,time,3)-v_history(:,time,1),Shape,0);


LG
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: 18.11.2011, 17:45     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
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.

Wäre denn folgendes sinnvoll?
Code:
v_history = zeros(n,tn,3);

statt
Code:
v_history = zeros(n,tn,1);


Grüße,
Harald
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.