Извлечение точек данных из матрицы и сохранение их в разных матрицах в MATLAB - PullRequest
1 голос
/ 30 мая 2010

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

45.987543423,5.35000964
52.987544223,5,98765234

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

2,0,3,1

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

Ответы [ 5 ]

1 голос
/ 30 мая 2010

Вместо динамического создания набора матриц я бы создал массив ячеек с каждой матрицей в отдельной ячейке. Вот один из способов сделать это, используя функции 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 голос
/ 30 мая 2010

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

0 голосов
/ 29 мая 2014

Я бы создал трехмерный массив или таблицу. Таким образом, кластерный индекс будет связан с кластером. Что-то вроде следующей конструкции:

 xData = Data(:,1);
 yData = Data(:,2);

 clusterTable = table(Cluster, xData, yData);

Это создает таблицу с именами столбцов, а каждая строка имеет индекс кластера и набор координат.

0 голосов
/ 30 мая 2010

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

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

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

0 голосов
/ 30 мая 2010

Я думаю, что это решение:

данные (кластер == i,:)

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...