Using strcmp on multiple strings to get a logical array
조회 수: 162 (최근 30일)
이전 댓글 표시
I want to check for the occurrence of 3 possible events in a series of events..
Event = ['a1','b1','a1','c1','b1']';
Check = {'a1','b1','c1'}';
LogA(:,1) = strcmp(Event,Check{1});
LogA(:,2) = strcmp(Event,Check{2});
LogA(:,3) = strcmp(Event,Check{3});
This gives me a 5x3 logical array, but is there a way to do it without calling each column individually? i.e., what if I had 100 strings I wanted to check for and the goal was to have a 5x100 logical array? I don't want to use a "for-loop". I'm assuming there is some matrix way to do this.
댓글 수: 1
Jan
2017년 1월 15일
Note:
Event = ['a1','b1','a1','c1','b1']';
is the same as:
Event = ('a1b1a1c1b1').';
Most likely you mean a cell string instead.
채택된 답변
Kirby Fears
2017년 1월 12일
편집: Kirby Fears
2017년 1월 12일
There's really nothing wrong with a for loop in this case. However, cellfun is probably what you're looking for:
Event = {'a1','b1','a1','c1','b1'}';
Check = {'a1','b1','c1'}';
l = cellfun(@(c)strcmp(c,Event),Check,'UniformOutput',false);
This produces a cell array the size of Check with logical arrays the size of Event.
You can index like this:
l{index1}(index2)
댓글 수: 2
Jan
2017년 1월 15일
편집: James Tursa
2017년 1월 16일
strcmp does not accept: strcmp(Event, Check.') and this does not work also:
bsxfun(@strcmp, Event, Check.') % ERROR!
What a pity.
추가 답변 (2개)
Guillaume
2017년 1월 13일
편집: Guillaume
2017년 1월 13일
Another option which may or may not be faster than cellfun(...):
Event = {'a1','b1','a1','c1','b1'}';
Check = {'a1','b1','c1'}';
LogA = false(numel(Event), numel(Check));
[~, loc] = ismember(Event, Check);
LogA(sub2ind(size(LogA), 1:numel(Event), loc.')) = true
댓글 수: 0
John BG
2017년 1월 13일
Marc
1.
If all 2nd halves of the strings contained in Event is '1', it is reasonable to ignore the entire column:
Event = ['a1';'b1';'a1';'c1';'b1'];
Event_num=double(Event)
=
97 49
98 49
97 49
99 49
98 49
E=Event_num(:,1)';
E =
97 98 97 99 98
2.
Same applies to Checks
Check = ['a1';'b1';'c1'];
Check_num=double(Check)
=
97 49
98 49
99 49
C=Check_num(:,1)';
C =
97 98 99
3.
Occurence of events are listed in variable occ
[Lie,occ]=ismember(E,C)
Lie =
1 1 1 1 1
occ =
1 2 1 3 2
4.
check
Check(occ)
=
abacb
meaning occ contains the occurrences: a1 b1 a1 c1 b1
if you find these lines useful would you please mark my answer as Accepted Answer?
To any other reader, if you find this answer of any help please click on the thumbs-up vote link,
thanks in advance for time and attention
John BG
댓글 수: 5
참고 항목
카테고리
Help Center 및 File Exchange에서 Characters and Strings에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!