我有一个形状如下的矩阵。我想在第一列中删除具有重复值的行,并在第二列中保留具有最小数量的重复值的行。我的矩阵 `d =
1 1
2 1
4 1
8 2
2 2
5 4
2 4
6 4
7 3
` 我想删除第一列中的重复数字2,并在第二行中保留具有最小数量的重复值的行 结果要求:
1 1
4 1
8 2
2 2
5 4
6 4
7 3
感谢您的帮助。最好的。
答案 0 :(得分:2)
我们可以对第一列的数组进行排序,并用降序计数替换第二列的元素 获得这个数组:
1 3
2 3
2 3
2 2
4 3
5 3
6 3
7 1
8 2
然后,如果我们对此数组应用唯一,可以获得所需行的索引,然后可以提取这些行:
1 1
2 2
4 1
5 4
6 4
7 3
8 2
如果需要保留原始数据,请在代码中注明更多步骤。
a=[...
1 1
2 1
4 1
8 2
2 2
5 4
2 4
6 4
7 3];
%steps to replace counts of each element of column2 with it
[a2_sorted, i_a2_sorted] = sort(a(:,2));
[a2_sorted_unique, i_a2_sorted_unique] = unique(a2_sorted);
h = hist(a2_sorted, a2_sorted_unique);
%count = repelems(h, [1:numel(h); h]);%octave
count = repelem(h, h);
[~,a2_back_idx] = sort(i_a2_sorted);
count = count (a2_back_idx);
b = [a(:,1) , count.'];
%counts shoule be sorted in descending order
%because the unique function extracts last element from each category
[b_sorted i_b_sorted] =sortrows(b,[1 -2]);
[~, i_b1_sorted_unique] = unique(b_sorted(:,1));
c = [b_sorted(:,1) , a(i_b_sorted,2)];
out = c(i_b1_sorted_unique,:)
%more steps to recover the original order
[~,b_back_idx] = sort(i_b_sorted);
idx_logic = false(1,size(a,1));
idx_logic(i_b1_sorted_unique) = true;
idx_logic = idx_logic(b_back_idx);
out = c(b_back_idx(idx_logic),:)
答案 1 :(得分:1)
根据左栏中的索引创建一个从右列中找到最小重复的函数:
function Out = getMinDuplicate (Index, Data)
Candidates = Data(Data(:,1) == Index, :); Candidates = Candidates(:, 2);
Hist = histc (Data(:,2), [1 : max(Data(:,2))]);
[~,Out] = min (Hist(Candidates)); Out = Candidates(Out);
end
为第1列中的所有唯一值调用此函数:
>> [unique(d(:,1)), arrayfun(@(x) getMinDuplicate(x, d), unique(d(:,1)))]
ans =
1 1
2 2
4 1
5 4
6 4
7 3
8 2
(其中d
是您的数据数组)。