필터 지우기
필터 지우기

Delete Entries in Cell arrays with a certain criterea

조회 수: 2 (최근 30일)
Maximilian comploj
Maximilian comploj 2016년 10월 21일
답변: Nick Counts 2016년 11월 5일
Hello I Have a cell :
A= [2011 12 3 8 52 36] [2019]
[2011 12 3 8 52 40] [2004]
[2011 12 3 8 52 52] [2004]
[2011 12 3 14 50 50] [2015]
the first row contains a Matrix with the date in yyyy mm dd HH MM SS
i need to delete the double entry for 2004 delete second or third row if the date is less distant than one day Thanks a lot

답변 (1개)

Nick Counts
Nick Counts 2016년 11월 5일
This is messy, but here is an example. I'm sure there's a slick way to do this with logical indexing, but I can't quite wrap my head around it.
Sometimes a for-loop will get it done when slicker methods are elusive. I tried to comment the example, so hopefully it makes sense to you. I also added an additional row with [2004] in column 7 that is more than 1 day away, and it is correctly left alone.
A = [[2011 12 3 8 52 36] [2019];
[2011 12 3 8 52 40] [2004];
[2011 12 5 8 52 52] [2004];
[2011 12 3 14 50 50] [2015];
[2011 12 3 8 52 52] [2004]]
disp('Starting with these dates:')
datestr(datenum(deal(A(:,1:6))))
% Find unique values in column 7
uniqueValues = unique(A(:,7));
% how often does each unique value from column 7 occur?
freq = hist(A(:,7), uniqueValues);
% find index of column 7 values that appear more than once
nonUniqueInd = ismember(A(:,7),uniqueValues(freq>1));
% Make a list of values that are repeated in column 7
nonUniqueVals = A(nonUniqueInd,7)
% we will be building an index of rows to delete
indToRemove = [];
% Loop through each value that is repeated. Will run on the same
% value more than once to caputure the case when a column 7 value
% occurs multiple times on multiple days
for i = 1:numel(nonUniqueVals)
% try each non-unique value from column 7
% get the index of each occurrence of the current non-unique
% value in the original array
nuInd = find(A(:,7)==nonUniqueVals(i))
% find elapsed time from first occurrence of the repeated value
% in column 7
deltas = datenum(deal(A(nuInd(1),1:6)))-(datenum(deal(A(nuInd,1:6))))
% find any time changes that are 0 or greater than 1. This
% gives us the first occurrence and anthing on a different day
thisIndToRemove = nuInd(find( (deltas == 0 | deltas > 1)))
% Add indices to the running list. We could delete them here,
% but it's a little better to build a small array of indices then
% to keep resizing the original array, which could potential be
% very large.
indToRemove = vertcat(indToRemove, thisIndToRemove);
end
% Remove duplicates matching our conditions
A(indToRemove,:) = [];
disp('Here are the remaining rows');
datestr(datenum(deal(A(:,1:6))))

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by