matlab求函数中矩阵元素个数的匹配

matlab求函数中矩阵元素个数的匹配,matlab,machine-learning,cluster-analysis,k-means,Matlab,Machine Learning,Cluster Analysis,K Means,我编写了一个函数,将训练示例分配给它们最接近的质心,作为K-means聚类算法的一部分。在我看来,维度是令人满意的,代码有时运行是正确的。但我经常会出错 在赋值A(:)=B中,A和B中的元素数必须为 同样的 排队 idx(i) = find(dist == value); 这是密码 function idx = findClosestCentroids(X, centroids) K = size(centroids, 1); idx = zeros(size(X,1), 1); dist

我编写了一个函数,将训练示例分配给它们最接近的质心,作为K-means聚类算法的一部分。在我看来,维度是令人满意的,代码有时运行是正确的。但我经常会出错

在赋值A(:)=B中,A和B中的元素数必须为 同样的

排队

idx(i) = find(dist == value);
这是密码

function idx = findClosestCentroids(X, centroids)

K = size(centroids, 1);
idx = zeros(size(X,1), 1);
dist = zeros(K, 1);

for i = 1:size(X,1)
   for j = 1:K
       dist(j) = sum((X(i,:) - centroids(j,:)).^2);
   end
   value = min(dist);
   idx(i) = find(dist == value);
end

这里的问题是什么?

这是因为您可能会找到多个与查询点具有相同距离的集群
find
确定所有满足布尔条件的值作为参数
idx(i)
意味着您正在向
idx
数组的位置分配一个单个值,但
find
可能会产生多个值,并给出您看到的分配错误

相反,使用第二个输出参数
min
,它确定第一次出现的索引最小值,这正是您想要实现的:

function idx = findClosestCentroids(X, centroids)

K = size(centroids, 1);
idx = zeros(size(X,1), 1);
dist = zeros(K, 1);

for i = 1:size(X,1)
   for j = 1:K
       dist(j) = sum((X(i,:) - centroids(j,:)).^2);
   end
   [~,idx(i)] = min(dist); %// Change
end

rayryeng正确回答了您的问题,但您可能有兴趣尝试一种向量化方法
[~,idx]=min(sum(bsxfun(@减号,X,置换(质心,[3,2,1]))。^2,2),[],3)
,它可以让您跳过所有循环、预分配和临时矩阵,甚至可以压缩成一行。@Dan好主意:。。。那是深夜,我没有时间写下矢量化的解决方案。这是一个很好的评论。