Guest User

Untitled

a guest
Oct 21st, 2017
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.94 KB | None | 0 0
  1. function P = grad_NL(X,c,thresh)
  2.  
  3. thresh = 0.5;
  4.  
  5. load('2D.mat');
  6. load('3D.mat');
  7.  
  8. X = X';
  9. c = c';
  10.  
  11. eps = 0;
  12. P = eye(3);
  13. lam1 = 0.01;
  14. lam2 = 0.01;
  15. step = 1000;
  16.  
  17. p1 = P(1,1:end-1); p14 = P(1,4);
  18. p2 = P(2,1:end-1); p24 = P(2,4);
  19. p3 = P(3,1:end-1); p34 = P(3,4);
  20.  
  21. p1al = ones(size(p1))/step;
  22. p2al = ones(size(p2))/step;
  23. p3al = ones(size(p3))/step;
  24.  
  25. p14al = 1/step;
  26. p24al = 1/step;
  27. p34al = 1/step;
  28.  
  29. epsnext = calc_error(X,c,P,lam1,lam2);
  30.  
  31. while(abs(epsnext - eps) > thresh)
  32.  
  33. [del_p1,del_p2] = get_eps_p1_p2(X,c,p1,p2,p3,p14,p24,p34,lam2);
  34. del_p3 = get_eps_p3(X,c,p1,p2,p3,p14,p24,p34,lam1,lam2);
  35. [del_p14,del_p24] = get_eps_p14_p24(X,c,p1,p2,p3,p14,p24,p34);
  36. del_p34 = get_eps_p34(X,c,p1,p2,p3,p14,p24,p34);
  37.  
  38. p1 = p1 - p1al.*del_p1';
  39. p2 = p2 - p2al.*del_p2';
  40. p3 = p3 - p3al.*del_p3';
  41.  
  42. p14 = p14 - p14al.*del_p14;
  43. p24 = p24 - p24al.*del_p24;
  44. p34 = p34 - p34al.*del_p34;
  45.  
  46. eps = epsnext;
  47. epsnext = calc_error(X,c,[p1 p14; p2 p24; p3 p34],lam1,lam2)
  48. eps;
  49.  
  50. end
  51.  
  52. P = [p1 p14; p2 p24; p3 p34]
  53. end
  54.  
  55. function [del_p1,del_p2] = get_eps_p1_p2(X,c,p1,p2,p3,p14,p24,p34,lam2)
  56.  
  57.  
  58. del_p1 = 0;
  59. del_p2 = 0;
  60.  
  61. for i = 1:length(X)
  62.  
  63. del_p1 = del_p1 + -(2*X(:,i)*(c(1,i) - (p14 + p1*X(:,i))/(p34 + p3*X(:,i))))/(p34 + p3*X(:,i));
  64. del_p2 = del_p2 + -(2*X(:,i)*(c(2,i) - (p24 + p2*X(:,i))/(p34 + p3*X(:,i))))/(p34 + p3*X(:,i));
  65.  
  66. end
  67.  
  68. del_p1 = del_p1 + lam2*(cross(repmat(p3',[1,3]),eye(3),1)*(cross(p2,p3))');
  69. del_p2 = del_p2 + lam2*(cross(repmat(p3',[1,3]),eye(3),1)*(cross(p1,p3))');
  70.  
  71. %%% del is a vector
  72. end
  73.  
  74. function eps = calc_error(X,c,P,lam1,lam2)
  75.  
  76. p1 = P(1,1:end-1); p14 = P(1,4);
  77. p2 = P(2,1:end-1); p24 = P(2,4);
  78. p3 = P(3,1:end-1); p34 = P(3,4);
  79.  
  80. eps = 0;
  81. for i = 1:length(X)
  82. eps = eps + ( ((p1*X(:,i) + p14)/(p3*X(:,i)+p34)) - c(1,i))^2 + ( ((p2*X(:,i) + p24)/(p3*X(:,i)+p34)) - c(2,i))^2;
  83.  
  84. end
  85. eps = eps + lam1*( norm(p3) - 1 ) + lam2*( cross(p1,p3) * cross(p2,p3)' );
  86.  
  87.  
  88. end
  89.  
  90. function del = get_eps_p3(X,c,p1,p2,p3,p14,p24,p34,lam1,lam2)
  91.  
  92.  
  93. del = 0;
  94.  
  95.  
  96. for i = 1:length(X)
  97.  
  98. del = del + (2*X(:,i)*(p14 + p1*X(:,i))*(c(1,i) - (p14 + p1*X(:,i))/(p34 + p3*X(:,i))))/(p34 + p3*X(:,i))^2 + (2*X(:,i)*(p24 + p2*X(:,i))*(c(2,i) - (p24 + p2*X(:,i))/(p34 + p3*X(:,i))))/(p34 + p3*X(:,i))^2;
  99. end
  100.  
  101. del = del + 2*lam1*p3' + lam2*( cross(repmat(p1',[1,3]),eye(3),1)*(cross(p2,p3))' + (cross(repmat(p2',[1,3]),eye(3),1))*(cross(p1,p3))');
  102. end
  103.  
  104. function [del_p1,del_p2] = get_eps_p14_p24(X,c,p1,p2,p3,p14,p24,p34)
  105.  
  106.  
  107. del_p1 = 0;
  108. del_p2 = 0;
  109.  
  110. for i = 1:length(X)
  111.  
  112. del_p1 = del_p1 + -(2*(c(1,i) - (p14 + p1*X(:,i))/(p34 + p3*X(:,i))))/(p34 + p3*X(:,i));
  113. del_p2 = del_p2 + -(2*(c(2,i) - (p24 + p2*X(:,i))/(p34 + p3*X(:,i))))/(p34 + p3*X(:,i));
  114.  
  115. end
  116.  
  117. end
  118.  
  119. function del = get_eps_p34(X,c,p1,p2,p3,p14,p24,p34)
  120.  
  121. del = 0;
  122.  
  123. for i = 1:length(X)
  124.  
  125. del = del + (2*(p14 + p1*X(:,i))*(c(1,i) - (p14 + p1*X(:,i))/(p34 + p3*X(:,i))))/(p34 + p3*X(:,i))^2 + (2*(p24 + p2*X(:,i))*(c(2,i) - (p24 + p2*X(:,i))/(p34 + p3*X(:,i))))/(p34 + p3*X(:,i))^2;
  126. end
  127.  
  128. end
Add Comment
Please, Sign In to add comment