Vectorize octave/matlab代码

Ste*_*ing 2 matlab matrix vectorization octave

以下是八度代码(kmeans的一部分)

centroidSum = zeros(K);
valueSum = zeros(K, n);
for i = 1 : m  
  for j = 1 : K    
    if(idx(i) == j)
      centroidSum(j) = centroidSum(j) + 1;
      valueSum(j, :) = valueSum(j, :) + X(i, :);
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

代码有效,是否可以对代码进行矢量化?没有if语句很容易对代码进行矢量化,但是如何使用if语句对代码进行矢量化?

A. *_*nda 6

我假设代码的目的是计算mn维空间中一组数据点的子集的质心,其中点存储在矩阵中X(点x坐标),向量idx为每个数据点指定子集( 1 ... K)这个点属于.然后部分矢量化是:

centroid = zeros(K, n)
for j = 1 : K
   centroid(j, :) = mean(X(idx == j, :));
end
Run Code Online (Sandbox Code Playgroud)

if由索引消除,在特定的逻辑索引:idx == j给出一个布尔阵列,其指示哪些数据点属于子集j.

我认为也可能摆脱第二个for循环,但这会导致非常复杂,难以理解的代码.