配列内における特定の​行(または列)の出現​回数を求める

0,1が19×10000格納されているデータがあります。
0 0 0
1 1 1
1 1 1
1 1 0
1 1 1
1 1 1
1 1 1
0 0 0
0 0 0  …
0 0 0
0 0 0
1 1 1
0 0 0
0 0 0
1 1 1
1 1 1
1 1 1
0 0 0
行ごとの0,1パターンが、この配列で何回出現しているかカウントしたいです。
上記の例
[0 1 1 1 1 1 1 0 0 0 0 1 0 0 1 1 1 0] が2回
[0 1 1 0 1 1 1 0 0 0 0 1 0 0 1 1 1 0] が1回
良い解決策をお持ちの方、ご意見をお聞かせいただけると幸いです。

 채택된 답변

Atsushi Ueno
Atsushi Ueno 2023년 1월 18일
편집: Atsushi Ueno 2023년 1월 19일

0 개 추천

>良い解決策をお持ちの方、ご意見をお聞かせいただけると幸いです
行ごとの0,1パターンを10進数に変換し一つの値として捉えるのはどうでしょうか?
そうすれば、histcounts関数を使って各値の出現回数をカウントする事ができます。
bits = 19; % 20230109追記:ビット数を即値⇒変数化
dat = randi(2,[bits,10000]) - 1; % 0,1が19×10000格納されているデータ
dec = bin2dec(num2str(dat')); % 19桁の2進数とみなし、一旦10進数に変換する
N = histcounts(dec,2^bits); % histcounts関数で各パターンの出現回数をカウントする
%for k = 1:numel(bin) % 要件違いの為削除
% disp([dec2bin(bin(k-1)) 'が' num2str(N(bin(k))) '回']);
%end
for k = 1:2^bits % histcountのビン数だけ表示する
disp([dec2bin(k-1) 'が' num2str(N(k)) '回']);
end

댓글 수: 4

Atsushi Ueno
Atsushi Ueno 2023년 1월 18일
histcounts関数の動作は、histogram関数で対象をプロットするとイメージしやすいです。
今回はビンの数をパターン数と同じ2^19=524288にしました。各値の出現回数を各ビンが数えます。
dat = randi(2,[19,10000]) - 1; % 0,1が19×10000格納されているデータのサンプル
dec = bin2dec(num2str(dat')); % 19桁の2進数とみなし、一旦10進数に変換する
h = histogram(dec,2^19); % 2^19=524288通りの内、多くの値が1回出現、たまに2回出現、稀に3回出現する
mi
mi 2023년 1월 18일
迅速なご回答ありがとうございます。
早速実行したところ、やりたかったことができました。
実行結果の表示について1つ質問ですが、以下のように「〇〇が△△回」が複数回繰り返し表示されるのには理由がありますでしょうか。
自力では理解できなかったため、よろしくお願いいたします。
>>10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001110001011048
10100001101101010124
10100001101101010124
10100001101101010124
10100001101101010124
10100001101101010124
10100001101101010124
10100001101101010124
10100001101101010124
10100001101101010124
10100001101101010124
10100001101101010124
1010000111010101103
1010000111010101103
1010000111010101103
Atsushi Ueno
Atsushi Ueno 2023년 1월 19일
すいません私の要件解釈違いでした。回答の方を修正しました。またビット数が複数回出現したので即値(悪習慣)⇒変数(良習慣)に置き換えました。
必要なのは「行ごとの0,1パターンが、この配列で何回出現しているかカウント」する事でしたね。言い訳すると、初めはビット数を少なくして、各データ(10000個全て)がパターン数と同一に設定したビン数のそれぞれに入ったかを表示して確認していました。
Atsushi Ueno
Atsushi Ueno 2023년 1월 19일
もう一つバグがありました。気付かれない様にしれっと直しました。
【誤】
disp([dec2bin(bin(k)) 'が' num2str(N(bin(k))) '回']);
【正】
disp([dec2bin(bin(k-1)) 'が' num2str(N(bin(k))) '回']);

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

제품

릴리스

R2022b

태그

질문:

mi
2023년 1월 18일

댓글:

2023년 1월 19일

Community Treasure Hunt

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

Start Hunting!