Verfasst am: 20.01.2013, 20:05
Titel: Matrix Out of range-Problem beim Löschen von Zeilen aus Cel
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.
"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.
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.
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.
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?
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.
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, = 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
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.