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

Teile einer Cell unter bestimmten Bedienungen löschen

 

Giralsol1986
Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 08.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.11.2014, 17:01     Titel: Teile einer Cell unter bestimmten Bedienungen löschen
  Antworten mit Zitat      
Hallo,

ich habe einiges im Forum zum löschen von Teilen in Cell-Arrays gelesen (arrayfun usw.).

Was ich aber bisher nicht hinbekommen habe, sind Teile des Cell arrays zu löschen, wenn eine bestimmte Bedingung eintrifft:

Werte ist meine cell. Ich möchte dass wenn ein einzelner Eintrag in der Cell weniger als fünf Zeilen hat, gelöscht wird, ansonsten soll er einfach beibehalten werden.

Code:
for i = 1:length(werte); % bei length gibt er mir die korrekte Länge aus
    if length(werte{i})<5;
        werte(i) = [];  
    else
        werte(i) = werte(i)
    end
end


Werte schaut folgendermaßen aus:
werte =

[ 56x2 double]
[ 118x2 double]
[ 33x2 double]
[ 181x2 double]
[ 315x2 double]
[ 436x2 double]
[ 57x2 double]
[ 3x2 double]
[ 200x2 double]
[ 52x2 double]
[ 2x2 double]
[ 160x2 double]
[1913x2 double]
[1903x2 double]
[ 2x2 double]
[ 51x2 double]
[ 115x2 double]
[ 42x2 double]
[ 118x2 double]
[ 278x2 double]
[ 391x2 double]
[ 2x2 double]
[ 68x2 double]
[3815x2 double]
[ 4x2 double]

und alle die kleiner als 5x2 double sind, sollen raus.
Allerdings bekomme ich folgender Fehlermeldung, die sich mir nicht erklärt:
Index exceeds matrix dimensions.

Matlab generiert mir eine neue Cell ohne die entsprechenden Einträge, aber dann kommt eine Fehlermeldung. Ich denke, das problem ist, das die Cell innerhalb der Schleife kleiner wird und dann i nicht mehr bis zum Ende laufen kann. Kann man das irgendwie abfangen?
Danke für jede Hilfe oder Idee!
Private Nachricht senden Benutzer-Profile anzeigen


Yvonne
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 31.07.14
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 12.11.2014, 17:55     Titel:
  Antworten mit Zitat      
Hallo,

Dein Code ist an und für sich korrect.
Aber wenn Du in der for-Schleife Zellen des Cell Arrays löschst, wärend der Index weiter anwächst, kann es sein das das Cell Array iregndwann kürzer ist als der Index den Du versuchst aufzurufen. Daher erhältst Du die Fehlermeldung "Index exceeds matrix dimensions."

Mein Vorschlag:
Code:

% Create an example cell array
werte = cell(5,1);
werte{1} = zeros(6,2);
werte{2} = zeros(3,2);
werte{3} = zeros(7,2);
werte{4} = zeros(3,2);
werte{5} = zeros(8,2);

% Preallocate logical
isTooShort = false(size(werte));

for i = 1:length(werte); % bei length gibt er mir die korrekte Länge aus
    if length(werte{i})<5;
        isTooShort(i) = true;
    end
end

% Cell array with cells of the correct length
werte(~isTooShort)
 


Anstelle der for-Schleife kannst Du aber auch cellfun verwenden:
Code:

isTooShort = cellfun(@(x) length(x)<5, werte);
 



LG, Yvonne
Private Nachricht senden Benutzer-Profile anzeigen
 
Giralsol1986
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 6
Anmeldedatum: 08.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.11.2014, 11:06     Titel:
  Antworten mit Zitat      
Ok, das hatte ich mir schon gedacht. Ich habe es jetzt so gelöst:

for i = 1:length(werte); % bei length gibt er mir die korrekte Länge aus
if length(werte{i})<5;
werte{i}= [];
end
end

werte(cellfun(@isempty,werte)) = []

Die Stellen kleiner fünf, werden erst leergemacht, dann wird es nicht kürzer und ganz am Ende schmeiße ich die leeren Stellen dann raus mit cellfun.

Ich wusste nicht, dass ich am Ende die fortschleife ganz weglassen kann und es mit cellfun funktioniert. Danke für den Tipp.
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.