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

Arrayfun spaltet nicht auf

 

Ghost87

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2017, 10:17     Titel: Arrayfun spaltet nicht auf
  Antworten mit Zitat      
Hallo liebe Community,

ich habe da ein kurzes Problem mit dem arrayfun, wobei ich an dieser Stelle mich frage, ob man da auch den cellfun benutzen kann?

Hier der Quellcode:

Code:

clear;
clc;
load('matlab.mat')

% Berechnung der Differenz der Loginzeit pro Tag
a = WorkLog(:,1);
b = WorkLog(:,2);
form = 'yyyy-mm-ddTHH:MM:SS';
c = arrayfun(@(x) (datestr(datenum(b, form)-datenum(a, form), 'HH:MM:SS')), 'UniformOutput' ,false);
 


Ich glaube ich benutze das arrayfun ein wenig falsch. In der Datei WorkLog sind in jeder Zele verschiedene Zeiten eingespeichert und ich will halt die Zeiten voneinaner abziehen, wenn ich es ohne den arrayfun mache funktioniert es zwar aber das Ergebnis wird mir als Block geliefert und ich will eine Unterteilung pro Zeile.

LG
Ghost


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.07.2017, 11:58     Titel:
  Antworten mit Zitat      
Hallo du musst ja arrayfun auch einen Vektor übergeben, durch welchen die Funktion iterieren kann
Aber ich würde in dem Fall eine FOR-Loop bevorzugen

Code:


clear;
clc;
load('matlab.mat')

% Berechnung der Differenz der Loginzeit pro Tag
a = WorkLog(:,1);
b = WorkLog(:,2);

form     = 'yyyy-mm-ddTHH:MM:SS';
num_el = min(size(a,1), size(b,1))
c          = cell(num_le, 1)
for idx = 1:num_el
   c{idx} = datestr(datenum(b{idx}, form)-datenum(a{idx}, form), 'HH:MM:SS');
end

 





ansonsten mit cellfun/arrayfun:

Code:

clear;
clc;
load('matlab.mat')

% Berechnung der Differenz der Loginzeit pro Tag
a = WorkLog(:,1);
b = WorkLog(:,2);
form = 'yyyy-mm-ddTHH:MM:SS';
% wenn a und b cells sind, dann arrayfun übergibt  cell an funktions parameter
% dann muss man auf Inhalt mit geschweiften Klammern zugreifen.
c = arrayfun(@(a_el, b_el) (datestr(datenum(b_el{1}, form)-datenum(a_el{1}, form), 'HH:MM:SS')), a,b, 'UniformOutput' ,false);
%  Aber datenum versteht auch cells, deshalb geht es hier auch ohne  geschweifte Klammern
c = arrayfun(@(a_el, b_el) (datestr(datenum(b_el, form)-datenum(a_el, form), 'HH:MM:SS')), a,b, 'UniformOutput' ,false);

% cellfun übergibt gleich den den Inhalt der cell an Funktionsparameter
c = cellfun(@(a_el, b_el) (datestr(datenum(b_el, form)-datenum(a_el, form), 'HH:MM:SS')), a,b, 'UniformOutput' ,false);
 


Zuletzt bearbeitet von denny am 21.07.2017, 13:25, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Ghost87
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 21.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2017, 13:03     Titel:
  Antworten mit Zitat      
Ich danke dir erstmal und mit dem:

Code:

clear;
clc;
load('matlab.mat')

% Berechnung der Differenz der Loginzeit pro Tag
a = WorkLog(:,1);
b = WorkLog(:,2);
form = 'yyyy-mm-ddTHH:MM:SS';
% wenn a und b cells sind, dann arrayfun übergibt  cell an funktions parameter
% dann muss man auf Inhalt mit geschweiften Klammern zugreifen.
c = arrayfun(@(a_el, b_el) (datestr(datenum(b_el{1}, form)-datenum(a_el{1}, form), 'HH:MM:SS')), a,b, 'UniformOutput' ,false);
%  Aber datenum versteht auch cells, deshalb geht es hier auch ohne  geschweifte Klammern
c = arrayfun(@(a_el, b_el) (datestr(datenum(b_el, form)-datenum(a_el, form), 'HH:MM:SS')), a,b, 'UniformOutput' ,false);

% cellfun übergibt gleich den den Inhalt der cell an Funktionsparameter
c = cellfun(@(a_el, b_el) (datestr(datenum(b_el, form)-datenum(a_el, form), 'HH:MM:SS')), a,b, 'UniformOutput' ,false);
 


klappt erstmal einwandfrei. Hatte wirklich wie du sagt ihm vergessen den Vektor zu übergeben.


Bei der For Loop Variante klappt es bei mir noch nicht einwandfrei, da er nur mir zwei Elemente rausspuckt, quasi die ersten beiden Zeilen befüllt und der Rest wurd ausgelassen....
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.07.2017, 13:27     Titel:
  Antworten mit Zitat      
Zitat:
Bei der For Loop Variante klappt es bei mir noch nicht einwandfrei, da er nur mir zwei Elemente rausspuckt, quasi die ersten beiden Zeilen befüllt und der Rest wurd ausgelassen....


Upps habe was vergessen der FOR-Loop zu übergeben, habe oben entsprechend verbessert, sollte jetzt alles befüllen
Private Nachricht senden Benutzer-Profile anzeigen
 
Ghost87
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 21.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.07.2017, 13:40     Titel:
  Antworten mit Zitat      
Danke dir!!
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 - 2024 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.