2014-11-05 38 views
1

你好StackOverflow社區,MATLAB - 如何比較數據集中的值並將其分配給集羣?

我很難包圍我在MATLAB中遇到的問題。

我有一個矩陣,看起來像這樣:

enter image description here

這是一個非常大的數據集簇表。

我有一個輔助表,它也非常大,是5000x4。這第二張表只包含整數。我該如何讓軟件比較此輔助表中的列13中的值與第一個表中的值,然後使代碼根據哪個組合的值最接近第二個表中的值?

例如,輔助表有一行值爲141, 162, 239, 1。通過查看它,我可以看出它屬於羣集表的第1行。但我無法通過數千行手動檢查它。

4現在可以忽略不計,因爲它將用於其他目的。如果我在這個問題上有些不清楚,請告訴我,我很難用英語解釋。任何建議將被認真考慮。

回答

1

你可以集羣中最小L2距離方面:

d = sqrt(bsxfun(@plus, sum(A.*A,2), sum(B.*B,2)') - 2 * A*B.').' 
[~,ic] = min(d,[],1) 

變量ic包含的A每一行的簇數(最接近行的索引B)。

(修剪過柱4,然後計算上述)

與4列實施例:

>> B = randi(255,3,4) 

B = 

    255 164 195 120 
    59 27 206 56 
    235 69 27 236 

>> A = B(randi(3,10,1),:) + randi(20,10,4) - 10 

A = 

    259 163 195 116 
    226 61 25 228 
    255 160 195 121 
    69 29 210 62 
    248 167 205 116 
    260 173 187 115 
    62 37 212 53 
    237 61 29 236 
    255 168 204 125 
    237 72 20 237 

>> d = sqrt(bsxfun(@plus, sum(A.*A,2), sum(B.*B,2)') - 2 * A*B.').'; 
>> [~,ic] = min(d,[],1) 
ic = 

    1  3  1  2  1  1  2  3  1  3 

也可以使用pdist2與任何其他距離度量你喜歡,或使用bsxfun與比較熟悉的配方:

d = squeeze(sqrt(sum(bsxfun(@minus,A,permute(B,[3 2 1])).^2,2))); 

或者kmeans ...

Reference 12

+0

這太棒了。就你所證明的那樣,我的工作起到了作用。但是,我認爲從這裏拿到它會很容易,而且我錯了。我對提出與此相關的另一個話題感到不滿。 可以說現在我有一個{ic}變量,其中的整數範圍從1到5.我怎麼說,如果{ic}值等於1或4以將+1添加到變量N,並且if看看它是否代表數組A列4中的值1是1還是4?我假設我需要使用for循環,但我無法解決它。 – Agito 2014-11-06 11:55:23

+0

無法編輯...續 - ic值和A行之間必須有連接。因此,如果ic值爲1或4,並且它代表來自A的行,而列4等於1 。 – Agito 2014-11-06 12:02:20