我正在根据 Matrix 在 Matlab 上解决一个问题。我认为可以通过删除 for 循环来改进我的代码。但我真的不知道如何解决这个问题。任何人都可以帮助我吗? 代码是:
K = 3;
X = [1 2; 3 4; 5 6; 7 8];
idx = [1;2;3;1];
for i = 1:K
ids = (idx == i);
centroids(i,:) = sum(bsxfun(@times, X, ids))./ sum(ids);
end
在此代码中,数据点 X 为 4x2。有K=3个质心,所以质心是一个3x2的矩阵。此代码是 K 均值函数的一部分,该函数使用数据点及其最近的质心来查找质心的新位置。 我想将代码制作成没有 FOR 循环的代码,可能是这样开始的:
ids = bsxfun(@eq, idx, 1:K);
centroids = ..............
最佳答案
您可以通过使用逻辑索引来避免 bsxfun
,这似乎是一个值得的性能提升,至少对于小矩阵 X
而言。它最适合较小的 K
,以及 X
的少量行。
K = 3;
X = [1 2; 3 4; 5 6; 7 8];
idx = [1;2;3;1];
centroids=zeros(K,2);
for i = 1:K
ids = (idx == i);
centroids(i,:) = sum(X(ids,:),1)./sum(ids);
end
如果 X
有大量的行,这种方法是最快的:
K = 3;
X = [1 2; 3 4; 5 6; 7 8];
idx = [1;2;3;1];
centroids=zeros(K,2);
t=bsxfun(@eq,idx,1:K);
centroids=bsxfun(@rdivide,t.'*X,sum(t).');
如果 K
非常大,Luis 的 accumarray
方法是最快的。
关于matlab删除矩阵计算中的for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27594968/