Euclidean distance between two structs for nearest neighbour

1 次查看(过去 30 天)
Hi all,
I am trying to do nearest neighbour between a set of images and a nearest neighbour model. However in my euclidean distance function I am getting errors suh as "matrix dimensions must agree".
As you can see i've attemped different ways but what im trying to do for these two functions is:
• Calculate the Euclidean distance between the test sample and all the training samples d(𝑠𝑎𝑚𝑝𝑙𝑒1,𝑠𝑎𝑚𝑝𝑙𝑒2)=|𝑠𝑎𝑚𝑝𝑙𝑒1−𝑠𝑎𝑚𝑝𝑙𝑒2|=√(𝑠𝑎𝑚𝑝𝑙𝑒1(1)−𝑠𝑎𝑚𝑝𝑙𝑒2(1))2+ (𝑠𝑎𝑚𝑝𝑙𝑒1(2)−𝑠𝑎𝑚𝑝𝑙𝑒2(2))2+⋯+(𝑠𝑎𝑚𝑝𝑙𝑒1(𝑛)−𝑠𝑎𝑚𝑝𝑙𝑒2(𝑛))2
• Select the closest training example
• Assign the closest training example’s label to the test image
function dEuc = EuclideanDistance(sample1,sample2)
% dEuc = sqrt(sum((sample1 - sample2).^2));
% dEuc = norm(sample1 - sample2);
% for i = length(sample1)
% for j = length(sample2)
% num = sum((sample1(:) - sample2(:)).^2);
% end
% end
% dEuc = sqrt(num);
% sample1 = repmat(sample1,1,size(sample2,2));
% dEuc = sqrt(sum((sample1(:)-sample2(:)).^2));
V = sample1 - sample2;
dEuc = sqrt(V .* V');
end
function prediction = NNTesting(testImage,modelNN)
dataset = modelNN.neighbours;
prediction = EuclideanDistance(testImage, dataset);
end

回答(1 个)

KSSV
KSSV 2020-11-9
编辑:KSSV 2020-11-9
dEuc = sqrt(V .* V');
Replace the above with
dEuc = sqrt(sum(V.^2));
%% Demo
A = rand(100,2) ; B = rand(100,2) ;
dx = A-B ;
d = sqrt(sum(dx.^2,2)) ;
% Formula
d1 = sqrt((A(:,1)-B(:,1)).^2+(A(:,2)-B(:,2)).^2) ;
isequal(d,d1)
You have to use sum with 1 or 2 depending on your data is row major or column major.
  6 个评论
Aaron Elliott
Aaron Elliott 2020-11-11
Hahaha I did, just thought to ask on here as well just have to options
Jason Reed
Jason Reed 2020-11-11
Ah, fair! Did he respond? I'm not exactly here because I figured this out haha

请先登录,再进行评论。


Translated by