在 Matlab 中存储结构的动态数组

Storing a dynamic array of structures in Matlab

我是 Matlab 新手,我想执行以下操作。

我有 2500 个数据点可以聚类成 10 个组。我的目标是找到最接近质心的每个集群的前 5 个数据点。为此,我执行了以下操作。

1) 求出每个点到每个质心的距离,分配离每个数据点最近的簇。

2) 将数据点的索引(1,...,2500)和对应的距离存储在一个cluster{index}数组中(不确定这应该是什么数据类型),其中index = 1,2, ...,10。

3) 遍历每个簇以找到 5 个最接近的数据点。

我的问题是我不知道每个集群中将存储多少数据点,所以我不知道我的集群应该使用哪种数据类型以及如何在步骤 2 中添加它们。我认为元胞数组可能是我需要的,但我需要一个用于数据点索引,一个用于距离。或者我可以创建一个结构元胞数组(每个结构由 2 个成员组成 - 索引和距离)。再一次,我怎么能动态地添加到每个集群呢?

我建议您将数据保存在普通数组中,这通常在 Matlab 中运行最快。

你可以这样做:(假设 p 是一个 n=2500 by dim 数据点矩阵,c 是一个 m=10 by dim 质心矩阵):

dists = zeros(n,m);
for i = 1:m
  dists(:,i) = sqrt(sum(bsxfun(@minus,p,c(i,:)).^2,2));
end

[mindists,groups] = min(dists,[],2);

orderOfClosenessInGroup = zeros(size(groups));
for i = 1:m
  [~,permutation] = sort(mindists(groups==i));
  [~,orderOfClosenessInGroup(groups==i)] = sort(permutation);
end

然后 groups 将是一个 n1 值矩阵 1m 告诉你相应的数据点最接近哪个质心,并且 orderOfClosenessInGroup 是一个 n by 1 矩阵,告诉您每个组内的接近顺序(orderOfClosenessInGroup <= 5 将为您提供一个逻辑向量,其中数据点位于 5在他们的组中最接近他们的质心)。为了说明这一点,请尝试以下示例:

n = 2500;
m = 10;
dim = 2;
c = rand(m,dim);
p = rand(n,dim);

然后运行上面的代码,最后绘制数据如下:

scatter(p(:,1),p(:,2),100./orderOfClosenessInGroup,[0,0,1],'x');hold on;scatter(c(:,1),c(:,2),50,[1,0,0],'o');
figure;scatter(p(orderOfClosenessInGroup<=5,1),p(orderOfClosenessInGroup<=5,2),50,[0,0,1],'x');hold on;scatter(c(:,1),c(:,2),50,[1,0,0],'o');

这会给你一个看起来像这样的结果:

还有这个: