在 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
将是一个 n
乘 1
值矩阵 1
到 m
告诉你相应的数据点最接近哪个质心,并且 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');
这会给你一个看起来像这样的结果:
还有这个:
我是 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
将是一个 n
乘 1
值矩阵 1
到 m
告诉你相应的数据点最接近哪个质心,并且 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');
这会给你一个看起来像这样的结果:
还有这个: