MATLAB Answers

0

複数の変数の値の組み​合わせをカウントし、​度数表にまとめる方法

Asked by Kohei Ouchi on 26 Sep 2019
Latest activity Commented on by Kohei Ouchi on 26 Sep 2019
d個の二値変数xi( 下の例ではd=3) があって、それぞれランダムに値を取った生データ(左下の表に図示)が与えられた時、その値の組み合わせ({0,0,...,0}から{1,1,...1}のものまで)2^d通りの、サンプル数をカウントして、それを1×2^dのベクトルNとして格納したいのですが、方法が分かりません。
具体的な例を以下の図で示します。ここでは、左の元データの中で{x1,x2,x3}の組み合わせが{0,0,0}のものが1個、{0,0,1}のものが2個、というように数えて右の表のようにまとめるという操作をしたいと考えています。

  0 Comments

Sign in to comment.

1 Answer

michio
Answer by michio
on 26 Sep 2019
 Accepted Answer

こちらでどうぞ!
% ユニークな要素
items = [1,1,1;
1,1,0;
1,0,1;
0,1,1;
0,0,1;
0,1,0;
1,0,0;
0,0,0];
% ユニークな要素を適当に繰り返してサンプルデータ作成
% data: 50x3の配列
idx = randi(8,50,1);
data = items(idx,:);
% まず unique を行単位で適用
[udata,~,index] = unique(data,'rows');
% index は udata の各行が data の何行目に存在したかを示す配列
udata
%% 手法1:forループで
datacount1 = zeros(length(udata),1);
for ii=1:length(udata)
datacount1(ii) = sum(index==ii);
end
% 並べると見やすい?
[udata,datacount1]
%% accumarray で
datacount2 = accumarray(index,1);
% 並べると見やすい?
[udata,datacount2]

  4 Comments

Show 1 older comment
Kohei Ouchi on 26 Sep 2019
ありがとうございます!
[udata,~,index] = unique(data,'rows');
の行ですが、 「index は udata の各行が data の何行目に存在したかを示す配列」とコメントして頂いていると思うのですが、それだと[udata,index,~]とするように感じます。
(ドキュメンテーションを参照しました)
認識に間違いがあればご指摘していただけると幸いです。よろしくお願いします。
スクリーンショット 2019-09-26 15.28.16.png
michio
on 26 Sep 2019
言葉で説明すると違いが難しいですね。失礼しました。
[C, ia, ic] = unique(A)
を例にとると
  • C: ユニークな要素
  • ia: Cの各要素が A で上から何要素目に初めて登場するか
  • ic: Aの各要素がCの何要素目に対応するか
というべきでしょうか。
必然的に ia は C 同じ行数、ic は A と同じ行数になります。
Kohei Ouchi on 26 Sep 2019
なるほど、理解できました。
丁寧に教えて頂き、本当にありがとうございます。

Sign in to comment.