好的,所以我将数据聚类到集群中,然后使用列对其进行索引。数据采用运动矢量的形式,因此我的数据在聚类后将如下所示:
[index x y x' y']
例如:
[1 3 5 4 6;
1 4 6 5 7;
2 3 5 4 6;
2 8 9 9 3;
3 2 3 2 4]
在上面的数组中有3个聚类,聚类1和2各包含2个向量。
我的问题是我有时必须根据某些标准删除群集,可能会留下:
[2 3 5 4 6;
2 8 9 9 3;
3 2 3 2 4]
我希望能够在删除后更正索引,以便从1开始并以群集数结束。所以在这种情况下,将2s替换为1s和3s替换为2s。
我确定必须有一个使用for循环的简单方法,但我已经尝试了一段时间而且不能正确吗?
答案 0 :(得分:1)
对unique
的简单调用将帮助您实现这一目标。您可以使用它的第三个输出,使用新数据矩阵(索引向量)的第一列来分配每个唯一ID和新ID,以替换其第一列。另外,请确保使用'stable'
标志,以便按照从上到下的顺序分配ID:
%// Data setup
A = [1 3 5 4 6;
1 4 6 5 7;
2 3 5 4 6;
2 8 9 9 3;
3 2 3 2 4];
%-----
B = A(3:end,:); %// Remove first two rows
%// Go through the other IDs and reassign to unique IDs from 1 up to whatever
%// is left
[~,~,id] = unique(B(:,1), 'stable');
%// Replace the first column of the new matrix with the new IDs
B(:,1) = id; %// Replace first column with new IDs
我们得到:
>> B
B =
1 3 5 4 6
1 8 9 9 3
2 2 3 2 4
答案 1 :(得分:1)
假设你的矩阵被称为data
,试试这个:
>> data = [2 3 5 4 6;
2 8 9 9 3;
3 2 3 2 4]
data =
2 3 5 4 6
2 8 9 9 3
3 2 3 2 4
>> data(:,1) = cumsum(diff(data([1 1:end], 1)) ~= 0) + 1
data =
1 3 5 4 6
1 8 9 9 3
2 2 3 2 4