2015-11-03 100 views
1

我有一個單元格陣列,我需要將其拆分爲幾個矩陣,以便我可以獲取數據子集的總和。這是什麼,我有一個樣本:將矩陣拆分爲幾個,取決於Matlab中的值

A = {'M00.300', '1644.07';... 
    'M00.300', '9745.42'; ... 
    'M00.300', '2232.88'; ... 
    'M00.600', '13180.82'; ... 
    'M00.600', '2755.19'; ... 
    'M00.600', '15800.38'; ... 
    'M00.900', '18088.11'; ... 
    'M00.900', '1666.61'}; 

我想第二列的和每個「M00.300」,「M00.600」和「M00.900」的。例如,爲了對應'M00.300',我想要1644.07 + 9745.42 + 2232.88。

我不想只是硬編碼它,因爲每個數據集是不同的,所以我需要代碼適用於不同大小的單元陣列。

我不確定這樣做的最佳方式,我將首先循環遍歷A並比較第一列中的字符串並在該循環內創建矩陣,但這聽起來很亂而且效率不高。

有沒有更簡單的方法來做到這一點?

+0

所以,你要組數據由第一列(即M00.x00),然後選擇每個組的第N個元素並對它們進行求和? – GameOfThrows

回答

3

經典使用accumarray。您將使用第一列作爲索引,第二列作爲與每個索引關聯的值。 accumarray適用於將屬於同一索引的值組合在一起並將函數應用於這些值。在你的情況下,你會一起使用默認行爲和sum事情。

但是,您需要將第一列轉換爲數字標籤。 unique的第三個輸出將幫助你做到這一點。您還需要將第二列轉換爲數字數組,因此str2double是完成此操作的完美方式。

事不宜遲:

[val,~,id] = unique(A(:,1)); %// Get unique values and indices 
out = accumarray(id, str2double(A(:,2))); %// Aggregate the groups and sum 

format long g; %// For better display of precision 
T = table(val, out) %// Display on a nice table 

我得到這個:

>> T = table(val, out) 

T = 

     val   out 
    _________ ________ 

    'M00.300' 13622.37 
    'M00.600' 31736.39 
    'M00.900' 19754.72 

以上使用table類,可從R2013b及以後。如果你沒有這個,你也許可以用一個for循環,並分別打印出每一個細胞和值:

我們得到:

M00.300: 13622.370000 
M00.600: 31736.390000 
M00.900: 19754.720000 
+0

啊不錯的一個。你擊敗了我。剛剛開始寫準噶瑪。 – GameOfThrows

+0

@GameOfThrows謝謝:)對不起! – rayryeng

+0

@rayryeng謝謝!我以前不熟悉準噶爾人;這正是我所需要的,比我的其他嘗試更有說服力 –