计算给定范围内矩阵中的值的数量

时间:2012-08-18 05:57:26

标签: matlab matrix

我有矩阵

A=[2 3 4 5 6 7;
   7 6 5 4 3 2]

我想计算有多少元素的值大于3且小于6。

5 个答案:

答案 0 :(得分:8)

flatA = A(:);
count = sum(flatA > 3 & flatA < 6);

答案 1 :(得分:7)

我可以想到几个方法:

count = numel(A( A(:)>3 & A(:)<6 ))      %# (1)

count = length(A( A(:)>3 & A(:)<6 ))     %# (2)

count = nnz( A(:)>3 & A(:)<6 )           %# (3)

count = sum( A(:)>3 & A(:)<6 )           %# (4)

Ac = A(:);
count = numel(A( Ac>3 & Ac<6 ))          %# (5,6,7,8)
%# prevents double expansion
%# similar for length(), nnz(), sum(),
%# in the same order as (1)-(4)

count = numel(A( abs(A-(6+3)/2)<3/2 ))   %# (9,10,11,12)
%# prevents double comparison and & 
%# similar for length(), nnz(), sum()
%# in the same order as (1)-(4)

所以,让我们测试一下最快的方法。 测试代码:

A = randi(10, 50);
tic
for ii = 1:1e5

    %# method is inserted here

end
toc

结果(最好5次运行,全部以秒计):

%# ( 1): 2.981446
%# ( 2): 3.006602
%# ( 3): 3.077083
%# ( 4): 2.619057
%# ( 5): 3.011029
%# ( 6): 2.868021
%# ( 7): 3.149641
%# ( 8): 2.457988
%# ( 9): 1.675575
%# (10): 1.675384
%# (11): 2.442607
%# (12): 1.222510

所以count = sum(( abs(A(:)-(6+3)/2)<3/2 ));似乎是最好的方式。

个人记录:我没想到比较比Matlab中的算术要慢 - 有没有人知道对此的解释?

另外:与nnz相比,为什么sum这么慢?我想现在我知道比较比算术慢......

答案 2 :(得分:3)

length(A(A>3 & A<6))

答案 3 :(得分:2)

Accumarray是为了做这些事情:

count = accumarray(A(A>3 & A<6),1)

返回

>> count'
ans = 
       0  0  0  2  2

你可以求和:

count = sum(count);

第一个零对应于我们忽略的1,2,3的出现次数。

甚至更简单:

count = sum(A(:)>3 & A(:)<6);

答案 4 :(得分:0)

您可以使用matlab for-loop并循环浏览您自己的值。优点是可以指定任何功能(&gt; 2&amp;&lt; 5;&gt;&amp;&lt; 6;等等),缺点是它是一种沉重的方法。这是近似代码:

count = 0;
for i=1:length(A)
  element = A(i);
  if (element > 2 && element < 5) 
    count = count + 1;
  end
end