Я тренирую свою собственную самоорганизующуюся карту с кластерными значениями цвета. Теперь я хочу сделать что-то вроде U-matrix, чтобы показать евклидовы расстояния между узлами и их прямыми соседями. Моя проблема в том, что мой алгоритм довольно неэффективен! Есть, конечно, способ вычислить это более эффективно?Эффективный способ вычисления множественных эвклидовых расстояний Matlab
function displayUmatrix(dims,weights) %#dims is [30 30], size(weights) = [900 3],
%#consisting of values between 1 and 0
hold on;
axis off;
A = zeros(dims(1), dims(2), 3);
B = reshape(weights',[dims(1) dims(2) size(weights,1)]);
if size(weights,1)==3
for i=1:dims(1)
for j=1:dims(2)
if i~=1
if j~=1
A(i,j,:)=A(i,j,:)+(B(i,j,:)-B(i-1,j-1,:)).^2;
end
A(i,j,:)=A(i,j,:)+(B(i,j,:)-B(i-1,j,:)).^2;
if j~=dims(2)
A(i,j,:)=A(i,j,:)+(B(i,j,:)-B(i-1,j+1,:)).^2;
end
end
if i~=dims(1)
if j~=1
A(i,j,:)=A(i,j,:)+(B(i,j,:)-B(i+1,j-1,:)).^2;
end
A(i,j,:)=A(i,j,:)+(B(i,j,:)-B(i+1,j,:)).^2;
if j~=dims(2)
A(i,j,:)=A(i,j,:)+(B(i,j,:)-B(i+1,j+1,:)).^2;
end
end
if j~=1
A(i,j,:)=A(i,j,:)+(B(i,j,:)-B(i,j-1,:)).^2;
end
if j~=dims(2)
A(i,j,:)=A(i,j,:)+(B(i,j,:)-B(i,j+1,:)).^2;
end
C(i,j)=sum(A(i,j,:));
end
end
D = flipud(C);
maximum = max(max(D));
D = D./maximum;
imagesc(D)
else
error('display function does only work on 3D input');
end
hold off;
drawnow;
конец
Спасибо, Макс
Я предлагаю вам использовать двумерное ядро свертки вдоль каждого из трех измерений, чтобы получить ОБЩЕЕ расстояние между каждой точкой и ВСЕ его соседей одновременно, а затем квадратное. Я не уверен, что это то, что вы хотите, хотя, потому что в вашем коде вы делаете квадрат на каждом шаге перед добавлением вычисленного расстояния. Тем не менее, вы можете сделать несколько сверток на вашей матрице B, например. с ядром [1 -1; 0 -1], чтобы получить, например, все B (i, j, :) - B (i - 1, j + 1, :) за один раз. (Кто-то, пожалуйста, поправьте меня, если я ошибаюсь). Не уверен, что все будет быстрее. – wakjah
Спасибо за быстрый ответ. Я бы сказал, что это каким-либо образом улучшит читаемость кода. Я посмотрю это в документации Matlab. –