Asked by Elysi Cochin
on 11 Apr 2013

i have 2 variables, dataMatrix and queryMatrix..... dataMatrix contains 245 rows and 38 column values...... and queryMatrix contains 1 row and 38 column values...... i calculate the euclidean distance and sort the distances in ascending order as below.....

for w=1:245 dist = sum((repmat(queryMatrix(w,:),245,1)-dataMatrix).^2,2); [sortval sortpos] = sort(dist,'ascend'); neighborIds(w,:) = sortpos(1:k); neighborDistances(w,:) = sqrt(sortval(1:k)); end

instead of euclidean distance i want to use the distance formula in the below link.....

http://img28.imageshack.us/img28/3595/distanceu.png

but i dont know to write the equation in matlab...... please can someone convert that equation to matlab..... it would be great help to me..... please do reply......

*No products are associated with this question.*

Answer by Matt J
on 11 Apr 2013

Accepted answer

Assuming queryMatrix and dataMatrix are both 245x38, the whole thing can be done without loops,

d=permute(dataMatrix,[1,3,2]); q=permute(queryMatrix,[3,1,2]);

num = abs(bsxfun(@minus,d,q)); den = bsxfun(@plus,abs(d),abs(q));

dist=sum(num./den,3);

[sortval sortpos] = sort(dist); neighborIds = sortpos(1:k,:); neighborDistances = sqrt(sortval(1:k,:));

Elysi Cochin
on 11 Apr 2013

sir what is 1,3,2 and 3,2,1 in

d=permute(dataMatrix,[1,3,2]); q=permute(queryMatrix,[3,1,2]);

shud i use it in my datavalues???..... as my datavalues are not of the same row and column values.... what changes should i make when i use for loop?? please do reply sir....

Answer by Andrei Bobrov
on 11 Apr 2013

Edited by Andrei Bobrov
on 11 Apr 2013

dataMatrix = randi([-10,10],10,5); queryMatrix = randi([-10 10],1,5);

d = bsxfun(@(x,y)abs(x - y)./(abs(x) + abs(y)),... dataMatrix,permute(queryMatrix,[3 2 1])); d = sort(squeeze(sum(d,2)));

Elysi Cochin
on 11 Apr 2013

sir in my code should i use for loop??? because when i do without for loop i'm getting all values NaN......

dataMatrix = dataMatrix.*sign(rand(size(dataMatrix))); queryMatrix = queryMatrix.*sign(rand(size(queryMatrix))-.5);

shud i use this rand function for my set of values??

Opportunities for recent engineering grads.

## 1 Comment

## Matt J (view profile)

Direct link to this comment:http://www.mathworks.com/matlabcentral/answers/71572#comment_142546

If queryMatrix only has 1 row, how can w run from 1 to 245 in queryMatrix(w,:)?