Remove cell that contains strings of another cell array

55 Ansichten (letzte 30 Tage)
chlor thanks
chlor thanks am 8 Aug. 2016
Beantwortet: Sean Mahnken am 28 Mär. 2019
Input:
a={'Time12:30','Time12:40','Time1:40', 'Time2:40'};
b={'12:', '1:'};
Wanted Output: (delete from "a" all cells containing string listed in "b")
a={'Time2:40'}
I have tried:
for k = 1 : length(a)
for kk = 1 : length(b)
if any(~ismember(b{kk}, a{k}))
a(k) = [];
break;
end
end
end
However this gives me error of such:
Index exceeds matrix dimensions.
I am confused by the error and any guidance is appreciated! Thank you for reading my post.

Akzeptierte Antwort

James Tursa
James Tursa am 8 Aug. 2016
Bearbeitet: James Tursa am 8 Aug. 2016
You are changing the size of a in the loop with this line:
a(k) = [];
So subsequent iteration indexes that depend on the length of a will fail. Maybe save the indexes to delete in the loop, and then delete them all at once at the end. E.g., something like this:
a={'Time12:30','Time12:40','Time1:40', 'Time2:40'};
b={'12:', '1:'};
x = false(size(a)); % <-- Indexes to delete, start out nobody deleted
for k=1:numel(b)
x = x | ~cellfun(@isempty,strfind(a,b{k})); % <-- Flag the ones that b{k} matches
end
a(x) = []; % <-- Delete all the flagged lines at once

Weitere Antworten (2)

Stalin Samuel
Stalin Samuel am 8 Aug. 2016
strfind(a, b(kk))%find a string from string array

Sean Mahnken
Sean Mahnken am 28 Mär. 2019
You should be able to just do the k loop backwards:
for k = length(a):-1:1
for kk = 1 : length(b)
if any(~ismember(b{kk}, a{k}))
a(k) = [];
break;
end
end
end

Community Treasure Hunt

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

Start Hunting!

Translated by