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

Matrix in Teilmatrix zerlegen und Anzahl der NaNs bestimmen

 

reloop
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.08.12
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 12.11.2014, 17:48     Titel: Matrix in Teilmatrix zerlegen und Anzahl der NaNs bestimmen
  Antworten mit Zitat      
Liebe Community,

nach langem Überlegen greife ich nun gern auf Ratschläge dieses Forums zurück. Das Problem sieht wie folgt aus:

Ich habe mir eine n x 4 - Matrix aus einem Zeitstempel und den 3 Beschleunigungsvektoren gebastelt.

Das Format lässt sich in Auszug so darstellen:

120552731 0.687 1.125 9.853
120552751 0.679 1.124 9.856
120552771 NaN NaN NaN
120552791 0.680 1.125 9.819
...
120600091 0.723 0.985 9.805
...
122047321 0.701 1.038 9.823

Der Zeitstempel "hh:mm:ss.fff" wurde auf "hhmmssfff" gekürzt und in double umgewandelt.

Folgendes soll nun mit der Matrix geschehen:

Wie aus dem Auszug ersichtlich wird, treten bei den aufgenommenen Messwerten "NaNs" auf. Ich möchte nun gern für jede Minute die Anzahl der NaNs bestimmen und diese zusammen mit der jeweiligen Minute in eine Matrix ablegen. Diese Matrix dient der Weiterverarbeitung für statistische Untersuchungen.

Sollten noch weitere Fragen auftreten, nehme ich Sie gern zur Beantwortung entgegen.

Ich bedanke mich schon einmal im Voraus für die Antworten.

LG, Torsten
Private Nachricht senden Benutzer-Profile anzeigen


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 12.11.2014, 20:51     Titel:
  Antworten mit Zitat      
Hallo Torsten,

Ich leg dir noch mal
Code:
ans Herz. Dies erlaubt es die Zeitangaben in Bins aufzuteilen und diese an
Code:
histc % oder ab R2014b histcount
zu übergeben.

Dein Datumsformat eignet sich dazu ggf. auch, macht es aber unnötig kompliziert (da nicht dezimal). Ein Bsp.:
Code:
time = {'12:04:59.991';
    '12:05:00.011';
    '12:05:00.031';
    '12:05:52.731';
    '12:05:52.751';
    '12:05:52.771';
    '12:05:52.791';
    '12:05:59.991';
    '12:06:00.011'};

% Ohne datenum
time_meh = str2double(regexprep(time, '[.:]', ''));
bin_step = 100000;  % entspricht 1 Minute
binranges = ( 120000000:bin_step:130000000 )';  % 101 bins; ab 125959999 bis 130000000 unnütz
[bincounts, ~] = histc(time_meh(:,1), binranges);

% Mit datenum
time_num = datenum(time);
bin_step = datenum('12:01:00.000') - datenum('12:00:00.000');  % 1 Minute
binranges = ( datenum('12:00:00.000'):bin_step:datenum('13:00:00.000') )';  % 61 bins
[bincounts, ~] = histc(time_num(:,1), binranges);



So kann man dann bspw. die NaN pro Minute ermitteln:
Code:
time = {'12:04:59.991';
    '12:05:00.011';
    '12:05:00.031';
    '12:05:52.731';
    '12:05:52.751';
    '12:05:52.771';
    '12:05:52.791';
    '12:05:59.991';
    '12:06:00.011'};

time_num = datenum(time);

val = 1.0e+06 * [rand(2,3);
    NaN(1,3);
    rand(1,3);
    NaN(1,3);
    rand(3,3);
    NaN(1,3)];

M = [time_num, val];


log_NaN = isnan(M(:, 2));       % 1 für NaN in 2. Spalte, sonst 0
time_NaN = time_num(log_NaN);   % nur Zeitangaben, bei denen Nan in 2. Spalte

bin_step = datenum('12:01:00.000') - datenum('12:00:00.000');   % 1-Minuten-Schritte
binranges = ( datenum('12:00:00.000'):bin_step:datenum('13:00:00.000') )';  % 61 bins
[anzahl_NaN_je_minute, idx] = histc(time_NaN(:,1), binranges);
minute = datestr(binranges(unique(idx)), 'HH:MM:SS');


Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
reloop
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.08.12
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 12.11.2014, 23:14     Titel:
  Antworten mit Zitat      
Ich werde mich mal bis morgen mit dem Code befassen, auf mein Problem anpassen und danach der Community die Lösung zukommen lassen =)
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 13.11.2014, 00:27     Titel:
  Antworten mit Zitat      
Hab's ein bisschen angepasst, jetzt wird eine Matrix mit Minute (als Number) und Anzahl NaN erstellt. Die Datumsnummer kann man bei Bedarf mit datestr umwandeln.
Code:
format shortG  % Set Command Window output display format

time = {'12:04:59.991';
    '12:05:00.011';
    '12:05:00.031';
    '12:05:52.731';
    '12:05:52.751';
    '12:05:52.771';
    '12:05:52.791';
    '12:05:59.991';
    '12:06:00.011'};

time_num = datenum(time);

val = 1.0e+06 * [rand(2,3);
    NaN(1,3);
    rand(1,3);
    NaN(1,3);
    rand(3,3);
    NaN(1,3)];

M = [time_num, val];


log_NaN = isnan(M(:, 2));       % 1 für NaN in 2. Spalte, sonst 0
time_NaN = time_num(log_NaN);   % nur Zeitangaben, bei denen Nan in 2. Spalte

bin_step = datenum('12:01:00.000') - datenum('12:00:00.000');   % 1-Minuten-Schritte
binranges = ( datenum('12:00:00.000'):bin_step:datenum('13:00:00.000') )';  % 61 bins

[anzahl_NaN_je_minute, ~] = histc(time_NaN(:,1), binranges);

log = anzahl_NaN_je_minute > 0; % 1 wenn NaN in Minute vorhanden, sonst 0
minute = binranges .* log;

N = [minute, anzahl_NaN_je_minute];

str_minute_1 = datestr(minute(log), 'HH:MM:SS');
str_minute_2 = datestr(minute, 'HH:MM:SS');

format  % Reset Command Window output display format

_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
reloop
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 07.08.12
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 16.11.2014, 17:39     Titel:
  Antworten mit Zitat      
So, hier mit etwas Verspätung die Lösung zum Problem =)

Code:
% Wandlung des Zeitstempels in eine 'Serial Date Number'
time_SDN = datenum (timestamp);

% Erzeugung einer Matrix aus 'time_SDN' und den Beschleunigungsvektoren
data = [time_SDN, acc_x, acc_y, acc_z]

% Festlegung des Intervalls mit Schrittweite
step_size = datenum ('12:01:00.000') - datenum('12:00:00.000');
time_range = (datenum('12:00:00.000'):step_size:datenum('13:00:00.000'))';

% Bestimmung der NaNs mit Zeitangabe im Intervall
log_NaN = isnan(data(:,2));
time_NaN = time_SDN(log_NaN);

% Anzahl der NaNs pro Minute
anzahl_NaN_je_Min = histc(time_NaN, time_range);

% Angabe der Minute, wo NaNs detektiert wurden
log = anzahl_NaN_je_Min > 0;
minute = time_range .* log;

% Angabe der Minute mit zugehöriger Anzahl an NaNs
Nan = [minute, anzahl_Nan_je_Min];

% Ausgabe der Minuten, wo ein NaN detektiert wurde
str_minute_1 = datestr(minute(log), 'HH:MM:SS');
str_minute_2 = datestr(minute, 'HH:MM:SS');


Grüße,
Torsten

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
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.