如何匹配find函数matlab中使用的矩阵元素的数量

cpp*_*ner 5 matlab cluster-analysis machine-learning k-means

作为K-means聚类算法的一部分,我编写了一个函数来将训练样例分配给它们最近的质心.在我看来,尺寸是满意的,代码有时运行正确.但经常,我得到错误

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

为线

idx(i) = find(dist == value);
Run Code Online (Sandbox Code Playgroud)

这是代码

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
Run Code Online (Sandbox Code Playgroud)

这里有什么问题?

ray*_*ica 4

这是因为您可能会发现多个与查询点距离相同的簇。 find确定满足布尔条件作为参数的 所有值。idx(i)意味着您正在为数组的位置分配一个值idxfind可能会产生多个值,这会导致您看到的分配错误。

相反,使用第二个输出参数,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
Run Code Online (Sandbox Code Playgroud)