从向量中删除单个元素

3
我有一个包含单独元素和重复元素的向量M。我想删除所有单独的元素,将类似于[1 1 2 3 4 5 4 4 5]的内容转换为[1 1 4 5 4 4 5]
我考虑获取每个元素的数量,然后使用索引删除不必要的元素,类似于以下代码:
uniq = unique(M);
list = [uniq histc(M,uniq)];

尽管我现在陷入困境,不确定该如何前进。有人能帮忙吗?
4个回答

2
这是使用 uniquehistcountsismember 的解决方案:
tmp=unique(M) ;            %finding unique elements of M
%Now keeping only those elements in tmp which appear only once in M
tmp = tmp(histcounts(M,[tmp tmp(end)])==1); %Thanks to rahnema for his insight on this 
[~,ind] = ismember(tmp,M); %finding the indexes of these elements in M
M(ind)=[];

`histcounts` 函数是在 R2014b 版本中引入的。对于早期版本,可以使用 `hist` 函数,只需将该行替换为以下内容:hist
tmp=tmp(hist(M,tmp)==1);

1
您可以使用以下代码获得结果:
A = [a.', ones(length(a),1)];
[C,~,ic] = unique(A(:,1));
result = [C, accumarray(ic,A(:,2))];
a = A(~ismember(A(:,1),result(result(:,2) == 1))).';

这个想法是,在a'的第二列中加上1,然后基于a的第一列(元素)用accumarray进行累计。之后,在第一列中找到在第二列中具有累积和的元素。因此,这些元素在a中重复一次。最后,从A的第一列中删除它们。

1
这里有一个更便宜的选择:
[s ii] = sort(a);
x = [false s(2:end)==s(1:end-1)]
y = [x(2:end)|x(1:end-1) x(end)]
z(ii) = y;
result = a(z);

假设输入为

a =

1   1   8   8   3   1   4   5   4   6   4   5

我们对列表 s 进行排序,并获取排序后的列表索引 ii
s= 

1   1   1   3   4   4   4   5   5   6   8   8

我们可以找到重复元素的索引,方法是检查一个元素是否等于前一个元素。

x =

我们无法翻译没有上下文的内容,请提供更多信息。
0   1   1   0   0   1   1   0   1   0   0   1

但是在x中,每个块的第一个元素被省略了。为了找到它,我们可以在每个元素与前一个元素之间应用[or]

 y = 

1   1   1   0   1   1   1   1   1   0   1   1

我们现在已经对重复元素进行了逻辑索引排序。它应该按照原始顺序重新排序。为此,我们使用已排序元素的索引ii
z =

1   1   1   1   0   1   1   1   1   0   1   1

最后使用z提取出仅重复的元素。
result = 

1   1   8   8   1   4   5   4   4   5

以下是Octave*测试的结果,针对以下输入:

a = randi([1 100000],1,10000000);

-------HIST--------
Elapsed time is 5.38654 seconds.
----ACCUMARRAY------
Elapsed time is 2.62602 seconds.
-------SORT--------
Elapsed time is 1.83391 seconds.
-------LOOP--------
Doesn't complete in 15  seconds.

*由于Octave中尚未实现histcounts函数,所以我使用了hist函数。

您可以测试它 在线


0
X = [1 1 2 3 4 5 4 4 5];
Y = X;
A = unique(X);
for i = 1:length(A)
    idx = find(X==A(i));
    if length(idx) == 1
        Y(idx) = NaN;
    end
end
Y(isnan(Y)) = [];   

然后,Y 将会是 [1 1 4 5 4 4 5]。它检测所有的单个元素,并将它们设为 NaN,然后从向量中移除所有的 NaN 元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接