2016-01-01 4 views
2

Предположим, у меня есть следующие наборы данных:Как представить кластеры в MATLAB?

:

1 8 9 12 
2 1 0 35 
7 0 0 23 

B:

6 3 
1 9 
0 7 

То, что я хочу сделать, это для каждой строки в B, найти наименьшее значение и получить индекс столбца, из которого он появляется. Например, для строки 1 от B, наименьшая значение , который исходит из столбца . Поэтому добавьте строку 1 от A до Cluster 2.

В строке 2 из B, наименьшее значение равно 1 , которая поступает из колонны 1. Поэтому добавьте строку 2 от A до Cluster 1. И так далее ...

Теперь я хочу создать массив под названием C (это будет представлять мои кластеры) с 2 элементами. Пункт 1 содержит матрицу всех строк из A, которая должна быть в Cluster 1, а в пункте 2 представлена ​​матрица всех строк из A, которая должна быть в Cluster 2. Здесь у меня проблемы. Это моя нынешняя попытка:

function clusterSet = buildClusters(A, B) 
clusterSet = zeros(size(B, 2)); % Number of clusters = number of columns in B 
for i = 1:size(A, 1) 
    [value, index] = min(B(i,:)); % Get the minimum value of B in row i, and its index (column number) 
    clusterSet(index) = A(i,:); % Add row i from A to its corresponding cluster's matrix. 
end 
end 

Я получаю следующее сообщение об ошибке на последнюю строку (примечание: это явно не ссылаясь на «A» моих наборов данных и «B», но говорит о общем А и в):

In an assignment A(I) = B, the number of elements in B and I must 
be the same. 

Если минимальное значение B в строке 1 приходит из колонки 2, то строка 1 из а должны быть добавлены к матрице Cluster 2 (строка B соответствует какой строке а на добавьте в кластер, а столбец B представляет, какой кластер должен добавить его). Это то, что я хочу, чтобы эта строка делала, но я получаю вышеуказанную ошибку.

Любые предложения?

+0

Сделать 'C' массив ячеек. Тогда он может иметь элементы неравных размеров. – beaker

ответ

3

Вот путь без петель:

[~, cluster] = min(B,[],2); %// get cluster index of each row 
[clusterSort, indSort] = sort(cluster); %// sort cluster indices 
sz = accumarray(clusterSort,1); %// size of each cluster 
C = mat2cell(A(indSort,:), sz); %// split A into cell array based on clusters 
Смежные вопросы