필터 지우기
필터 지우기

find multiple words in a cell

조회 수: 2 (최근 30일)
Vincent I
Vincent I 2013년 1월 9일
Hi, is there a way to compare and return a number for the matching words in two unequal cells?
A={'a','a','a','b','b','d'} B={'a','b','c','d','e','f','g','h'}
return C=3,2,0,1,0,0,0,0
Thank you

채택된 답변

Ryan Livingston
Ryan Livingston 2013년 1월 9일
A one-liner:
cellfun(@(x)sum(ismember(A,x)), B)
  댓글 수: 1
Vincent I
Vincent I 2013년 1월 9일
Fantastic, thank you . thats what I was looking for

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

Matt J
Matt J 2013년 1월 9일
If the "words" will really always be single letters, you could do it looplessly with
>> histc([A{:}], [B{:}])
ans =
3 2 0 1 0 0 0 0
  댓글 수: 6
Matt J
Matt J 2013년 1월 9일
편집: Matt J 2013년 1월 9일
And, although this is a new question, I feel that it is not far away for the initial question which I dont see why should require a new post
It doesn't require it, but if you post it as a new question, people have the opportunity to gain points from answering you (now that you've already accepted Ryan's answer), and so will be more incentivized to do so.
Jan
Jan 2013년 1월 10일
편집: Jan 2013년 1월 10일
The decision is easy:
New question, new thread.
And:
Additional information to an existing question is added by editing the question and marking the changes by "[EDITED]". Then this is clarification and *not* a new question.
Hiding important information in deeply nested comments to already accepted questions is a bad idea.

댓글을 달려면 로그인하십시오.


Daniel Shub
Daniel Shub 2013년 1월 9일
I am sure that this is over thinking the solution and I doubt that using regexp is optimal, but I was curious how bad it would be.
x = regexp(A, cell2mat(cellfun(@(x)['(?<', x, '>', x, ')|'], B, 'UniformOutput', false)), 'names');
cellfun(@(x)length([y.(x)]), fieldnames([x{:}]))'
I is there a better way to do this with regexp?
  댓글 수: 1
Vincent I
Vincent I 2013년 1월 9일
편집: Vincent I 2013년 1월 9일
Solved my problem by doing the folowing:
A=TF(:,1).';
A=regexprep(A, ' ','');
A=regexprep(A, '_(\w*)','');
B={'aa','bb2c','bb25c','xy3c','m56c','etc56c'};
C=cellfun(@(x)sum(strcmp(A, x)), B);
Thank you

댓글을 달려면 로그인하십시오.


Jan
Jan 2013년 1월 10일
[EDITED, Jan, moved from comments to the accepted question]
ISMEMBER sorts the inputs and performs a binary search. This can be much faster and much slower than an unsorted comparison by:
cellfun(@(x)sum(strcmp(A, x)), B)
I claim without a proof, that a loop is faster:
R = zeros(1, numel(B));
for iB = 1:numel(B)
R(iB) = sum(strcmp(A, B{iB}));
end
[EDITED 2] And if you want to compare the leading character(s) only:
...
R(iB) = sum(strncmp(A, B{iB}, length(B{iB}));
...
  댓글 수: 1
Vincent I
Vincent I 2013년 1월 10일
sounds goood. Thanks for your answer

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Debugging and Analysis에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by