Извлечение точек данных от матрицы и сохранение их в различных матрицах в MATLAB

У меня есть 2D Матрица, состоящая из некоторых координат как ниже (примера): Данные (X, Y):

45.987543423,5.35000964
52.987544223,5,98765234

Также у меня есть массив, состоящий из некоторых целых чисел> =0, например: Кластер (M)

2,0,3,1

каждое из этих чисел в этом массиве соответствует строке моей 2D Матрицы выше. Например, это говорит, что строка одна (координата) в Данных, Matirx принадлежит кластеру 2, вторая строка, принадлежит кластеру 0 и так далее. Теперь я хочу иметь каждую точку данных каждого кластера в отдельной матрице, например, я хочу сохранить точки данных, принадлежащие кластеру 1 в отдельной матрице, кластер 2 в отдельной матрице и так далее.... Я могу сделать их вручную, но проблема, это должно быть автоматическим извлечением. что означает, что количество кластеров (диапазон чисел в кластерном массиве варьируется по каждому выполнению), таким образом, у меня должен быть общий алгоритм, который делает это извлечение для меня. Кто-то может помочь мне?спасибо

1
задан Hossein 30 May 2010 в 13:20
поделиться

4 ответа

Вместо динамического создания кучи матриц, я бы создал массив ячеек с каждой матрицей в отдельной ячейке. Вот один из способов сделать это, используя функции 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
1
ответ дан 3 September 2019 в 00:13
поделиться

Я полагаю, что это решение:

data(cluster == i, :)

где i - индекс кластера. Ваша индексная матрица преобразуется в булеву матрицу и затем используется для индексации строк, а каждая выбранная строка полностью добавляется к результирующей матрице.

Если это не то, что вы ищете, пожалуйста, укажите свои потребности более четко.

0
ответ дан 3 September 2019 в 00:13
поделиться

Спасибо всем, мне удалось заставить его работать с помощью этого кода:

noOfClusters = max(cluster); %without noise
for i=1:noOfClusters
C(i,1) = {numData(cluster==i,:)}
end

Я предполагаю, что ваши коды намного быстрее, потому что вы не используете циклы for.

0
ответ дан 3 September 2019 в 00:13
поделиться

Вы можете использовать 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 и т.д.

1
ответ дан 3 September 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: