2012-06-29 29 views
2

所以我有一組兩個x,y,z點的列表。Matlab原生方法消除xy點

List1 and List2. 

我想刪除List1中也存在於List2中的所有點。在這個例子中,List2中的大部分點(可能是100%)都會存在於List1中。例如:

列表1

1, 2, 3 
4, 5, 6 
7, 8, 9 

列表2

7, 8, 9 

輸出

1, 2, 3 
4, 5, 6 

這將發生在數千次列表的大小分的。顯然這可以通過循環List2和搜索具有O(n * m)時間的列表1來完成。有更快,更matlab原生的方式來做到這一點?

感謝您的幫助。

+0

根據你的Matlab版本,看看['intersect'函數](http://www.mathworks.com.au/help/techdoc/ref/intersect.html)?像'intersect(List1,List2,'rows')''? (如文章中所述,關注'intersect'的遺留/未來版本的陷阱) –

回答

4

嘗試:SETDIFF(List1, List2, 'rows')

(我不知道這是多麼有效,但因爲它是一個本地方法它可能優化。)

+0

您應該提及,您可以使用'setOrder'參數來指定輸出應該排序還是穩定(如果有的話)。 – tmpearce

2

@ Turix的setdiff選項應該工作。 (只是踢)另一種選擇是

List1(~ismember(List1,List2,'rows'), :); 
2

我發現了一個稍快(儘管不那麼普遍)的方式來做到這一點。首先回答這樣忍耐一下,因爲我學的格式...

我沒有發現任何值得一提的尺度效應,所以我會作爲一個例子使用下面的列表對象:

example_step=3; 
max_value_outer=example_step*333; 
max_value_inner=example_step*33; 
List1=[1:example_step:max_value_outer; 2:example_step:max_value_outer; 3:example_step:max_value_outer]'; 
List2=[1:example_step:max_value_inner; 2:example_step:max_value_inner; 3:example_step:max_value_inner]'; 

Turix的內置setdiff通話提供最好的結果,到目前爲止,運行下面的代碼塊中僅有不足3秒:

tic; 
    for i=1:10000 result=setdiff(list1,list2,'rows'); 
    end; 
toc 
>> Elapsed time is 2.821303 seconds. 

然而,如果您的示例數據集代表的事實,即數據是矢量,整數,和在一個合理的有限那麼你可以通過com來加快速度通過使用sub2ind削減線性指數相當於代替三重,就像這樣:

range=max_value_outer*ones(1,3); 
[c,ia] = setdiff(sub2ind(range,List1(:,1),List1(:,2),List1(:,3)), sub2ind(range,List2(:,1),List2(:,2),List2(:,3))); result=List1(ia,:); 
    result=List1(ia,:); 

如果運行10000次比較受行的直接setdiff,你得到這個

tic; 
for i=1:10000 
    range=max_value_outer*ones(1,3); 
    [c,ia] = setdiff(sub2ind(range,List1(:,1),List1(:,2),List1(:,3)), sub2ind(range,List2(:,1),List2(:,2),List2(:,3))); 
    result=List1(ia,:); 
end; 
toc 
>> Elapsed time is 2.285992 seconds. 

所以一在執行時間從setdiff(,,'row)中減去%20左右,從for循環實現(未顯示)中減少大約98%。具體取決於您的數據看起來像什麼,我可以考慮一些可能會進一步加快速度的想法。例如,如果您考慮的maximum_value與內存相比相對較小,則可以通過將樣本空間映射到內存上,然後使用來自List1的線性索引設置高位,然後使用來自List2的集合來設置線性索引他們低。任何保持高位的位都在List1上,而不在List2上。有一個簡化版本here,雖然我不擔保該實施。

希望有幫助!