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

cell funktionen - lösch funktion

 

robertsss

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2016, 12:19     Titel: cell funktionen - lösch funktion
  Antworten mit Zitat      
Ich habe folgendes Problem: Ich habe eine Anzahl Ordner zum Beispiel 4. dann habe ich pro ordern zum Beispiel 4 Dateien. Im cell behalten stehen meine zahlen von 1-4 (wenn ich 4 Dateien pro Ordner habe) welche ich behalten will. Da kann stehen 1,3,[],[].(das gebe ich in eine Inputbox ein) ich nehme mit Datei die Nummer die ich behalten will raus also zuerst die 1 dann die 3. in x steht dann der String irgendwas mit 'Messung x'.

Dann überprüfe ich immer den string in x mit dem in Signale. Bei einer 1 also wenn er gleich ist soll nicht passieren. Bei nicht gleich soll er ihn aus Signale löschen.
In dem cell steht ja dann das Ergebnis vom stringcompare also da wo die 1 ist kann dieses Signal gelöscht werden. Das Ergebnis ist aber nur von dem 1 also was in x für 1 steht. Ich muss aber nicht nur die Datei 1 ich muss ja auch noch die Datei 3 behalten. Also wenn die Laufvariable m=2 wird hollt er die 3 aus behalten raus und ändert x und macht das ganze wieder und überschreibt damit die Ergebnisse in teilelöschen.



in files stehen wie viel Dateien pro Ordner drin sind. also jeweils 4,4,4,4.
Ich hoffe es ist klaar was ich vor habe, nur scheint mein Ansatz so nicht zu funktionieren, wie würdet ihr es machen? Ich weiss das die ganzen for schleifen es langsam machen, aber optimieren kann man es ja noch später, rein logisch funktioniert es ja nicht.
Hier ist mein code.
Code:

for k=1:anzahlOrdner      % im jeden Ordner soll die Datei X gelöscht werden
    for m=1:(files(k))      
        datei=str2double(behalten{1,m});
        x=signale{k,1}{datei,1};
             
        for n=1:(files(k))                  
            if 1==strcmp(x,signale{k,1}{n,1})
               
            else
                 teileLoeschen{n,1}=1
                signale{k,1}{(n),1}=[];
            end
        end


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.11.2016, 17:58     Titel: Re: cell funktionen - lösch funktion
  Antworten mit Zitat      
Hallo robertsss,

Ich kann der Erklärung nicht folgen.
Wieso meinst Du dass Dein Ansatz so nicht zu funktionieren scheint? Das wäre eine wichtige und praktische Information.
Du hast ganz recht, dass man den Code erst optimieren sollte, wenn er läuft, Aber das ist ein winziges Stück Code und FOR-Schleifen werden seit über 10 Jahren in Matlab effizient durch die JIT-Acceleration bearbeitet. Die Meinung, dass FOR-Schleifen an sich langsam sind, hält sich aber offenbar nich ein bisschen.

Bei "anzahlOrdner" weiß man sofort, welche Bedeutung die Variable hat. Bei "files", "x" oder "datei" ist das nicht so.
Der Kommentar "im jeden Ordner soll die Datei X gelöscht werden" hiolft dann weiter, wenn klar ist, was denn "Datei X" ist.

Wäre es praktischer für "behalten" einen Vektor zu verwenden, also statt "1,3,[],[]" einfach nur "[1, 3]"?

Unter "in x steht dann der String irgendwas mit 'Messung x'" kann ich mir nichts vorstellen.

Mir ist nicht klar, was von wo gelöscht werden soll.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
robertsss

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2016, 21:11     Titel:
  Antworten mit Zitat      
Ich habs versucht besser zu erklären. Ich habe diese arrays zum beispiel 4 und jeweils 4 unterarrays da steht Messung1-Messung4. In teilebehalten habe ich zum beispiel die zahl 1,3 stehen. Das heißt ich möchte aus dem Array signale die Zeile 2(Messung 2) und 4 (Messung 4) löschen.

Code:

signale{1,1}=cell(4,1)
signale{2,1}=cell(4,1)
signale{3,1}=cell(4,1)
signale{4,1}=cell(4,1)

signale{1,1}{1,1}='Messung 1'
signale{1,1}{2,1}='Messung 2'
signale{1,1}{3,1}='Messung 3'
signale{1,1}{4,1}='Messung 4'

signale{2,1}{1,1}='Messung 1'
% usw. in je 4 Ordnern sind 4 sstrings nach diesem Muster.

% so sieht teilebehalten wenn ich aus der inputbox der gui die werte
% rausholle. Ich gebe da zum Beispiel 1,3 ein. Kann aber auch 1,2,3,4
%
teilebehalten{1,1}='1'
teilebehalten{1,2}='3'
teilebehalten{1,3}=[]
teilebehalten{1,4}=[]

nFiles=length(signale{1,1})                                     % das steht für die anzahl der Dateien in den ordnern

for k=1:length(signale)                                           % im jeden Ordner soll die Datei X gelöscht werden
    for m=1:(nFiles(k))                                             % in jedem Ordner die Dateien löschen
        datei=str2double(teileBehalten{1,m});           % in teileBehalten steht aus einer inputbox die nummern die NICHT gelöscht werden sollen.
        if isnan(datei)~=1                                          %  den im Feld wo [] steht ist es ein NaN
            x=signale{k,1}{datei,1};                           % im ersten durchlaufe steht in x nun 'Messung 1'
            for n=1:(nFiles(k))                                      %  jedes Teilbehalten soll alle Zeilen von alleZeitsignale überprüfen.
                if 1==strcmp(x,signale{k,1}{n,1})        % hier wird nun überprüft op der string in x der selbe ist wie der in signale
                else
                    teileLoeschen{n,1}=1                        % hier möchte ich nun ein zell array wo an der Stelle 1 und stelle 3 [] steht. und an den stellen 2 und 4 eine 1.
                   
                   % alleZeitsignale{k,1}{(n),1}=[];          
                                                                            % Beziehungsweise das jetzt in allen Ordner
                                                                            % (signale{:,1}) der String Messung 1 und Messung 3
                                                                            % unangetastet bleibt aber Messund 2 und Messung 4 aus signale gelöscht wird.
                end
            end
        end
    end
