假设输入行向量已经排序(否则您可以通过调用sort()对其进行排序),您可以使用基于 find , diff & max 的方法 -
%// Find starting indices of each island of identical numbers being
%// appended by the numel()+1 with the intention of getting island lengths
%// later on by differentiating along the indices
start_ind = [0 find(diff(a)) numel(a)]+1
lengths = diff(start_ind)
%// Look for the islands with the max island lengths.
%// Use those to get unique numbers associated with them for final output
out = a(start_ind([lengths == max(lengths) false]))
基准测试
这是一个基准测试,用于比较目前列出的四种解决方案的运行时 -
a = randi(10000,1,1000000);
disp('---------------- With for-loop')
tic
values = unique(a);
counts = zeros(1,numel(values));
for i=1:numel(values)
counts(i) = sum(a == values(i));
end
output = values(counts == max(counts));
toc
clear output counts values
disp('---------------- With find+diff+max')
tic
sa = sort(a);
start_ind = [0 find(diff(sa)) numel(sa)]+1;
lengths = diff(start_ind);
out = sa(start_ind([lengths == max(lengths) false]));
toc
clear out lengths start_ind sa
disp('---------------- With mod')
tic
[~, ~, v] = mode(a);
result = v{1};
toc
clear v result
disp('---------------- With unique+hist+max')
tic
uVal = unique(a);
counts = hist(a,uVal);
out = uVal(counts == max(counts));
toc
运行时 -
---------------- With for-loop
Elapsed time is 32.879074 seconds.
---------------- With find+diff+max
Elapsed time is 0.077948 seconds.
---------------- With mod
Elapsed time is 0.136005 seconds.
---------------- With unique+hist+max
Elapsed time is 0.250994 seconds.
5 回答
您还可以使用accumarray与unique结合使用:
你可以这样做:
使用
hist
和unique
的备用矢量化方法结果:
mode的第三个输出就是这样 . 输入向量不需要排序 .
假设输入行向量已经排序(否则您可以通过调用sort()对其进行排序),您可以使用基于
find
,diff
&max
的方法 -基准测试
这是一个基准测试,用于比较目前列出的四种解决方案的运行时 -
运行时 -