У меня есть 2D Матрица, состоящая из некоторых координат как ниже (примера): Данные (X, Y):
45.987543423,5.35000964
52.987544223,5,98765234
Также у меня есть массив, состоящий из некоторых целых чисел> =0, например: Кластер (M)
2,0,3,1
каждое из этих чисел в этом массиве соответствует строке моей 2D Матрицы выше. Например, это говорит, что строка одна (координата) в Данных, Matirx принадлежит кластеру 2, вторая строка, принадлежит кластеру 0 и так далее. Теперь я хочу иметь каждую точку данных каждого кластера в отдельной матрице, например, я хочу сохранить точки данных, принадлежащие кластеру 1 в отдельной матрице, кластер 2 в отдельной матрице и так далее.... Я могу сделать их вручную, но проблема, это должно быть автоматическим извлечением. что означает, что количество кластеров (диапазон чисел в кластерном массиве варьируется по каждому выполнению), таким образом, у меня должен быть общий алгоритм, который делает это извлечение для меня. Кто-то может помочь мне?спасибо
Вместо динамического создания кучи матриц, я бы создал массив ячеек с каждой матрицей в отдельной ячейке. Вот один из способов сделать это, используя функции SORT и MAT2CELL:
[cluster,sortIndex] = sort(cluster); %# Sort cluster and get sorting index
data = data(sortIndex,:); %# Apply the same sorting to data
clusterCounts = diff([0 find(diff(cluster)) numel(cluster)]); %# Find size of
%# each cluster
cellArray = mat2cell(data,clusterCounts,2); %# Break up data into matrices,
%# each in a separate cell
Я полагаю, что это решение:
data(cluster == i, :)
где i
- индекс кластера. Ваша индексная матрица преобразуется в булеву матрицу и затем используется для индексации строк, а каждая выбранная строка полностью добавляется к результирующей матрице.
Если это не то, что вы ищете, пожалуйста, укажите свои потребности более четко.
Спасибо всем, мне удалось заставить его работать с помощью этого кода:
noOfClusters = max(cluster); %without noise
for i=1:noOfClusters
C(i,1) = {numData(cluster==i,:)}
end
Я предполагаю, что ваши коды намного быстрее, потому что вы не используете циклы for.
Вы можете использовать ARRAYFUN для распределения координат между различными массивами ячеек.
%# create sample data
clusterIdx = [2,0,3,1,1,1,3,2];
coordinates = rand(8,2);
%# first you get a list of unique cluster indices
clusterIdxUnique = unique(clusterIdx);
%# then you use arrayfun to distribute the coordinates
clusterCell = arrayfun(@(x)coordinates(clusterIdx==x,:),clusterIdxUnique,'UniformOutput',false);
Первый элемент clusterCell
содержит координаты, соответствующие первой записи в clusterIdxUnique
и т.д.