Count elements of a cell array based on two conditions

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 日

1 投票

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 日

1 投票

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 日

1 投票

Another option to count rows meeting the criteria:
theCount = sum(cell2mat(A(:,3)) < 25 & cell2mat(A(:,5)) > 25)

3 件のコメント

Maria
Maria 2014 年 7 月 27 日
It gives the same error, Error using & Matrix dimensions must agree.
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.

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

カテゴリ

ヘルプ センター および File ExchangeData Type Conversion についてさらに検索

質問済み:

2014 年 7 月 27 日

回答済み:

2014 年 7 月 28 日

Community Treasure Hunt

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

Start Hunting!

Translated by