Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

Find a vector of string in a Cell array

Asked by Mojgan on 29 Apr 2013

Hi all

Assume I have a cell array which is like a matrix like this Dataset=

{'DICL','Coating','Yes';

 'DICL','Coating','No';
 'DICL','Coating','Yes';
 'DICL','Coating','NO'}

Now I want to find the index of a row of this array which is for example

 uniquevalue={'DICL','Coating','NO'}

uniquevalue is another cell array which is like a 1*n array

When I wanted to convert the Dataset to Matrix with cell2mat,following error happened:

Error using cat: Dimensions of matrices being concatenated are not consistent.

Actually I wanted to convert these to cell arrays to the matrix and then use following statement

ind=strfind((NewstringsDataSet),(UniqueValuesSet(j,:)));

or

temp=find(strcmp(NewstringsDataSet,UniqueValuesSet(j,:)));

Are there any function in Matlab to find the index of a row of cell array

Best Regards Mojgan

1 Comment

Jan Simon on 29 Apr 2013

Please post a complete copy of the error message and at least the line, which causes the error. Otherwise we cannot suggest an improvement for the relevant part of the code, but have to invent the algorithm from scratch. This decreases the chance, that our suggestion match your needs.

Mojgan

Products

No products are associated with this question.

2 Answers

Answer by Andrei Bobrov on 29 Apr 2013
Edited by Andrei Bobrov on 29 Apr 2013
Accepted answer
[~,i1] = ismember(Dataset,uniquevalue);
index = find(all(diff(i1,1,2)==1,2));

other variant:

Dataset = {
'DICL'    'Coating'    'Yes'
'DICL'    'Coating'    'No'
'DICL'    'Coating'    'YES'
'DICL'    'Coating'    'NO'};
uniquevalue = {'DICL'    'Coating'    'YES'
'DICL'    'Coating'    'NO'};
[~,~,c] = unique([Dataset;uniquevalue]);
s = size(Dataset);
M = reshape(c,[],s(2));
[ii,index] = ismember(M(1:s(1),:),M(s(1)+1:end,:),'rows');
out = [find(ii),index(ii)]

2 Comments

Mojgan on 1 May 2013

Thanks a lot

I needed the index of all uniquevalue in Dataset and your answer worked correctly

Mojgan on 2 May 2013

Hi again

What if both Dataset and uniquevalue contain both strings and numerics? like:

Dataset = {
'DICL'    'Coating'    'Yes' 10
'DICL'    'Coating'    'No'  12 
'DICL'    'Coating'    'YES'  11
'DICL'    'Coating'    'NO' 13};
uniquevalue = {'DICL'    'Coating'    'YES' 11
'DICL'    'Coating'    'NO' 13};

When I wrote [ii,index] = ismember(M(1:s(1),:),M(s(1)+1:end,:),'rows'); in such situation, I got following error:

Input A of class cell and input B of class cell must be cell arrays of strings, unless one is a string.

[EDITED, Jan, code formatted - please do this by your own, Thanks]

Andrei Bobrov
Answer by Jan Simon on 29 Apr 2013
Data = {'DICL','Coating','Yes'; ...
        'DICL','Coating','No'; ...
        'DICL','Coating','Yes'; ...
        'DICL','Coating','NO'};
Search = {'DICL','Coating','NO'};
index  = strcmp(Data(:, 1), Search(:, 1)) & ...
         strcmp(Data(:, 2), Search(:, 2)) & ...
         strcmp(Data(:, 3), Search(:, 3));

Or perhaps you want find(index).

2 Comments

Mojgan on 1 May 2013

Thanks Jan

I needed to find Index and I used the Andrei answer.It worked

Jan Simon on 2 May 2013

If you need the index instead of the logical index, you can append this line:

index = find(index)

Then, I think, my solution is much more direct. ismember and unique both performs an expensive sorting, but for large inout (perhaps 100'000 rows) this supports a much faster binary search of matching strings.

Jan Simon

Contact us