2016-10-07 9 views
1

最初に最も頻繁に使用される要素は、modeです。 iの最も頻繁な要素を見つけるには、データセットの最も頻繁な要素であるi-1まで、最初の最も頻繁な要素、2番目に頻繁な要素、...を削除し続けるよりも良い方法はありません。MATLABでループを使用せずにベクトルの "i"番目の要素を見つける方法はありますか?

for n=1:size(data,1) 
    if n~=i 
     data = data(data(:,1) ~= mode(data(:,1)), :); 
    else 
     item = data(data(:,1) == i, :); 
    end 
end 

ループ処理ではなくベクトル化を使用して、これを行うより高速な方法がありますか?

+0

あなたのデータの範囲は何ですか? – beaker

+0

私は一般的な質問としてこれを求めています。私の特定のケースでは、データはかなり大きい(約6000万行)。しかし、この質問の目的とは無関係です。それとも? – Kristada673

+2

'histcounts'またはその親戚の1つを使用する予定がある場合は意味があります。そして、配列のサイズではなく、値の範囲について質問していました。 – beaker

答えて

4

を利用することができています。例えば

function [val, count] = getnthmost(x, n) 
% Get unique values in x (uniquevals) and their location (ic) 
[uniquevals, ~, ic] = unique(x); 

% Accumulate the indices and sort in descending order 
[bincounts_sorted, idx] = sort(accumarray(ic, 1), 'descend'); 

% Get the nthmost value and its count 
val = uniquevals(idx(n)); 
count = bincounts_sorted(n); 
end 

と小さな例:

返し
x = randi(5, 10, 1); 
[val, count] = getnthmost(x, 2); 

x = 

    2  5  1  2  2  1  3  4  3  4 


val = 

    1 


count = 

    2 

sortハンドル '絆' のことを、彼らはに表示されている順序でソート方向に関係なく配列がソートされているので、[1, 2, 3, 2] ou昇順ソートインデックスは[1, 2, 4, 3]、降順ソートインデックスは[3, 2, 4, 1]となります。

チュートリアル

当社は、入力配列、xに一意の値のすべてを見つけるためにここにuniqueを使用しています。オプションの第3の出力も格納されます。これは、xの値を一意の値の配列のインデックスにマッピングしたものです。次にaccumarrayを使用して1の要素を、uniqueから得た添字を使用して累積することができます。言い換えれば、我々は各指標のカウントを取得しています。このカウントを降順でソートし、出力インデックスを格納するので、カウントをユニークな値の配列の値に戻すことができます。 nを使用して、適切な値を選択して返すことができます。ここで

2

は、我々は、データセットは、この値が含まれていると仮定:

data = [5 5 4 2 5 8 8 5 8 4 ]; 

あなたがmodeを述べたように、最も頻度の高い項目を見つけるために最善の方法です。 しかし、最も頻繁にi番目のアイテムを見つけるには、各エレメントの繰り返し数を示すデータのhistogramを調べます。 Matlab の 関数は、ヒストグラムを計算するための関数です。 histの最初の引数はデータであり、それらは、この例におけるように、第2引数は、要素の一意の値を[2 4 5 8〕要素

unqiue値

unique_val = unique(data); 
2 4 5 8 

計算ヒストグラム

[count val] = hist(data, unique_val); 

ヒストグラムをプロットすると、

hist(data, unique_val); 

ので、我々は、このような姿を持っている:....

 _ 
     _ _ 
    _ _ _ 
_ _ _ _ 
2 4 5 8 

は、視覚的に我々は5が最も頻繁項目及び8は、2番目に多い項目である第一であることがわかり

をしかし、数値的に、我々はソートできる項目を見つけるために、

_ 
_ _ 
_ _ _ 
_ _ _ _ 
5 8 4 2 

そう5は第8我々はカウントとval連結MATLABで第....

である:降順のヒストグラムは、図を取得しますas freq

freq = [count; val].'; 

次に、最初の列countに基づいてfreqをソートします。 (マイナス記号は、ソートし、1を下降するためのものであるが、最初の列のためのものである):

out = sortrows(freq , -1) 

次いでout(i,2)は、i番目の最も頻度の高い項目です。これにリードを説明したもののすべて要するに :

%find count of data 
[count val] = hist(data(:,1),unique(data(:,1))); 
freq = [count; val].'; 
%sort counts descendingly 
out = sortrows(freq,-1); 

out(i,2)は、i番目のあなたは、あなたのデータ配列にユニークな値のためのビンカウントを生成するaccumarrayuniquesortを最も頻繁要素

2

は方法です。この例では

x = [2 2 3 1 5 1 1 3 3 3 4 1 2 5 4 3 1 3 3 4]; % data 
ii = 2; % find tthe second most frequent value 
sx = sort(x); % sort x 
ind = [true diff(sx)~=0]; % logical index of each new value in the sorted vector 
counts = diff(find([ind true])); % count of each unique value 
vals = sx(ind); % unique values 
[~, is] = sort(counts, 'descend'); % counts in decreasing order 
result = vals(is(ii)); % value with the ii-th largest count 

>> vals 
vals = 
    1  2  3  4  5 
>> counts 
counts = 
    5  3  7  3  2 
>> result 
result = 
    1 
関連する問題