Guest User

Untitled

a guest
Jun 21st, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.36 KB | None | 0 0
  1. function subpixpos = interpolate_pos(H,pixpos)
  2.  
  3. dH = first_deriv_H(H)
  4. ddH = second_deriv_H(H)
  5. subpixpos = pixpos+findmax(dH,ddH);
  6.  
  7. function pos = findmax(dH,ddH)
  8.  
  9. % Gaussian elimination (need not fully invert the matrix)
  10.  
  11. R = [ddH(1,1) ddH(1,2) ddH(1,3) -dH(1);
  12. ddH(2,1) ddH(2,2) ddH(2,3) -dH(2);
  13. ddH(3,1) ddH(3,2) ddH(3,3) -dH(3)];
  14.  
  15. % scale equations so that coefficient for x is 1
  16. for u = 1:3
  17. if abs(R(u,1))>eps
  18. R(u,:) = R(u,:)./R(u,1);
  19. end
  20. end
  21.  
  22. % eliminate x from 2 equations
  23. if abs(R(1,1))>eps
  24. if abs(R(2,1))>eps
  25. R(2,:) = R(2,:)-R(1,:);
  26. end
  27. if abs(R(3,1))>eps
  28. R(3,:) = R(3,:)-R(1,:);
  29. end
  30. elimorder = [9 9 1];
  31. redeq = [2,3];
  32. elseif abs(R(2,1))>eps
  33. if abs(R(3,1))>eps
  34. R(3,:) = R(3,:)-R(2,:);
  35. end
  36. elimorder = [9 9 2];
  37. redeq = [1,3];
  38. elseif abs(R(3,1))>eps
  39. elimorder = [9 9 3];
  40. redeq = [1,2];
  41. else
  42. error('equation sytem is singular!');
  43. end
  44.  
  45. % eliminate y from 1 equation (if still necessary)
  46. if abs(R(redeq(1),2))>eps && abs(R(redeq(2),2))>eps % leading coeffs not already 0
  47. R(redeq(1),:) = R(redeq(1),:)./R(redeq(1),2);
  48. R(redeq(2),:) = R(redeq(2),:)./R(redeq(2),2);
  49. R(redeq(2),:) = R(redeq(2),:)-R(redeq(1),:);
  50. elimorder(1:2) = [redeq(2) redeq(1)];
  51. elseif abs(R(redeq(1),2))>eps
  52. elimorder(1:2) = [redeq(2) redeq(1)];
  53. elseif abs(R(redeq(2),2))>eps
  54. elimorder(1:2) = [redeq(1) redeq(2)];
  55. else % both leading coeffs are 0!
  56. error('equation system is singular!');
  57. end
  58.  
  59. % back-substitution
  60. pos(elimorder(1)) = R(elimorder(1),4)/R(elimorder(1),3);
  61. pos(elimorder(2)) = (R(elimorder(2),4)-R(elimorder(2),3)*pos(elimorder(1)))/R(elimorder(2),2);
  62. pos(elimorder(3)) = (R(elimorder(3),4)-R(elimorder(3),3)*pos(elimorder(1))-R(elimorder(3),2)*pos(elimorder(2)))/R(elimorder(3),1);
  63.  
  64.  
  65. function ddH = second_deriv_H(H)
  66.  
  67. ddH = zeros(3,3);
  68.  
  69. ddH(1,1) = -2*H(2,2,2)+H(1,2,2)+H(3,2,2);
  70. ddH(2,2) = -2*H(2,2,2)+H(2,1,2)+H(2,3,2);
  71. ddH(3,3) = -2*H(2,2,2)+H(2,2,1)+H(2,2,3);
  72.  
  73. ddH(1,2) = .25*(H(1,1,2)+H(3,3,2)-H(1,3,2)-H(3,1,2));
  74. ddH(1,3) = .25*(H(1,2,1)+H(3,2,3)-H(1,2,3)-H(3,2,1));
  75. ddH(2,3) = .25*(H(2,1,1)+H(2,3,3)-H(2,1,3)-H(2,3,1));
  76. ddH(2,1) = ddH(1,2);
  77. ddH(3,1) = ddH(1,3);
  78. ddH(3,2) = ddH(2,3);
  79.  
  80. function dH = first_deriv_H(H)
  81.  
  82. dH(1) = 0.5*(H(3,2,2)-H(1,2,2));
  83. dH(2) = 0.5*(H(2,3,2)-H(2,1,2));
  84. dH(3) = 0.5*(H(2,2,3)-H(2,2,1));
Add Comment
Please, Sign In to add comment