Хорошо, давайте пройдемся по этому
centroid = mean(x, 2);
принимает среднее значение по строкам, поэтому x
- это 3 строки и N столбцов. Это означает, что centroid
является вектором 3x1 [xC ; yC ; zC]
dist = sqrt(sum((x - repmat(centroid, 1, size(x, 2))) .^ 2, 1));
Давайте пройдем это снаружи внутрь
repmat(centroid, 1, size(x, 2))
создает матрицу с N копиями centroid
. Тогда -
берет разницу между точкой и центроидом, давая матрицу 3xN. .^2
просто возводит в квадрат каждый из элементов матрицы 3xN. sum( ... , 1 )
добавляется вдоль строки (то есть, добавляя x-, y- и z-компоненты вместе). Тогда sqrt
принимает квадратный корень.
Итак, ваш пример на python через код Matlab
x1 = [20, 30, 40, 50, 60, 30, 20, 40];
y1 = [12, 34, 56, 78, 89, 45, 90, 29];
x = [ x1 ; y1 ];
centroid = mean(x, 2);
dist = sqrt(sum((x - repmat(centroid, 1, size(x, 2))) .^ 2, 1));
dist'
ans =
45.1506159980127
21.0731612483747
4.19262745781211
27.5513724703507
42.1939346944558
11.0602045641118
39.3837291911266
25.4033093316599
И эквивалентный питон
x1 = np.array([20, 30, 40, 50, 60, 30, 20, 40])
y1 = np.array([12, 34, 56, 78, 89, 45, 90, 29])
x = np.column_stack((x1,y1))
centroid = np.mean( np.transpose( x ) )
dist = [ np.sqrt( np.sum( np.square( v - centroid ) ) ) for v in x ]
dist
[45.1506159980127, 21.073161248374674, 4.192627457812105, 27.551372470350728, 42.19393469445579, 11.060204564111823, 39.38372919112663, 25.40330933165992]