Shinobii
Shinobii

Reputation: 2561

MATLAB Find row in cellular array containing two variables

I am trying to find the row in the cell array that contains (for example) the value 6 and string Steel (see matrix C at bottom of question). I understand I can use the following:

>> find(strcmp(C, 'Steel'))

ans =

    11
    14
    17

Which gives me the general index, if I subtract 9 (length of matrix) I get rows 2, 5, 8. Great. And to find the value 6:

>> find([C{:}] == 6)

ans =

     1     2     3

Super. Any idea how I go about combing this information to find the 2nd row? I would like to extract the value C{2,3} essentially. I am given the value (6) and the material (Steel), and from above I know to look in the second row; but how can I pass this automatically?

C = {6, 'Concrete',  0.37,   0.33;
     6, 'Steel',     0.1,    0.1;
     6, 'Lead',      0.057,  0.057;
     10, 'Concrete', 0.41,   0.37;
     10, 'Steel',    0.11,   0.11;
     10, 'Lead',     0.057,  0.057;
     15, 'Concrete', 0.44,   0.41;
     15, 'Steel',    0.11,   0.11;
     15, 'Lead',     0.057,  0.057};

Upvotes: 1

Views: 73

Answers (2)

Mefitico
Mefitico

Reputation: 1116

First, I'll find the indexes with 6 at the first column:

index1 = find(cell2mat(cellfun(@(x) isequal(x, 6), C(:,1), 'UniformOutput', 0)));

Now, the indexes with 'Steel' at the second column:

index2 = find(cell2mat(cellfun(@(x) strcmp(x,'Steel'), C(:,2), 'UniformOutput', 0)));

Finally, their intersection:

index = intersect(index1, index2);

So C(index, :) is the line you want.

Note that if more lines would satisfy these two conditions, index would be a vector, and C(index, :) would be an n x 4 cell array.

Upvotes: 3

Daniel
Daniel

Reputation: 36710

Do you know that the material is always in the second column and the number always in the first? If so use this information and search only in these columns: rows_six=cell2mat(C(:,1)) and rows_steel=strcmpi(C(:,2),'steel'). To get the rows with 6 and steel, use C(rows_six&rows_steel,:)

Upvotes: 1

Related Questions