I have a 1×4 cell array of
{60×4 double} {60×4 double} {60×4 double} {60×4 double}
and I need to;
-find the values at the 3rd column at the rows have "20" at the first column in each cell
-then eliminate zeros if there is any
-then take average
As an illustration
10 NaN 0 NaN 20 NaN 623 1
10 NaN 0 NaN 20 NaN 0 NaN
20 NaN 310 1 10 NaN 38 1
20 NaN 0 NaN 10 NaN 0 NaN
20 NaN 1445 1 10 NaN 0 NaN
the first cell should give the average of 310 and 1445, whereas the second cell should give 623.
I am thinking of a for loop but I couldnt make it work. Thanks in advance!

댓글 수: 3

Adam Danz
Adam Danz 2020년 6월 23일
Could you share your loop so we can help fix it? Otherwise we're doing it for you.
Ali Yilmaz
Ali Yilmaz 2020년 6월 23일
Hi Adam,
Honestly I deleted my version as it was not even close to what I need. I'll be glad if you can share your version.
Thanks and regards
Adam Danz
Adam Danz 2020년 6월 25일
See answer below.

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

 채택된 답변

Adam Danz
Adam Danz 2020년 6월 24일
편집: Adam Danz 2020년 6월 25일

0 개 추천

If you want to do this in a loop, there are 4 steps I've outlined below.
"c" is the 1x4 cell array.
column3Means = nan(size(c));
for i = 1:numel(c)
% Find rows where column 1 equals 20
index1 = c{i}(:,1) == 20;
% Find rows where column 3 is not 0
index2 = c{i}(:,3) ~= 0;
% Combine those indices
idx = index1 & index2;
% Use the combined index to compute the mean
column3Means(i) = mean(c{i}(idx,3),'omitnan');
end
FYI, the loop can be avoided using the cellfun() function.

댓글 수: 10

madhan ravi
madhan ravi 2020년 6월 25일

Wow didn’t know there was a cellarray() function , was it released in 2020a?

Adam Danz
Adam Danz 2020년 6월 25일
oops :D typo. I meant cellfun.
Corrected. Thanks, madhan.
Ali Yilmaz
Ali Yilmaz 2020년 6월 25일
Hi Adam,
Thank you very much for your response.
When I apply your code, column3means turns out to be [NaN,NaN,NaN,NaN]
Ali Yilmaz
Ali Yilmaz 2020년 6월 25일
Here I added the cell array, now I have 1x5 cell array. But the question is the same.
-find the values at the 3rd column at the rows have "20" at the first column in each cell
-then eliminate zeros if there is any
-then take average
Adam Danz
Adam Danz 2020년 6월 25일
Could you share the code you're using to compute the mean?
You probably just need to work in the "nanflag" input to ignore nans in your data.
Ali Yilmaz
Ali Yilmaz 2020년 6월 25일
편집: Adam Danz 2020년 6월 25일
my cell array is zeroback
column3Means = nan(size(zeroback));
for i = 1:numel(zeroback)
% Find rows where column 1 equals 20
index1 = zeroback{i}(:,1) == 20;
% Find rows where column 3 is not 0
index2 = zeroback{i}(:,3) ~= 0;
end
mean(index2, 'omitnan')
Now I have a mean value of 0.25.
But actually I need the rows which have 20 at 1st column whilst the value in their 3rd column is nonzero. However, with this code above I feel like I have the rows that have 20 at their first coulmn and the rows that have a nonzero value at their 3rd column separately.
You're not using index1. You're also taking the mean of the index rather than using the index to extract the values from zeroback.
But please look at every line and look at the values being produced on each line so you can understand what they are doing.
Try this.
column3Means = nan(size(c));
for i = 1:numel(c)
% Find rows where column 1 equals 20
index1 = c{i}(:,1) == 20;
% Find rows where column 3 is not 0
index2 = c{i}(:,3) ~= 0;
% Combine those indices
idx = index1 & index2;
% Use the combined index to compute the mean
column3Means(i) = mean(c{i}(idx,3),'omitnan')
end
Ali Yilmaz
Ali Yilmaz 2020년 6월 25일
Thank you very much Adam;
that worked perfectly, appreciate your help
Adam Danz
Adam Danz 2020년 6월 25일
Glad it worked out.
The take-home message is: learn/use indexing.
Indexing is a superpower of Matlab. My answer uses logical indexing but there are other types of indexing as well.
Ali Yilmaz
Ali Yilmaz 2020년 6월 25일
Thank you so much again, I will definitely go throuh the link you've shared.

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

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Cell Arrays에 대해 자세히 알아보기

질문:

2020년 6월 23일

댓글:

2020년 6월 25일

Community Treasure Hunt

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

Start Hunting!

Translated by