end

 
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.11.2016, 22:58     Titel:
  Antworten mit Zitat      
Hallo robertsss,

Der Ansatz ist ganz schön kompliziert.
Die geschachtelten CELL-Arrays lassen meinen Kopf rauchen.
Code:
...
for k=1:length(signale)
  keep = str2double(teileBehalten{1,k});
  keep(isnan(keep)) = [];
  alleZeitsignale{k,1} = alleZeitsignale{k,1}(keep);
end

Ich habe es mal versucht zu entschlacken und statt der Schleifen die vektorisierte Form von von str2double verwendet.

Vielleicht reciht das schon als Tipp, obwohl ich nicht genau verstanden habe, was gelöscht werden soll.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
robertsss

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2016, 18:41     Titel:
  Antworten mit Zitat      
Danke dir deien Variante sieht doch schonmal besser aus. Ich versuche mal es etwas präziser zu erklären.


Code:

% Ich habe dieses Zell (hier erstelle ich es so) In meinemProgramm erstelle ich es durch ein Import und da steht da zum Beispiel statt Messung 1 was anderes drin, aber immer noch als char/text.

alleZeitsignale{1,1}{1,1}='Messung1'
alleZeitsignale{1,1}{2,1}='Messung2'
alleZeitsignale{1,1}{3,1}='Messung3'
alleZeitsignale{1,1}{4,1}='Messung4'

alleZeitsignale{2,1}{1,1}='Messung1'
alleZeitsignale{2,1}{2,1}='Messung2'
alleZeitsignale{2,1}{3,1}='Messung3'
alleZeitsignale{2,1}{4,1}='Messung4'

alleZeitsignale{3,1}{1,1}='Messung1'
alleZeitsignale{3,1}{2,1}='Messung2'
alleZeitsignale{3,1}{3,1}='Messung3'
alleZeitsignale{3,1}{4,1}='Messung4'

alleZeitsignale{4,1}{1,1}='Messung1'
alleZeitsignale{4,1}{2,1}='Messung2'
alleZeitsignale{4,1}{3,1}='Messung3'
alleZeitsignale{4,1}{4,1}='Messung4'


% außerdem lade ich aus einer Inputbox die Zahl 1 bis 4(in diesem Fall 4 da ich nur 4 Signale pro Ordner habe) ein. Das ist der Index also das was ich von alleZeitsignale behalten will. Wenn ich in die Inputbox eine 1,3 eingegeben habe sieht das cell-Array teilebehalten so aus:
teilebehalten{1,1}='1'
teilebehalten{1,2}='3'
teilebehalten{1,3}=[]
teilebehalten{1,4}=[]


Jetzt will ich nun das Messung 1 und 3, aus allen vier Ordnern behalten wird:
alleZeitsignale{1,1}{1,1}='Messung1'
alleZeitsignale{1,1}{3,1}='Messung3'

alleZeitsignale{2,1}{1,1}='Messung1'
alleZeitsignale{2,1}{3,1}='Messung3'

alleZeitsignale{3,1}{1,1}='Messung1'
alleZeitsignale{3,1}{3,1}='Messung3'

alleZeitsignale{4,1}{1,1}='Messung1'
alleZeitsignale{4,1}{3,1}='Messung3'

und die restlichen (Messung2, Messung4) mittels dem Befehl gelöscht werden:

 alleZeitsignale{1,1}{2,1}=[];
alleZeitsignale{1,1}{4,1}=[];

 alleZeitsignale{2,1}{2,1}=[];
alleZeitsignale{2,1}{4,1}=[];

 alleZeitsignale{3,1}{2,1}=[];
alleZeitsignale{3,1}{4,1}=[];

 alleZeitsignale{4,1}{2,1}=[];
alleZeitsignale{4,1}{4,1}=[];
 


Das ist alles was ich will halt automatisch in einer schleife/vektorisiert. Die Anzahl der alleZeitsignale{1,1}{1,1}='Messung1' muss nicht immer 4 sein es können auch 100 sein das finde ich aber durch ein lenght(). Ich dachte halte eine große Schleife für anzahl der Ordner, (hier 4) und schleife für anzahl der Messungen (hier 4)
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 15.11.2016, 10:27     Titel:
  Antworten mit Zitat      
Hallo robertsss,

Dann ändere ich meinen Code ein wenig:
Code:
keep = str2double(teilebehalten);
keep(isnan(keep)) = [];
for k=1:numel(alleZeitsignale)
  alleZeitsignale{k} = alleZeitsignale{k}(keep);
end

Das führt von den gezeigten Inputs zu den Outputs.

Viele Grüße, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
robertsss

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.11.2016, 12:54     Titel:
  Antworten mit Zitat      
Danke dir, nacher stehen ja nur Messung eins und unten drunter messung3. Ich bräuchte aber das die gelöschten Stelen wie ein leeres array sind also [] soll drin stehen bleiben. Also man soll mit einem Blick immer noch sehen wie viel Einträge drin waren.

alleZeitsignale{4,1}{1,1}='Messung1'
alleZeitsignale{4,1}{2,1}=[]
alleZeitsignale{4,1}{3,1}='Messung3'
alleZeitsignale{4,1}{4,1}=[]
 
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.