MATLAB Answers

0

String matrix compare to get common in rows

Asked by Touts Touts on 26 Jun 2019
Latest activity Commented on by Touts Touts on 28 Jun 2019
Deal all, i have a problem to compare two string matrix :
A1 = {'AA', 'b' ; 'cc', 'ff'}
A2 = {'ee', 'AA' ; 'hhh', 'm'}
strcmp(A1,A2)
I get
A1 =
'AA' 'b'
'cc' 'ff'
A2 =
'ee' 'AA'
'hhh' 'm'
ans =
0 0
0 0
But i need to get
'AA' is common between A1 iand A2 in the row 1
Best regard

  0 Comments

Sign in to comment.

Products

2 Answers

Answer by Stephen Cobeldick on 28 Jun 2019
Edited by Stephen Cobeldick on 28 Jun 2019
 Accepted Answer

>> A1 = {'AA', 'b' ; 'cc', 'ff' ; 'tt', 'kk'; 'XX', 'b'; 'AA', 'b'};
>> A2 = {'ee', 'AA' ; 'hhh', 'm'; 'kk', 'o'; 'ee', 'XX'; 'AA', 'b'};
>> X = cell2mat(cellfun(@ismember,num2cell(A1,2),num2cell(A2,2),'uni',0));
>> [R,~] = find(X);
>> [~,Y] = sort(R);
>> C = [A1(X),num2cell(R)].';
>> fprintf('''%s'' common at row %d\n',C{:,Y})
'AA' common at row 1
'kk' common at row 3
'XX' common at row 4
'AA' common at row 5
'b' common at row 5

  3 Comments

Its work parfectely, please is it possible to ignore the empty values
A1 = {'AA', '', 'cc', 'ff' ; 'tt', 'kk', 'XX', 'ee'}
A2 = {'ee', 'AA', 'hhh', ''; 'kk', 'o', 'ee', 'XX'}
X = cell2mat(cellfun(@ismember,num2cell(A1,2),num2cell(A2,2),'uni',0));
[R,~] = find(X);
[~,Y] = sort(R);
C = [A1(X),num2cell(R)].';
fprintf('''%s'' common at row %d\n',C{:,Y})
'AA' common at row 1
'' common at row 1
'kk' common at row 2
'XX' common at row 2
'ee' common at row 2
ignore this cas
'' common at row 1
Thanks a lot
"...is it possible to ignore the empty values"
Of course, just add this line after X is defined:
X = X & ~cellfun(@isempty,A1);

Sign in to comment.


Answer by Geoff Hayes
on 27 Jun 2019

Touts - consider using ismember to check to see if any string of A1 matches with any string of A2
>> ismember(A1,A2)
ans =
1 0
0 0

  5 Comments

Not only the 'AA', but all the common string between A1 iand A2
A1 = {'AA', 'b' ; 'cc', 'ff' ; 'tt', 'kk'}
A2 = {'ee', 'AA' ; 'hhh', 'm'; 'kk', 'o'}
ismember(A1,A2)
so
A1 =
'AA' 'b'
'cc' 'ff'
'tt' 'kk'
A2 =
'ee' 'AA'
'hhh' 'm'
'kk' 'o'
ans =
1 0
0 0
0 1
Please i need to get
'AA' is common between A1 and A2 in the row 1
'kk' is common between A1 and A2 in the row 3
Best regard
@Touts Touts: repeating and clarifying Geoff Hayes's questions, which you did not answer:
  1. what happens if 'AA' occurs on different rows?
  2. what happens if 'AA' occurs multiple times within one matrix?
Please, i need all the common between A1 and A2 and their rows
A1 = {'AA', 'b' ; 'cc', 'ff' ; 'tt', 'kk'; 'XX', 'b'; 'AA', 'b'}
A2 = {'ee', 'AA' ; 'hhh', 'm'; 'kk', 'o'; 'ee', 'XX'; 'AA', 'b'}
so
A1 =
'AA' 'b'
'cc' 'ff'
'tt' 'kk'
'XX' 'b'
'AA' 'b'
A2 =
'ee' 'AA'
'hhh' 'm'
'kk' 'o'
'ee' 'XX'
'AA' 'b'
I need
  • 'AA' common at row N° :1
  • 'kk' common at row N° :3
  • 'XX' common at row N° :4
  • 'AA' common at row N° :5
  • 'b' common at row N° :5
Any common at any row
Best regard

Sign in to comment.