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

in jeder Cell eines Cell-Arrays löschen

 

kuchenbäcker
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2015, 10:44     Titel: in jeder Cell eines Cell-Arrays löschen
  Antworten mit Zitat      
Hallo zusammen,

ich habe ein 1x77 Cell Array. In der letzten Cell (77) steht die Uhrzeit als double. Ich habe noch ein weiteres Cell Array(1x14). Hier ist in der vierten Cell ebenfalls eine Zeit als double.

Das erste Array möchte ich jetzt anhand des zweiten eingrenzen. Sprich, ich nehme den ersten Wert des zweiten Arrays und nehme nur die Werte des ersten Arrays größer als dieser Wert. Genauso verfahre ich mit dem letzten Wert.

Code:

Messdaten_neu=Messdaten_1{1,77}(:,1) > Messdaten_2{1,4}(1,1) & Messdaten_1{1,Messdaten_77}(:,1) < Messdaten_2{1,4}(end,1);
 


Damit bekomme ich die neue Variable Messdaten_neu mit der Größe ( in meinem Fall 4500) 4500x1 logical.

Wie schaffe ich es jetzt das erste Array (Messdaten_1) so zu kürzen, dass in jedem der 77 Cells nur noch die gesuchten Werte stehen?

Habe ich mich halbwegs verständlich ausgedrückt? Smile

Danke schonmal
Kuchenbäcker
Private Nachricht senden Benutzer-Profile anzeigen


kuchenbäcker
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2015, 10:57     Titel: erster Schritt
  Antworten mit Zitat      
Ich habs jetzt mal so versucht, aber das ist noch nicht zielführend.

Code:

Messdaten_neu=cellfun(@(d) 1{1,77}(:,1) > Messdaten_2{1,4}(1,1) & Messdaten_1{1,77 < Messdaten_2{1,4}(end,1),Messdaten_2,'UniformOutput',false);
 


Damit schreibt er mir nur 77 mal die Variable Messdaten_neu in mein Array. Ich hätte aber gerne, dass er das nicht da reinschreibt, sondern quasi damit multipliziert und dann die Zeilen mit 0 löscht. Geht das irgendwie?
Private Nachricht senden Benutzer-Profile anzeigen
 
kuchenbäcker
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2015, 11:33     Titel: weiterer Schritt
  Antworten mit Zitat      
nochmal hallo,

ich hab das jetzt erstmal über eine Schleife gemacht. damit bleibt mir quasi nur der gesuchte Bereich. Alles andere wird mit 0 gefüllt.

Code:

for i=1:1:77
    for j=1:1:size(Messdaten_2{1,1},1)
           if (Messdaten_2{1,77}(j,1) > Messdaten_1{1,4}(1,1) & Messdaten_2{1,77}(j,1) < Messdaten_1{1,4}(end,1))
            Messdaten_neu{1,i}(j,1)=Messdaten_2{1,i}(j,1);
           else
             Messdaten_neu{1,i}(j,1)=0;
           end
    end
end
 


2 Probleme habe ich damit. Wie kann ich jetzt alle Zeilen löschen mit 0? Und kann man das ganze einfacher machen? Also ohne Schleife? Irgendwie mit cellfun?

Danke schonmal!
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: 16.04.2015, 14:04     Titel: Re: weiterer Schritt
  Antworten mit Zitat      
Hallo kuchenbäcker,

Wäre das schon eine Vereinfachung:

Code:

index = (Messdaten_2{77} > Messdaten_1{4}(1) & ...
              Messdaten_2{77} < Messdaten_1{4}(end));
for i = 1:77
  Messdaten_neu{i} = Messdaten_2{i}(index);
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
kuchenbäcker
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2015, 11:20     Titel: danke!
  Antworten mit Zitat      
super, vielen Dank, das hat funktioniert und sieht viel einfacher aus als das, was ich produziert habe Wink


Ich stell das einfach mal noch weiter hier, bevor ich ein weiteres Thema aufmache.

Gibt es eine Möglichkeit, die folgende Zeile etwas schneller zu machen?

Code:

Messdaten_Keyence{1,4}=datenum(strcat(num2str(Messdaten_unformatiert{1,4},'%02d'),':', num2str(Messdaten_unformatiert{1,5},'%02d'), ':',num2str(Messdaten_unformatiert{1,6},'%02d'),'.', num2str(Messdaten_unformatiert{1,7},'%03d')),'HH:MM:SS.FFF');
 


Reicht der Code? oder benötit ihr noch mehr?


Danke schonmal!!!

Gruß
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: 20.04.2015, 13:30     Titel: Re: danke!
  Antworten mit Zitat      
Hallo kuchenbäcker,

Zitat:
Gibt es eine Möglichkeit, die folgende Zeile etwas schneller zu machen?

Ja.

Code:
Messdaten_Keyence{1,4} = datenum(sprintf('%02d%02d%02d%03d', Messdaten_unformatiert{1, 4:7}), 'HH:MM:SS.FFF');

Auf der anderen Seite ist es ein Umweg aus den Zahlen zunächst Strings zu machen, die von DATENUM dann wieder in eine Zahl verwandelt werden. Wie wäre dies:
Code:
Messdaten_Keyence{1,4} = [Messdaten_unformatiert{1, 4:7}] * [3600; 60; 1; 0.001]) / 86400;

