pdist2 equivalent in MATLAB version 7

前端 未结 3 851
小鲜肉
小鲜肉 2020-11-28 15:35

I need to calculate the euclidean distance between 2 matrices in matlab. Currently I am using bsxfun and calculating the distance as below( i am attaching a snippet of the c

3条回答
  •  死守一世寂寞
    2020-11-28 16:26

    You could fully vectorize the calculation by repeating the rows of fea_test 6800 times, and of fea_train 4754 times, like this:

    rA = size(fea_test,1);
    rB = size(fea_train,1);
    
    [I,J]=ndgrid(1:rA,1:rB);
    
    d = zeros(rA,rB);
    
    d(:) = sqrt(sum(fea_test(J(:),:)-fea_train(I(:),:)).^2,2));
    

    However, this would lead to intermediary arrays of size 6800x4754x1024 (*8 bytes for doubles), which will take up ~250GB of RAM. Thus, the full vectorization won't work.

    You can, however, reduce the time of the distance calculation by preallocation, and by not calculating the square root before it's necessary:

    rA = size(fea_test,1);
    rB = size(fea_train,1);
    d = zeros(rA,rB);
    
    for i = 1:rA
        test_data=fea_test(i,:);
        d(i,:)=sum( (test_data(ones(nB,1),:) -  fea_train).^2, 2))';
    end
    
    d = sqrt(d);
    

提交回复
热议问题