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

Matrix Out of range-Problem beim Löschen von Zeilen aus Cel

 

mat_macs
Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 27.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2013, 20:05     Titel: Matrix Out of range-Problem beim Löschen von Zeilen aus Cel
  Antworten mit Zitat      
Hallo liebe Community,

ich nutze derzeit meine freie Zeit um besser mit Matlab umgehen zu lernen. Ich habe dabei ein Problem mit dem Löschen von Zeilen aus einem Cell-Array.
Eigentlich geht dies ja ganz einfach mit z.B.

A(2,:) = []

Jedoch lasse ich das bei mir in einer while-Schleife laufen, wobei die Probleme auftreten. Ich möchte aus einem vorhandenen Cell-Array nur die Zeilen behalten, in denen in der dritten Spalte ein String "Sonntag" steht. Das funktioniert zunächst auch gut, wenn der otherwise-Term auskommentiert ist. Dann macht Matlab aber lauter leere Arrays ( [] )in die restlichen Zeilen. Diese möchte ich mit nachfolgendem Code eigentlich löschen. Dabei kommt jedoch die Meldung "Matrix index is out of range for deletion". Seltsamerweise hat Matlab kein Problem, wenn ich otherwise A(m,:) = cellstr('0') haben möchte. Das funktioniert alles prima. Nur löschen kann er nicht. Dann kommt die Fehlermeldung.

otherwise
A (m,:) = [];

Warum tritt dieses Indexproblem auf?
Vielen Dank für eure Antworten.

Viele Grüße,
mat_macs

Die gesamte while-Schleife sieht so aus:

Code:


while m <= 365      
      x = Plan{m,1}(1,1);
      n = mod(x,3);

      o = Plan{m,3}(1,:);
     
      switch n
          case 0
              Plan(m,4)=Bew(3,1);  
             
          case 2    
              Plan(m,4)=Bew(2,1);  
         
          otherwise
              Plan(m,4)=Bew(1,1);  
      end
     
      %%% Nur die jeweils neu begonnenen KW auflisten %%%

            switch o
                case 'Sonntag'
                     Plan_2013(m,:) = Plan(m,:); % Funktioniert!
         
                otherwise
                    Plan_2013(m,:) = [];  % cellstr('0') funktioniert aber
            end
     
      m = m+1;
end

 
Private Nachricht senden Benutzer-Profile anzeigen


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.01.2013, 21:16     Titel:
  Antworten mit Zitat      
Hallo,

in solchen Fällen ist es hilfreich, die Dimensionen der beteiligten Variablen zu kennen.
Insbesondere: Existiert Plan_2013 vor der Schleife?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 27.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2013, 21:24     Titel:
  Antworten mit Zitat      
Hallo Harald und danke für deine Antwort,

edit: habe Plan_2013 mit

"Plan_2013 = cell(52,4)" preallocated, aber es kommt dennoch die gleiche Fehlermeldung.

Ansonsten ist es wie folgt: Plan ist eine 365x4 Cell. Da Plan_2013 nur alle 7 Ereignisse, also immer wenn Sonntag ist, die Zeile von Plan erfassen soll, soll Plan_2013 sozusagen eine 52x4 Cell werden.

Gruß,
mat_macs

edit II: Im angehängten Bild ist zu erkennen, was durch "case o = 'Sonntag' " entsteht. Nun sollen quasi alle Zeilen mit den eckigen Klammern gelöscht werden.

Bildschirmfoto 2013-01-20 um 20.30.49.jpg
 Beschreibung:

Download
 Dateiname:  Bildschirmfoto 2013-01-20 um 20.30.49.jpg
 Dateigröße:  57.68 KB
 Heruntergeladen:  513 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
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.01.2013, 21:48     Titel:
  Antworten mit Zitat      
Hallo,

schau dir doch mal das ganze im Debugger an.

Damit das, was du meinst, funktionieren kann, müsstest du Plan_2013 mit 365 Zeilen initialisieren. Das Problem wird aber auch dann sein, dass du Zeilen entfernst und sich dadurch der Index verschiebt.

Vielleicht wäre es sinnvoller, für Plan_2013 einen separaten Index zu verwenden und den nur dann hochzuzählen, wenn was geschrieben wird.

Am besten wäre es natürlich, mit Logical Indexing zu arbeiten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 27.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2013, 23:27     Titel:
  Antworten mit Zitat      
Hallo Harald,

du hast mich mit dem logical indexing jetzt ganz schön ins Schwitzen gebracht. Ich muss gestehen, ich konnte es leider nicht umsetzen. Ich scheitere dabei an der Tatsache, dass ich Cells vorliegen habe, in denen Strings abgespeichert sind. Hast du dafür einen Vorschlag?

Aber ich habe es jetzt anders lösen können, indem ich eine weitere Laufvariable definiert und diese für eine if-Abfrage benutzt habe. Dennoch herzlichen Dank für deine Anregung.

Einen schönen Abend euch noch.

Beste Grüße,
mat_macs

