fork download
  1. function theLastPairwiseDistanceComputationComparisonYoullEverNeed()
  2. Funcs = {@matheburgMatrixMultiplication, ...
  3. @DivakarVectorizedVariation1, ...
  4. @DivakarVectorizedVariation2, ...
  5. @pdist2, ...
  6. @statinferbsxfun, ...
  7. @Jonasndgrid};
  8.  
  9. ns = 2.^(1:11);
  10. dims = [2,3;50,200].';
  11. for i = 1:numel(dims)
  12. d = dims(i);
  13. subplot(size(dims,2), size(dims,1), i);
  14. paramGenerators = arrayfun(@(n) @(){rand(n,d), rand(n,d)}, ns,'uni',0);
  15. times = compareFunctions(Funcs, paramGenerators);
  16. loglog(ns, times.');
  17. legend(cellfun(@func2str,Funcs,'uni',0),'Location','NorthWest','Interpreter','none');
  18. title(sprintf('DIM = %d',d));
  19. drawnow;
  20. end
  21. end
  22.  
  23. function times = compareFunctions(Funcs, paramGenerators)
  24. times = [];
  25. for i = 1:numel(paramGenerators)
  26. for j = 1:numel(Funcs)
  27. Params = feval(paramGenerators{i});
  28. times(end+1) = timeit(@()feval(Funcs{j},Params{:}));
  29. end
  30. end
  31. times = reshape(times,length(Funcs),[]);
  32. end
  33. %% // #################################
  34. %% // HERE COME ALL THE FANCY FUNCTIONS
  35. %% // #################################
  36. function distMat = matheburgMatrixMultiplication(A,B)
  37. numA = size(A,1);
  38. numB = size(B,1);
  39. d = size(A,2);
  40. helpA = zeros(numA,3*d);
  41. helpB = zeros(numB,3*d);
  42. for idx = 1:d
  43. helpA(:,3*idx-2:3*idx) = [ones(numA,1), -2*A(:,idx), A(:,idx).^2 ];
  44. helpB(:,3*idx-2:3*idx) = [B(:,idx).^2 , B(:,idx), ones(numB,1)];
  45. end
  46. distMat = sqrt(helpA * helpB');
  47. end
  48. %%
  49. function distMat = DivakarVectorizedVariation1(A,B)
  50. [nA,dim] = size(A);
  51. nB = size(B,1);
  52.  
  53. A_ext = ones(nA,dim*3);
  54. A_ext(:,2:3:end) = -2*A;
  55. A_ext(:,3:3:end) = A.^2;
  56.  
  57. B_ext = ones(nB,dim*3);
  58. B_ext(:,1:3:end) = B.^2;
  59. B_ext(:,2:3:end) = B;
  60.  
  61. distMat = sqrt(A_ext * B_ext.');
  62. end
  63. %%
  64. function distMat = DivakarVectorizedVariation2(A,B)
  65. [nA,dim] = size(A);
  66. nB = size(B,1);
  67.  
  68. A_ext = [ones(nA*dim,1) -2*A(:) A(:).^2];
  69. B_ext = [B(:).^2 B(:) ones(nB*dim,1)];
  70.  
  71. A_ext = reshape(permute(reshape(A_ext,nA,dim,[]),[1 3 2]),nA,[]);
  72. B_ext = reshape(permute(reshape(B_ext,nB,dim,[]),[1 3 2]),nB,[]);
  73.  
  74. distMat = sqrt(A_ext * B_ext.');
  75. end
  76. %%
  77. function distMat = statinferbsxfun(A,B)
  78. distMat = sqrt(bsxfun(@plus,dot(A,A,2),dot(B,B,2)')-2*(A*B'));
  79. end
  80. %%
  81. function distMat = Jonasndgrid(A,B)
  82. n = size(A,1);
  83. m = size(B,1);
  84. [idxA,idxB] = ndgrid(1:n,1:m);
  85. distMat = zeros(n,m);
  86. distMat(:) = sqrt(sum((A(idxA,:) - B(idxB,:)).^2,2));
  87. end
Success #stdin #stdout 0.17s 65136KB
stdin
Standard input is empty
stdout
Standard output is empty