matlab删除矩阵计算中的for循环

标签 matlab for-loop matrix vectorization

我正在根据 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/

相关文章:

javascript - 解码 Javascript For 循环

javascript - DIV 使用事件处理程序更改颜色 "click"

python - 在 python 中将下三角矩阵的索引作为一维列表的快速方法

c - 在 C 中打印矩阵时获取垃圾值

performance - Matlab:从循环中重复调用相同的 mex 函数是否会产生太多开销?

java - 从列表中删除第二项会导致 REST API 崩溃

matlab - 如何在matlab中获得整数除法的商?

javascript - 使用 SVGMatrix 的 HTML canvas 2D 转换文档

matlab - 用 NaN 替换矩阵的某些元素 (MATLAB)

Matlab:动画