How can I delete some specific rows from a matrix?

2 views (last 30 days)
I have an easy question but somehow I am not being able to solve it.
Suppose I have a datetime matrix, A where
'2003-06-24'
'2003-07-10'
'2003-07-18'
'2003-07-26'
'2003-08-03'
'2003-08-11'
'2003-08-19'
'2003-08-27'
And I have another matrix B that contains every day/date from '2003-06-01' to '2003-09-01'.
Can anyone please tell me how can I filter out the rest of the dates from Matrix B so that only the dates from matrix A remain in B?
In another word, how can I make B just like A? (by removing all the unnecessary dates)
Any feedback from you will be greatly appreciated!

Accepted Answer

Steven Lord
Steven Lord on 13 Dec 2022
Do you have a character matrix or do you have a datetime matrix?
C = ['2003-06-24'
'2003-07-10'
'2003-07-18'
'2003-07-26'
'2003-08-03'
'2003-08-11'
'2003-08-19'
'2003-08-27']
C = 8×10 char array
'2003-06-24' '2003-07-10' '2003-07-18' '2003-07-26' '2003-08-03' '2003-08-11' '2003-08-19' '2003-08-27'
dt = datetime(C)
dt = 8×1 datetime array
24-Jun-2003 10-Jul-2003 18-Jul-2003 26-Jul-2003 03-Aug-2003 11-Aug-2003 19-Aug-2003 27-Aug-2003
I'll assume you're using the datetime matrix dt. Let's create B:
B = datetime('2003-06-01'):datetime('2003-09-01');
You can use the set functions like intersect, union, setxor, setdiff, etc. on datetime arrays.
BnotDt = setdiff(B, dt);
whos dt B BnotDt
Name Size Bytes Class Attributes B 1x93 744 datetime BnotDt 1x85 680 datetime dt 8x1 64 datetime
Element 24 of B is in dt:
B(24)
ans = datetime
24-Jun-2003
dt(1)
ans = datetime
24-Jun-2003
Element 24 of B is not in BnotDt. [It's not in a different location in BnotDt either, since BnotDt is sorted.]
BnotDt(23:25)
ans = 1×3 datetime array
23-Jun-2003 25-Jun-2003 26-Jun-2003
issorted(BnotDt)
ans = logical
1
  2 Comments
Steven Lord
Steven Lord on 14 Dec 2022
Use the set functions.
C = ['2003-06-24'
'2003-07-10'
'2003-07-18'
'2003-07-26'
'2003-08-03'
'2003-08-11'
'2003-08-19'
'2003-08-27'];
dt = datetime(C);
B = datetime('2003-06-01'):datetime('2003-09-01');
[isItAMember, whereIsIt] = ismember(dt, B)
isItAMember = 8×1 logical array
1 1 1 1 1 1 1 1
whereIsIt = 8×1
24 40 48 56 64 72 80 88

Sign in to comment.

More Answers (1)

Peter Perkins
Peter Perkins on 15 Dec 2022
Surely you don't just have a list of dates. Presumably you have data at each date. Use a timetable to store all that.
At that point, it becomes one line:
ttB = ttB(ttA.Time,:)

Community Treasure Hunt

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

Start Hunting!