Advertisement
Guest User

Untitled

a guest
Sep 29th, 2013
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.77 KB | None | 0 0
  1. function run_LS()
  2. clc;clear all;
  3. close all
  4. beep off
  5.  
  6.  
  7. nit=1200
  8.  
  9. w3 = 1.0;
  10. w4 = 1000000;
  11.  
  12.  
  13.  
  14.  
  15. X = [0.326118759777820,-0.277140616245993;0.437080391770018,-0.0558590878401746;0.548042023762216,0.162592814787714;0.659003655754414,0.375821686878482;0.769965287746612,0.581491348288492;]
  16. Y = [-0.698446913206480,-0.715661868085998;-0.625305502069696,-0.444146525051125;-0.503232714874489,-0.197186449680767;-0.475138257846766,0.126591717108409;-0.438086730813650,0.443496979840961;]
  17. [X Y] = mean_center_and_normalize(X,Y);
  18. Z = X;
  19. M1 = sparse(size(Z,1), size(Z,1));
  20. M1 = spdiags(-ones(size(Z,1),1),0,M1);
  21. M1 = spdiags(ones(size(Z,1),1),1,M1);
  22. M1(end,1) = 1;
  23. M2 = sparse(size(Z,1), size(Z,1));
  24. M2 = spdiags(-ones(size(Z,1),1),0,M2);
  25. M2 = spdiags(ones(size(Z,1),1),2,M2);
  26. M2(end-1,1) = 1;
  27. M2(end,2) = 1;
  28. M = [M1;M1';M2;M2'];
  29. Ex = M*X;
  30. figure;
  31. axis off;
  32. axis square;
  33. show_contour_plot(X,Y);
  34. NY = compute_normal(Y);
  35.  
  36.  
  37. stopnow=false;
  38.  
  39. type = 2
  40. w1 = 1;
  41. w2 = 0.1;
  42. Zo = Z;
  43. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  44. % Create kd-tree
  45. kd = KDTreeSearcher(Y);
  46. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  47. % Initialize linear system ||D^0.5(Av - b)||_2^2 + ||W^0.5v||_2^2
  48. dim = size(Z,1)*size(Z,2);
  49. A = sparse(size(Z,1)+6*dim, dim+size(Z,1)+3);
  50. A((1+size(Z,1)):(size(Z,1)+dim),1:dim) = speye(dim,dim);
  51. A((1+size(Z,1)+dim):(size(Z,1)+2*dim),1:dim) = speye(dim,dim);
  52. A((1+size(Z,1)+dim):(size(Z,1)+dim+dim/2), dim+2) = -ones(dim/2,1);
  53. A((1+size(Z,1)+dim+dim/2):(size(Z,1)+2*dim), dim+3) = -ones(dim/2,1);
  54. M1 = sparse(size(Z,1), size(Z,1));
  55. M1 = spdiags(-ones(size(Z,1),1),0,M1);
  56. M1 = spdiags(ones(size(Z,1),1),1,M1);
  57. M1(end,1) = 1;
  58. M2 = sparse(size(Z,1), size(Z,1));
  59. M2 = spdiags(-ones(size(Z,1),1),0,M2);
  60. M2 = spdiags(ones(size(Z,1),1),2,M2);
  61. M2(end-1,1) = 1;
  62. M2(end,2) = 1;
  63. M = [M1;M1';M2;M2'];
  64. A((size(Z,1)+2*dim+1):(size(Z,1)+4*dim),1:size(Z,1)) = M;
  65. A((size(Z,1)+4*dim+1):end,(size(Z,1)+1):dim) = M;
  66. b = zeros(size(Z,1)+6*dim,1);
  67. D = sparse(size(Z,1)+6*dim, size(Z,1)+6*dim);
  68. D(1:size(Z,1),1:size(Z,1)) = w1*speye(size(Z,1),size(Z,1));
  69. D((size(Z,1)+1):(size(Z,1)+dim),(size(Z,1)+1):(size(Z,1)+dim)) = w2*speye(dim,dim);
  70. W = sparse(dim+size(Z,1)+3, dim+size(Z,1)+3);
  71. W((dim+1):(dim+3), (dim+1):(dim+3)) = 0.1*speye(3, 3);
  72. W((dim+4):end,(dim+4):end) = 1*speye(size(Z,1), size(Z,1));
  73. for it=1:nit
  74. if(stopnow)
  75. return;
  76. end;
  77. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  78. % kd-tree look-up
  79. idz = knnsearch(kd,Z);
  80. P = Y(idz,:);
  81. NP = NY(idz,:);
  82. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  83. % Build linear system
  84. N = [spdiags(NP(:,1),0,size(NP,1),size(NP,1)), ...
  85. spdiags(NP(:,2),0,size(NP,1),size(NP,1))];
  86. A(1:size(Z,1),1:dim) = N;
  87. Xr = X;
  88. Xr(:,1) = -Xr(:,1);
  89. Xr = fliplr(Xr);
  90. A((1+size(Z,1)+dim):(size(Z,1)+2*dim),dim+1) = reshape(Xr,dim,1);
  91. A((size(Z,1)+2*dim+1):(3*dim),(dim+4:end)) = spdiags(Ex(1:size(Z,1),2),0,size(Z,1),size(Z,1));
  92. A((3*dim+1):(size(Z,1)+3*dim),(dim+4:end)) = spdiags(Ex((1+size(Z,1)):(2*size(Z,1)),2),0,size(Z,1),size(Z,1));
  93. A((size(Z,1)+3*dim+1):(4*dim),(dim+4:end)) = spdiags(Ex((1+2*size(Z,1)):(3*size(Z,1)),2),0,size(Z,1),size(Z,1));
  94. A((4*dim+1):(size(Z,1)+4*dim),(dim+4:end)) = spdiags(Ex((1+3*size(Z,1)):end,2),0,size(Z,1),size(Z,1));
  95. A((size(Z,1)+4*dim+1):(5*dim),(dim+4:end)) = spdiags(-Ex(1:size(Z,1),1),0,size(Z,1),size(Z,1));
  96. A((5*dim+1):(size(Z,1)+5*dim),(dim+4:end)) = spdiags(-Ex((1+size(Z,1)):(2*size(Z,1)),1),0,size(Z,1),size(Z,1));
  97. A((size(Z,1)+5*dim+1):(6*dim),(dim+4:end)) = spdiags(-Ex((1+2*size(Z,1)):(3*size(Z,1)),1),0,size(Z,1),size(Z,1));
  98. A((6*dim+1):end,(dim+4:end)) = spdiags(-Ex((1+3*size(Z,1)):end,1),0,size(Z,1),size(Z,1));
  99. b(1:size(Z,1)) = N*reshape(P,dim,1);
  100. b((1+size(Z,1)):(size(Z,1)+dim)) = reshape(P,dim,1);
  101. b((1+size(Z,1)+dim):(size(Z,1)+2*dim)) = reshape(X,dim,1);
  102. b((size(Z,1)+2*dim+1):end) = reshape(Ex,dim*4,1);
  103. D((size(Z,1)+dim+1):(size(Z,1)+2*dim),(size(Z,1)+dim+1):(size(Z,1)+2*dim)) = w3*speye(dim,dim);
  104. D((size(Z,1)+2*dim+1):end,(size(Z,1)+2*dim+1):end) = w4*speye(dim*4,dim*4);
  105. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  106. % Solve
  107. v = (A'*D*A + W)\(A'*D*b);
  108. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  109. % Extract solution
  110. Z = reshape(v(1:dim), size(X,1), size(X,2));
  111. theta = v(dim+1);
  112. R = [cos(theta) -sin(theta); sin(theta) cos(theta)];
  113. X = X*R' + repmat(v((dim+2):(dim+3))', [size(X,1),1]);
  114. for i=1:size(Z,1)
  115. theta = v(dim+3+i);
  116.  
  117. R = [cos(theta) -sin(theta); sin(theta) cos(theta)];
  118. Ex(i,:) = Ex(i,:)*R';
  119. Ex(i+size(Z,1),:) = Ex(i+size(Z,1),:)*R';
  120. Ex(i+2*size(Z,1),:) = Ex(i+2*size(Z,1),:)*R';
  121. Ex(i+3*size(Z,1),:) = Ex(i+3*size(Z,1),:)*R';
  122. end
  123. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  124.  
  125. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  126. % Stopping Criteria
  127. if(norm(Z-Zo)/size(Z,1) < 1e-6 && type == 1)
  128. return
  129. elseif(norm(Z-Zo)/size(Z,1) < 1e-4 && type == 2)
  130. w3 = w3*0.1;
  131. w4 = w4*0.8;
  132. end;
  133. Zo = Z;
  134. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  135. end
  136. SS=full(A)
  137. disp('p')
  138. % Show result
  139. figure;
  140. axis off;
  141. axis square;
  142. show_contour_plot(Z,Y)
  143.  
  144. end
  145.  
  146.  
  147. function NY = compute_normal(Y)
  148. R = [0 -1;1 0];
  149. Y = Y*R';
  150. N1 = circshift(Y,1)-Y;
  151. n = sqrt(sum(N1.^2,2));
  152. N1(:,1) = N1(:,1)./n;
  153. N1(:,2) = N1(:,2)./n;
  154. N2 = Y-circshift(Y,-1);
  155. n = sqrt(sum(N2.^2,2));
  156. N2(:,1) = N2(:,1)./n;
  157. N2(:,2) = N2(:,2)./n;
  158. NY = (N1+N2)./2;
  159. n = sqrt(sum(NY.^2,2));
  160. NY(:,1) = NY(:,1)./n;
  161. NY(:,2) = NY(:,2)./n;
  162. end
  163.  
  164.  
  165. function show_contour_plot(X,Y)
  166.  
  167. X(end+1,:) = X(1,:);
  168. Y(end+1,:) = Y(1,:);
  169. plot(X(:,1), X(:,2), '.', 'color',[ 0 0 .9]); hold on;
  170. plot(Y(:,1), Y(:,2), 'x', 'color',[.5 .5 0]); hold on;
  171. drawnow;
  172. end
  173.  
  174. function [X Y] = mean_center_and_normalize(X,Y)
  175. XnY = [X;Y];
  176. avg = mean(XnY);
  177. X = X - repmat(avg, [size(X,1),1]);
  178. Y = Y - repmat(avg, [size(Y,1),1]);
  179. XnY = [X;Y];
  180. d = sqrt(max(sum(XnY.^2,2)));
  181. X = X./d;
  182. Y = Y./d;
  183. end
  184.  
  185. function [c,ceq]=nonlcon(params)
  186. %Ensure R is a rotation matrix (orthogonal with determinant=1)
  187. R=reshape(params(1:4),2,2);
  188. v=R*R'-eye(2);
  189. ceq(5,1) = det(R)-1;
  190. ceq(1:4)= v(:);
  191. c=[];
  192. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement