如何将向量中的大多数重复出现元素更改为一次?

时间:2015-10-25 11:11:44

标签: matlab vector

如何将向量中的大多数重复出现元素更改为一次?

例如,我想将y = [45 65 67 65 60 70 65]转换为[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)] [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)] public sealed class EntrianInlineWatchPackage : Package ... ,这里最常见的元素是45,不需要考虑第2,第3频繁元素,因此这个独特的功能对此没有帮助。

有人可以为此建议解决方案吗?

2 个答案:

答案 0 :(得分:1)

使用histc计算元素的频率,然后使用最常用的元素和那些不常用的元素构建f='Vilar_data.xls'; data=readtable(f); variables=data.Properties.VariableNames; %get variable names for i=variables, data(1:end,{i}) %attemt to iterate over the data by column headings end

y

如果您希望保持与>> x = [45 45 65 45 67 65 45 60 70 65 45]; >> u = unique(x); >> [~, ind] = max(histc(x, u)); >> y = [u(ind) x(x ~= u(ind))] y = 45 65 67 65 60 70 65 相同的排序顺序,但删除最常用的元素,则可以使用

构建x
y

给予

s = find(u(ind) == x, 1, 'first');
y = [x(1:s) x([u(ind)*ones(1, s) x(s+1:end)] ~= u(ind))]

注意:如果您使用的是MATLAB R2014b或更高版本,则应使用histcounts代替histc

答案 1 :(得分:1)

根据烧杯的建议,您可以使用mode查找最常出现的数字,然后确定一个逻辑数组,我们可以在其中找到所有这些模式的位置。现在,我们需要做的只是记住模式第一次出现,所以我们第一次在这个逻辑数组中遇到true时需要find,并将此位置设置为{{1}在这个数组中。

现在,我们只需使用此数组的 inverse 索引到原始数组即可实现您想要的效果:

false

我们得到:

x = [45 45 65 45 67 65 45 60 70 65 45]; %// Your data

%// Find logical array which finds all of the locations equal to the most occurring number
ind = x == mode(x);

%// Set the first time we see this number to false
ind(find(ind,1)) = 0;

%// Index into the data with the opposite to get what we want
y = x(~ind);