Matching string from multiple arrays

4 Ansichten (letzte 30 Tage)
Kerstin Bergentz
Kerstin Bergentz am 8 Sep. 2020
Beantwortet: Steven Lord am 17 Sep. 2020
Hi,
I have three structures with time stamps (char arrays, eg '2016-11-02 10:00:00') and corresponding datapoints of significant wave heights (double), and these are of different length for the three structures so I cannot just concatenate them.
Basically I want to make a new array with only the datapoint values where the correcpodning time stamp exists in all three of my structures' time stamp field .
I've used ismember and matrix multiplication for just two of the structures (see below), but I realise that I still have values in the array I'm checking against that doesn't exist in the thing I'm checking, so I still have uneven lengths of the arrays. I have 163 triplets of stuctures to check, hence the 'i' to be able to run through all of them eventually.
Drifter_okera5 = ismember(cellstr(Drifters(i).ObsTimestamp), cellstr(era5(i).timestamp)); % check if what is in drifters are in era5
DrifterHsera5 = Drifter_okera5.*Drifters(i).Hs'; % Take the resulting logical matrix and multiply it with the drifter HS
DrifterHsok = DrifterHs(DrifterHs~= 0); %remove all the values that are now zeros, these do not have a matching era5 hs
Any tips are most welcome!
  3 Kommentare
Kerstin Bergentz
Kerstin Bergentz am 8 Sep. 2020
Sorry if I was unclear, it is the three structures that are of different lenghts. But inside the structures, the "time stamp" field of course matches up with the "wave height" field.
So, let's say I have structure A, B and C, each has fields named "timestamp" and "waveheight" that match up, but A has 804, B has 819 and C has 823 entries. I need to pick only the time stamp and wave height entries that exist in all three and create an array/matrix that is suitable for plotting. Thanks!
Adam Danz
Adam Danz am 14 Sep. 2020
See my answer below.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Adam Danz
Adam Danz am 8 Sep. 2020
Bearbeitet: Adam Danz am 10 Sep. 2020
Here's a demo that identies exact datetime matches. It assumes you've already converted the timestamps to datetime values instead of char using t = datetime(DateStrings,'InputFormat',infmt).
% Create demo data - all column vectors
A.timestamp = datetime(2020,1,1)+days(1:10)';
A.waveheight = rand(10,1);
B.timestamp = datetime(2020,1,1)+days(1:15)';
B.waveheight = rand(15,1);
C.timestamp = datetime(2020,1,1)+days(1:5)';
C.waveheight = rand(5,1);
% Find which datetime values *exactly* match in all 3 structures.
% dtInAll is a vector of datetime values that exist in all 3 strcutures.
dtInAll = intersect(intersect(A.timestamp,B.timestamp),C.timestamp);
Now you can get the indices of datetime matches for each structure and extract the waveheight values.
% waves is a nx3 matrix of waveheights where columns are defined by
% [A,B,C] structures and rows defined by deInAll.
waves = [A.waveheight(ismember(A.timestamp, dtInAll)), ...
B.waveheight(ismember(B.timestamp, dtInAll)), ...
C.waveheight(ismember(C.timestamp, dtInAll))];
Summarize the resuls in a table (or timetable)
T = table();
T.TimeStamp = dtInAll
T = [T, array2table(waves,'VariableNames',{'A','B','C'})];
% 5×4 table
% TimeStamp A B C
% ___________ _______ ________ _______
% 02-Jan-2020 0.94479 0.40391 0.64775
% 03-Jan-2020 0.49086 0.096455 0.45092
% 04-Jan-2020 0.48925 0.13197 0.54701
% 05-Jan-2020 0.33772 0.94205 0.29632
% 06-Jan-2020 0.90005 0.95613 0.74469
  1 Kommentar
Kerstin Bergentz
Kerstin Bergentz am 17 Sep. 2020
Hi,
Thank you very much for your help, the above solution works great.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Steven Lord
Steven Lord am 17 Sep. 2020
If you have your data stored in timetable arrays, call synchronize with your three timetable arrays as input and specify the newTimeBasis input as 'intersection'.

Kategorien

Mehr zu Data Type Conversion finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by