Ich kann es gerade nicht testen, aber es umgeht die zweifache Umwandlung zwischen Zahlen und Strings und statt in DATENUM wird die Berechnung direkt durchgeführt.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
kuchenbäcker
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.04.2015, 13:43     Titel:
  Antworten mit Zitat      
bin gleich mal den zweiten Teil angegangen, also

Code:

Messdaten_Keyence{1,4} = ([Messdaten_unformatiert{1, 4:7}] * [3600; 60; 1; 0.001]) / 86400;
 


dabei kommt folgende Fehlermeldung

Code:

Error using  *
MTIMES is not fully supported for integer classes. At least one input must be scalar.
To compute elementwise TIMES, use TIMES (.*) instead.
 


Wenn ich jetzt
Code:

verwende, dann kommt folgende Fehlermeldung

Code:

Error using  .*
Integers can only be combined with integers of the same class, or scalar doubles.
 


p.s.:
Ich hab den ersten Teil auch noch versucht, jedoch bekomme ich dann folgende Fehlermeldung:

Code:

Error using datenum (line 178)
DATENUM failed.

Error in Einlesen_Keyence (line 17)
Messdaten_Keyence{1,4} = datenum(sprintf('%02d%02d%02d%03d', Messdaten_unformatiert{1, 4:7}),
'HH:MM:SS.FFF');

Error in main_2 (line 7)
[Messdaten_Keyence]=Einlesen_Keyence();

Caused by:
    Error using dtstr2dtnummx
    Failed on converting date string to date number.
 
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: 20.04.2015, 22:19     Titel:
  Antworten mit Zitat      
Hallo kuchenbäcker,

Zitat:
MTIMES is not fully supported for integer classes.

Dann ist der Inhalt des Cells offenbar ein Integer-Typ. Dann müsste man die Zahlen in DOUBLEs umwandeln:
Code:
(double([Messdaten_unformatiert{1, 4:7}]) * [3600; 60; 1; 0.001]) / 86400;


Zitat:
Wenn ich jetzt .* verwende, dann kommt folgende Fehlermeldung...

Es gibt keinen Grund .* zu verwenden. Es wurde zwar in der anderen Fehlermeldung erwähnt, aber die traf nicht den Punkt.

Code:

Error using  .*
Integers can only be combined with integers of the same class, or scalar doubles.
 


Für das zweite Problem:
Code:
Messdaten_Keyence{1,4} = datenum(sprintf('%02d:%02d:%02d.%03d', Messdaten_unformatiert{1, 4:7}), 'HH:MM:SS.FFF');

Ich hatte die : und den Dezimal-Punkt vergessen.

Gruß. Jan
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.