edit: Durch die Laufvariable p muss Plan_2013 nicht mit 365 Zeilen vorbelegt (preallocated) werden, sondern nur mit 52. Dadurch wird auch das von Harald angesprochene Indexierungsproblem vermieden.

Code:


m = 1;
p  = 1;

while m <= 365      
      x = Plan{m,1}(1,1);
      n = mod(x,3);

      o = Plan{m,3}(1,:);
     
      switch n
          case 0
              Plan(m,4)=Bew(3,1);  
             
          case 2    
              Plan(m,4)=Bew(2,1);  
         
          otherwise
              Plan(m,4)=Bew(1,1);  
      end
     
      %%% Nur die jeweils neu begonnenen KW auflisten %%%

            switch o
                case 'Sonntag'
                     Plan_2013(m,:) = Plan(m,:); % Funktioniert!
         
                otherwise
                    Plan_2013(m,:) = [];  % cellstr('0') funktioniert aber
            end
     
           if strcmp(o,'Sonntag')
              Plan_2013(p,:) = Plan(m,:);
              p = p + 1;
           end

      m = m+1;
end

 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 21.01.2013, 00:01     Titel: Re: Matrix Out of range-Problem beim Löschen von Zeilen aus
  Antworten mit Zitat      
Hallo mat_macs,

Zitat:
Ich möchte aus einem vorhandenen Cell-Array nur die Zeilen behalten, in denen in der dritten Spalte ein String "Sonntag" steht.

Das geht mit einer Zeile und ohne Schleife:
Code:
C = C(strcmp(C(:, 3), 'Sonntag'), :)


Bitte poste immer eine vollständige Kopie der Fehlermeldung, vorallem die Zeile, die den Fehler verursacht.

Mir ist nicht klar, was das Programm erreichen soll. Was ist Plan_2013 und wieso löschst Du daraus Elemente? Den Versuch mit "A(m,:) = cellstr('0')" wird mir auch nicht klar: Soll die Zeile mit Kopien des Strings '0' gefüllt werden?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
mat_macs
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 26
Anmeldedatum: 27.09.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2013, 00:39     Titel:
  Antworten mit Zitat      
Hallo Jan,

also das Programm soll wie gesagt in erster Linie mein Matlabverständnis verbessern. Dazu habe ich mir den Putzplan meiner WG genommen, diesen aus einer xls-Tabelle eingelesen und dann weiter verarbeitet. Die switch-Verzweigung in der while-Schleife setzt in Abhängigkeit von m den Putzenden aus einer Menge von 3 Bewohnern in die Putzplanliste. Da diese Liste aber für jeden Tag im Jahr eine Zeile hat, wollte ich ZUM ÜBEN halt nur diese extrahieren, in denen eine neue KW beginnt. (Die beginnt in der Exceltabelle dummerweise immer sonntags.)

Die vollständige Fehlermeldung war, wie im ersten Post geschrieben:
"Matrix index is out of range for deletion" und trat in der Zeile nach otherwise auf.
Code:
otherwise
              Plan(m,4)=Bew(1,1);  


Die Fehlermeldung trat jedoch nicht auf, wenn ich probehalber bei otherwise die leeren Arrays mit Nullen befüllt habe.
Zitat:
Den Versuch mit "A(m,Smile = cellstr('0')" wird mir auch nicht klar: Soll die Zeile mit Kopien des Strings '0' gefüllt werden?
Genau das sollte es, um herauszufinden, welches Problem vorliegt.

Ich habe in meinem letzen Post dann im Eifer des Gefechts vergessen, die otherwise - Anweisung zu löschen, da ich diese durch die if-Schleife nicht mehr brauchte. Aber so wie du es geschrieben hast, geht es freilich auch. Wenn ich es richtig sehe, habe ich das ja quasi auch geschrieben, nur dass ich es mit dem Vektor o gemacht habe.

Also so wie nachfolgend läuft es jetzt bei mir fehlerfrei und macht das, was ich wollte. Es ist ja auch nur zum üben.

Danke für eure Hinweise!

Code:


m = 1;
p  = 1;

while m <= 365      
      x = Plan{m,1}(1,1);             % KW-Zahl ermitteln
      n = mod(x,3);                       % um nach dem 3. Bew. wieder mit dem 1. anzufangen

      o = Plan{m,3}(1,:);             % in Plan ermitteln, wann "Sonntag" ist
     
      switch n
          case 0
              Plan(m,4)=Bew(3,1);  
             
          case 2    
              Plan(m,4)=Bew(2,1);  
         
          otherwise
              Plan(m,4)=Bew(1,1);  
      end
     
      %%% Nur die jeweils neu begonnenen KW auflisten %%%

            switch o
                case 'Sonntag'
                     Plan_2013(m,:) = Plan(m,:); % erzeugt ein Cell-Array wie im Anhang von Post #3
            end
     
            if strcmp(o,'Sonntag')
               Plan_2013(p,:) = Plan(m,:);
               p = p + 1;
            end

      m = m+1;
end

 
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.