2017-06-13 69 views
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)]; 

雖然我在這裏,不知道卡如何前進。誰能幫忙?

回答

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'第二列,然後accumarray基地(a元素)。之後,在第二列中找到第一列中具有累加和的元素。因此,這些元素在a中重複一次。最後,從A的第一列中刪除它們。

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元素。

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中引入的。

tmp=tmp(hist(M,tmp)==1); 
1

這是更便宜的選擇:對於早期版本,hist可以通過更換符合此使用

[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 

這裏是八度測試的結果*以下輸入:

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. 

*由於倍頻histcounts尚未實現所以不是histcounts我用hist

您可以試一試Online