web-dev-qa-db-ja.com

マトリックス内の特定の値の要素数をカウントするにはどうすればよいですか?

マトリックスに値が表示される回数をカウントする方法を知っていますか?

たとえば、平日(1-7)の値を格納する1500 x 1マトリックスM(ベクトル)がある場合、日曜日(1)、月曜日(2)、... 、Saturdays(7)はM?に格納されます

70
Niko Gamulin

配列の一意の値を決定して数える をご覧ください。

または、5の出現回数をカウントするには、単に

sum(your_matrix == 5)
97
aioobe

一意の要素を数えるために考えられるすべての方法のリストを次に示します。

M = randi([1 7], [1500 1]);

オプション1:集計

t = tabulate(M);
counts1 = t(t(:,2)~=0, 2);

オプション2:hist/histc

counts2_1 = hist( M, numel(unique(M)) );
counts2_2 = histc( M, unique(M) );

オプション3:accumarray

counts3 = accumarray(M, ones(size(M)), [], @sum);
%# or simply: accumarray(M, 1);

オプション4:ソート/差分

[MM idx] = unique( sort(M) );
counts4 = diff([0;idx]);

オプション5:arrayfun

counts5 = arrayfun( @(x)sum(M==x), unique(M) );

オプション6:bsxfun

counts6 = sum( bsxfun(@eq, M, unique(M)') )';

オプション7:スパース

counts7 = full(sparse(M,1,1));
73
Amro

1から7までのすべての値に対してこの操作を一度に実行する1つの方法は、関数 ACCUMARRAY を使用することです。

>> M = randi(7,1500,1);  %# Some random sample data with the values 1 through 7
>> dayCounts = accumarray(M,1)  %# Will return a 7-by-1 vector

dayCounts =

   218       %# Number of Sundays
   200       %# Number of Mondays
   213       %# Number of Tuesdays
   220       %# Number of Wednesdays
   234       %# Number of Thursdays
   219       %# Number of Fridays
   196       %# Number of Saturdays
10
gnovice

wに週番号が含まれていると仮定します([1:7])

n = histc(M,w)

mの数値の範囲がわからない場合:

n = histc(M,unique(M))

コマンドによるSQLグループなどです。

5
Babak

これは、行列に対して操作を行う完璧な原因であり、答えは単一の数値でなければなりません

sum(sum(matrix==value))
4
radhe_shyam

これは、Matlab Central File Exchangeで利用可能な非常に優れた関数ファイルです。

countmember.mリンク

この関数ファイルは完全にベクトル化されているため、非常に高速です。さらに、aioobeの答えで言及されている関数と比較して、この関数はaccumarray関数を使用しないため、Matlabの古いバージョンとも互換性があります。また、数値配列だけでなくセル配列でも機能します。

解決策:この関数は、組み込みのmatlab関数 "unique"と組み合わせて使用​​できます。

occurance_count = countmember(unique(M)、M)

happenance_countはunique(M)と同じサイズの数値配列であり、occurance_count配列の異なる値はunique(M)の対応する値(同じインデックス)のカウントに対応します。

3
Abhinav

Sumではなくnnzを使用します。行列をベクトルに折りたたむための二重呼び出しの必要はなく、おそらく和よりも高速です。

nnz(your_matrix == 5)

ドキュメント

2
Andy Campbell