2015-10-28 46 views
0

我是新來的MATLAB和我想行有類似值的(我有數千行)結合起來,例如MATLAB:有類似值的組合行

1 NaN 

1 NaN 

1 NaN 

2 9 

2 26.5 

2 21.5 

2 18 

2 24.5 

2 12 

2 22.5 

3 NaN 

3 NaN 

3 NaN 

3 NaN 

4 18.5 

4 22 

4 35.5 

... ... ...

1 NaN  NaN  NaN    

2 9  26.5 21.5 18  24.5 12 22.5 

3 NaN  NaN  NaN  NaN   

4 18.5 22  35.5   

任何一個可以請幫我這個?

+0

你確定你不只是要刪除所有'nan'條目?這很容易用'A(isnan(A))= [];'完成,假設你稱之爲矩陣「A」。 「9 26.5 21.5 18 24.5 12 22.5」幾乎沒有相似之處,除了它們都是數字而不是'nan'。做你所要求的,你會需要細胞,這可能不是你在這種情況下尋找的細胞。 – Adriaan

+0

這不能用普通的數組完成。每行必須具有相同的列數,但您所需的輸出不是這樣。如果您願意,您可以使用單元陣列。請確認這是你想要的,如果是這樣,我們可以使用這個。 – rayryeng

+0

rayryeng:我可以使用單元陣列,如果我可以像前面提到的那樣結合 – raghu

回答

1

這不能用普通數組完成。每行必須具有相同的列數,但您所需的輸出不是這樣。如果您願意,您可以使用單元陣列。

如果單元陣列是一個選項,解決這個恕我直言的最好方法是使用一個accumarray/sort/cellfun管道。首先使用accumarray將屬於同一個ID的所有值組合在一起,因此您的案例中的第一列。每個組因此將是一個單元陣列。但是,accumarray的後果是每個組中出現的值爲無序的。因此,您必須改爲將位置的值代替。您需要對這些位置進行排序,輸出是一個單元格數組,其中每個單元格都是您在原始數據中訪問的索引列表。

然後,您可以調用cellfun作爲使用索引訪問實際數據本身的最後一步。

想到這樣的事情,假設您的數據存儲在X,它是一個兩列數組。

ind = (1 : size(X,1)).'; %' 
out_ind = accumarray(X(:,1), ind, [], @(x) {sort(x)}); 
out = cellfun(@(x) X(x,2), out_ind, 'uni', 0); 

因此,我們得到:

>> celldisp(out) 

out{1} = 

    NaN 
    NaN 
    NaN 



out{2} = 

    9.0000 
    26.5000 
    21.5000 
    18.0000 
    24.5000 
    12.0000 
    22.5000 



out{3} = 

    NaN 
    NaN 
    NaN 
    NaN 



out{4} = 

    18.5000 
    22.0000 
    35.5000