2016-08-26 90 views
2

我有一個兩列列表。第一列是主題號碼,第二次會話號碼(即,當主題第二次進入時,會話號碼是2,以及對於每次訪問等等)。刪除具有相同第一列和最小第二列的行

SubMasterList = [6004 1; 6004 2; 6008 1; 6008 2; 6010 1; 6012 1; 6012 2; 6012 3] 

我想SubMasterList只包含1列具有最大會話數(第2欄)的主題。這樣才能似乎是:

SubMasterList = [6004 2; 6008 2; 6010 1; 6012 3] 

回答

6

您可以使用sortrows後您提取使用的unique

SubMasterList = [6004 1; 6004 2; 6008 1; 6008 2; 6010 1; 6012 1; 6012 2; 6012 3]; 
tmp = sortrows(SubMasterList,-2); %sort, with descending order to ensure the highest number is on top 
[~,idx,~]=unique(tmp(:,1)); %extract indices 
Result = tmp(idx,:) %index the sorted array to obtain the result 

Result = 
     6004   2 
     6008   2 
     6010   1 
     6012   3 
+1

這可以通過去除'flipud'功能和使用''中功能sortrows'進一步提高-2'代替'2'這將排序第二列的行按降序排列。 –

+0

@Sardar_Usama我已經在尋找'sort'-like''descending''選項;我不知道這工作。謝謝! – Adriaan

2

也許第二輸出效率不高,因爲@Adriaan的回答從數組的索引:

A = [6004 1; 6004 2; 6008 1; 6008 2; 6010 1; 6012 1; 6012 2; 6012 3]; 

[C,~,ic] = unique(A(:,1)); 
B = A(:,2); 
for ii=1:max(ic) 
    D(ii,1) = max(B(ic==ii)); 
end 
SubMasterList = [C D]; 


SubMasterList = 

     6004   2 
     6008   2 
     6010   1 
     6012   3 
+1

有趣的是,除了我得到的那個,我看到你使用了'unique'的所有輸出。好答案。 – Adriaan

+1

這是什麼使每個答案'獨特',:) – NKN

+0

我應該時間的差異,但它現在太多睡前時間;)我想它會顯着的差異,只有當行數超過10,000左右。你的代碼實際上可能比我所有的陣列觸發器更容易理解。完美點:初始化'D'。你知道它會有多大(即'C'的大小),而且在大型數組中會快很多。 – Adriaan

4

你想要的是一個幾乎accumarray定義:-)只需使用unique基於第一列設置標籤。您的基體,並傳遞作爲第一輸入到accumarray

[x, ~, u] = unique(SubMasterList(:,1)); 
y = accumarray(u, SubMasterList(:,2), [], @max); 
result = [x y]; 
+1

@Adriaan'accumarray'不像'arrayfun'那樣是變相的循環。這應該比'for'或'arrayfun'更快。但是現在誰知道,隨着JIT循環越來越快... –

+0

哦,有趣。我以爲'accumarray'也做了循環。我從來不會太老,我想 – Adriaan

+0

@Adriaan當然,它必須這樣做。但它有一個快速的名字,與'arrayfun'不同 –

相關問題