2014-02-14 69 views
1

行值我有這種類型的數據在MATLAB總結在MATLAB

1 1 10 
1 2 10 
1 2 3 
2 1 1 
2 1 25 
2 3 4 

從上面的數據集我想是這樣的

1 1 10 
1 2 13 
2 1 26 
2 3 4 

基本上總結計數。我怎樣纔能有效地在MATLAB中做到這一點?

我的實際數據

 1653082  94751   1 
    1653082  133609   1 
    1653082  15712   1 
    1653082  15712   1 
    1653082  15712   1 
    1653082  87905   22 
+0

「求和計數」?你能解釋得更好嗎? –

+0

@LuisMendo。是的總結基本上是第三列的計數 – user34790

回答

1

uniqueaccumarray通常的組合可以做的工作:

data = [1653082  94751   1 
     1653082  133609   1 
     1653082  15712   1 
     1653082  15712   1 
     1653082  15712   1 
     1653082  87905   22]; 

[ii, ~, kk] = unique(data(:,1:2),'rows'); 
vv = accumarray(kk, data(:,3)); 
result = [ ii vv ]; 

在這個例子的結果是:

result = 
    1653082  15712   3 
    1653082  87905   22 
    1653082  94751   1 
    1653082  133609   1 
+0

我試着你的方法在我的實際數據顯示的問題,它顯示內存不足的問題? – user34790

+0

@ user34790那麼......如果你的數據非常大,我想這可能發生 –

+0

任何解決方案,我如何克服它。例如,我在 – user34790

1

sparse output option of accumarray解決了這些記憶問題,並消除了需求或unique。使用來自問題底部的實際數據:

>> R = accumarray(data(:,1:2),data(:,3),[],@sum,0,true) 
R = 
      (1653082,15712)     3 
      (1653082,87905)     22 
      (1653082,94751)     1 
      (1653082,133609)     1 
>> [ii,jj] = find(R); 
>> M = [ii jj nonzeros(R)] 
M = 
    1653082  15712   3 
    1653082  87905   22 
    1653082  94751   1 
    1653082  133609   1 
+1

您可以直接使用'R = sparse(data(:,1),data(:,2),data(:,3));'。 '稀疏'確實是一個隱含的'準確的' –

+0

的確如此。弗洛里斯一直提醒我這個選擇...我一直忘記。 :) – chappjc

+0

甚至'spconvert(數據)'!剛剛瞭解到那個功能 –