У меня есть набор данных, X
, то есть m x 2
, и три вектора, хранящиеся в матрице C = [c1'; c2'; c3']
, то есть 3 x 2
. Я пытаюсь провести векторный код моего кода, который находит для каждой точки данных в X
, какой вектор в C
находится ближе всего (квадрат расстояния). Я хотел бы вычесть каждый вектор (строку) в C
из каждого вектора (строки) в X
, в результате получилась матрица различий между элементами X
и элементами C
. Моя текущая реализация делает эту одну строку в X
в то время:Вычитание нескольких векторов из каждой строки массива (супервещание)
for i = 1:size(X, 1)
diffs = bsxfun(@minus, X(i,:), C); % gives a 3 x 2 matrix result
[~, idx(i)] = min(sumsq(diffs), 2); % returns the index of the closest vector
% in C to the ith vector in X
end
Я хочу, чтобы избавиться от этого for
петли и просто векторизации все это, но bsxfun(@minus, X, C)
дает мне ошибку в октаву:
error: bsxfun: nonconformant dimensions: 300x2 and 3x2
Любые идеи, как я могу «транслировать» мою операцию вычитания между этими двумя матрицами?
Из любопытства, у вас есть хороший способ избежать временных переменных в том случае, если мои данные очень велики? Будет ли это замедлять выполнение? Я использую это для алгоритма K, поэтому он должен его называть довольно часто. – Engineero
Это замечательно. Я тестировал его, и это определенно ускоряет выполнение. Большое спасибо! Теперь мне просто нужно выяснить, как сделать аналогичную векторию для нахождения среднего значения всех точек, ближайших к каждой из центроидов в моей матрице 'C'. Этот цикл выполняется только один раз для каждого вектора в 'C', который обычно намного меньше, чем для' X'. – Engineero
@ Engineero: Посмотрите на его [веб-страницу] (http://www.cc.gatech.edu/~dkuang3/software/kmeans3.html) - я думаю, вы найдете это интересным :) –