4

私はマトリックスを持っています

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

値が3より大きく6より小さい要素の数を数えたいです。

4

5 に答える 5

8
flatA = A(:);
count = sum(flatA > 3 & flatA < 6);
于 2012-08-18T06:10:09.673 に答える
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ですか?比較は算術よりも遅いことがわかったので、それは理にかなっていると思います...

于 2012-08-18T08:42:25.807 に答える
3
length(A(A>3 & A<6))
于 2012-08-18T08:06:41.657 に答える
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);
于 2012-08-18T06:09:24.290 に答える
0

matlab for-loopを使用して、自分で値を循環させることができます。長所は、任意の関数を指定できることです(> 2&<5;> 3&<6;など)。短所は、それが一種の重いアプローチであるということです。おおよそのコードは次のとおりです。

count = 0;
for i=1:length(A)
  element = A(i);
  if (element > 2 && element < 5) 
    count = count + 1;
  end
end
于 2012-08-18T06:05:33.887 に答える