Logical Indexing of Cell Array containing matrices

3 views (last 30 days)
Hi everyone,
I need help with indexing cell arrays. I have a cell array, which contains matrices in the first, a string in the second and three identifiers in the third-fifth columns (see attached screenshot)
. What I want to do is a plot of specific values, which are located in the matrix of the first column and want to access those values with logical indexing of the identifiers. As a matter of fact, my logical indexing fails, it is not as straight forward as for standard arrays.
See my code below:
plot(R1{(R1{:,3} == phi && R1{:,4} == layer && R1{:,5} == speed),1}(:,6), ...
R1{(R1{:,3} == phi && R1{:,4} == layer && R1{:,5} == speed),1}(:,3),'Color',color(1,:),'LineStyle','-','LineWidth',1)
I have already tried the solutions with strcmp, but this doesn't work either...
Thanks for your help in advance! Georg
  3 Comments
Georg Söllinger
Georg Söllinger on 7 Nov 2016
Oh sorry, the error message shown in the picture was actually not that, what I wanted to show. Nevertheless, I have no clue, how matlab comes to the error 'abs', if I use the strcmp...
The error, which is thrown with my solution is (when executing R1{:,3} == phi): Error using == Too many input arguments.
As I execute the whole statement, the error message is equal.
KSSV
KSSV on 7 Nov 2016
Can you attach R1 data and say what is phi and layer?

Sign in to comment.

Accepted Answer

Walter Roberson
Walter Roberson on 7 Nov 2016
mask = cell2mat(R1(:,3)) == phi & cell2mat(R1(:,4) == layer & cell2mat(R1(:,5)) == speed);
subset = R1(mask,:);
plot(subset{1, 1}(:,6), subset{1, 1}(:,3), 'Color', color(1,:), 'LineStyle', '-', 'LineWidth', 1);
hold on
arrayfun(@(ROWIDX) plot(subset{ROWIDX, 1}(:,6), subset{ROWIDX, 1}(:,3), 'Color', color(1,:), 'LineStyle', '-', 'LineWidth', 1), 2:size(subset,1));
If you already have "hold on" in effect then you can use
mask = cell2mat(R1(:,3)) == phi & cell2mat(R1(:,4) == layer & cell2mat(R1(:,5)) == speed);
subset = R1(mask,:);
arrayfun(@(ROWIDX) plot(subset{ROWIDX, 1}(:,6), subset{ROWIDX, 1}(:,3), 'Color', color(1,:), 'LineStyle', '-', 'LineWidth', 1), 1:size(subset,1));
  2 Comments
Georg Söllinger
Georg Söllinger on 8 Nov 2016
Thank you, your solution works perfectly, great!! But what does ROWIDX and arrayfun do, wouldn't it also work if I'd simply plot subset{1,1}?
Thanks again!
Walter Roberson
Walter Roberson on 8 Nov 2016
arrayfun is there to plot all the subsets. Each subset member is one row in which the condition was true.
I do not assume that only one line matches the criteria.

Sign in to comment.

More Answers (1)

KSSV
KSSV on 7 Nov 2016
abs is not defined for cell. Convert it to a array/ matrix and then use abs.

Community Treasure Hunt

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

Start Hunting!