我有一個包含單個元素和重複的載體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)];
雖然我在這裏,不知道卡如何前進。誰能幫忙?
我有一個包含單個元素和重複的載體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)];
雖然我在這裏,不知道卡如何前進。誰能幫忙?
您可以用下面的代碼得到的結果:
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
的第一列中刪除它們。
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
元素。
下面是使用unique
,histcounts
和ismember
的溶液:
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);
這是更便宜的選擇:對於早期版本,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