Count elements of a cell array based on two conditions

5 ビュー (過去 30 日間)
Maria
Maria 2014 年 7 月 27 日
回答済み: Azzi Abdelmalek 2014 年 7 月 28 日
I have the following cell array:
A={'x' 2000 [] 2001 []
26 61 21 157 104
41 98 18 76 60
125 20 33 20 33
143 157 104 157 104
172 61 21 61 21
177 559 10 559 13}
I would like to count only the cases in which A(:,3)<25 and A(:,5)>25, so I would get as output:
Output={2}
I tried this:
sum(cell2mat(A(:,3))<25 & cell2mat(A(:,5))>25)
but to use '&' inputs must have the same size.
Can someone help me? Thank you.
  2 件のコメント
Image Analyst
Image Analyst 2014 年 7 月 27 日
By "case" do you mean "row"?
Maria
Maria 2014 年 7 月 27 日
Yes

サインインしてコメントする。

採用された回答

Azzi Abdelmalek
Azzi Abdelmalek 2014 年 7 月 28 日
out=nnz(cellfun(@(x,y) all([x<25,y>25]),A(2:end,3),A(2:end,5)))

その他の回答 (2 件)

Geoff Hayes
Geoff Hayes 2014 年 7 月 27 日
Maria - you can try the following
length(find(cell2mat(A(:,3))<25 & cell2mat(A(:,5))>25))
We convert the third and fifth columns of A to vectors using cell2mat and then find which indices from both vectors satisfy the two conditions. length is then used to do the the count.
  2 件のコメント
Maria
Maria 2014 年 7 月 27 日
It gives this error: Error using & Matrix dimensions must agree.
Geoff Hayes
Geoff Hayes 2014 年 7 月 27 日
Given this error, it would seem as if the two columns, cellmat(A(:,3)) and cellmat(A(:,5)) are of different dimension. Are both these columns just like in the above matrix?
A(:,3) =
[]
[ 21]
[ 18]
[ 33]
[104]
[ 21]
[ 10]
A(:,5) =
[]
[104]
[ 60]
[ 33]
[104]
[ 21]
[ 13]
During the cell2mat conversion, the empty elements are removed. I wonder if perhaps your two columns have a different number of empty elements, [], so that after the conversion, the two columns are of a different dimension.

サインインしてコメントする。


Image Analyst
Image Analyst 2014 年 7 月 27 日
Another option to count rows meeting the criteria:
theCount = sum(cell2mat(A(:,3)) < 25 & cell2mat(A(:,5)) > 25)
  3 件のコメント
Maria
Maria 2014 年 7 月 27 日
That's what I had already tried.. :(
Image Analyst
Image Analyst 2014 年 7 月 27 日
Here's the exact code I used and it works fine:
A = {'x' 2000 [] 2001 []
26 61 21 157 104
41 98 18 76 60
125 20 33 20 33
143 157 104 157 104
172 61 21 61 21
177 559 10 559 13}
theCount = sum(cell2mat(A(:,3)) < 25 & cell2mat(A(:,5)) > 25)
Post your adaptation of my code so I can see what you changed and see how you broke it.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeData Type Conversion についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by