⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rigid_transform.m

📁 WSN中DOA算法的mds定位
💻 M
字号:
function [alpha,T,r]=rigid_transform(M,N)%N表示要进行旋转的坐标系统
p=size(M,1);%点的个数
if p==0;
    disp(M);
    disp(N);
end
    A_1=0;
    A_2=0;
    B_1=0;
    B_2=0;
 for i=1:p
    for j=1:p
        A_1=A_1+(N(i,1)*M(j,2)-N(i,2)*M(j,1));
        B_1=B_1+(-N(i,1)*M(j,1)-N(i,2)*M(j,2));
    end
    A_2=A_2+(-N(i,1)*M(i,2)+N(i,2)*M(i,1));
    B_2=B_2+(N(i,1)*M(i,1)+N(i,2)*M(i,2));
 end
 A=(A_1/p)+A_2;
 B=(B_1/p)+B_2;
 if B==0
     disp(M);
     disp(N);
 end
 alpha_1=atan(-A/B);
 alpha_2=atan(-A/B)+pi;
 %t1_1=0;t1_2=0;
 %t2_1=0;t2_2=0;
 %for i=1:p
   %  t1_1=t1_1+cos(alpha_1)*N(i,1)-sin(alpha_1)*N(i,2)-M(i,1);
    % t1_2=t1_2+cos(alpha_2)*N(i,1)-sin(alpha_2)*N(i,2)-M(i,1);
     %t2_1=t2_1+cos(alpha_1)*N(i,2)+sin(alpha_1)*N(i,1)-M(i,2);
     %t2_2=t2_2+cos(alpha_2)*N(i,2)+sin(alpha_2)*N(i,1)-M(i,2);
 %end
 %t1_1=-t1_1/p;
 %t1_2=-t1_2/p;
 %t2_1=-t2_1/p;
 %t2_2=-t2_2/p;
 t1_1=-mean(cos(alpha_1).*N(:,1)-sin(alpha_1).*N(:,2)-M(:,1));
 t1_2=-mean(cos(alpha_2).*N(:,1)-sin(alpha_2).*N(:,2)-M(:,1));
 t2_1=-mean(cos(alpha_1).*N(:,2)+sin(alpha_1).*N(:,1)-M(:,2));
 t2_2=-mean(cos(alpha_2).*N(:,2)+sin(alpha_2).*N(:,1)-M(:,2));
% U_1=zeros(1,p);U_2=zeros(1,p);
 %V_1=zeros(1,p);V_2=zeros(1,p);
 %for i=1:p
    % U_1(i)=cos(alpha_1)*N(i,1)-sin(alpha_1)*N(i,2)-M(i,1);
     %U_2(i)=cos(alpha_2)*N(i,1)-sin(alpha_2)*N(i,2)-M(i,1);
     %V_1(i)=cos(alpha_1)*N(i,2)+sin(alpha_1)*N(i,1)-M(i,2);
     %V_2(i)=cos(alpha_2)*N(i,2)+sin(alpha_2)*N(i,1)-M(i,2);
 %end
%  for a=-0.05:0.001:0.05;
 %for b= -0.05:0.001:0.05;
  %   temp1=sum((U_1+(t1_1+a).*ones(1,p)).^2+(V_1+(t2_1+b).*ones(1,p))).^2;
    % temp2=sum((U_2+(t1_2+a).*ones(1,p)).^2+(V_2+(t2_2+b).*ones(1,p))).^2;
    %E1(i)=sum(U_1(i)+)
    %E2(i)=
 %end
  %end
  %[m1,n1]=sort(E1,'ascend');
  %[m2,n2]=sort(E2,'ascend');
 %options=optimset();
%T_1=fminsearch(@opt,[t1_1;t2_1],options,U_1,V_1);%计算出alpha_1的情况
%T_2=fminsearch(@opt,[t1_2;t2_2],options,U_2,V_2);%计算出alpha_2的情况
%t1_1=T_1(1);
%t2_1=T_1(2);
%t1_2=T_2(1);
%t2_2=T_2(2);
 E_1=0;
 E_2=0;
 for i=1:p
     E_1=E_1+(cos(alpha_1)*N(i,1)-sin(alpha_1)*N(i,2)-M(i,1)+t1_1).^2+(cos(alpha_1)*N(i,2)+sin(alpha_1)*N(i,1)-M(i,2)+t2_1).^2;
     E_2=E_2+(cos(alpha_2)*N(i,1)-sin(alpha_2)*N(i,2)-M(i,1)+t1_2).^2+(cos(alpha_2)*N(i,2)+sin(alpha_2)*N(i,1)-M(i,2)+t2_2).^2;
 end
 if E_1<E_2
     t1_0=t1_1;
     t2_0=t2_1;
     alpha_0=alpha_1;
 else
      t1_0=t1_2;
     t2_0=t2_2;
     alpha_0=alpha_2;
 end
 N(:,2)=-N(:,2);
    A_1=0;
    A_2=0;
    B_1=0;
    B_2=0;
 for i=1:p
    for j=1:p
        A_1=A_1+(N(i,1)*M(j,2)-N(i,2)*M(j,1));
        B_1=B_1+(-N(i,1)*M(j,1)-N(i,2)*M(j,2));
    end
    A_2=A_2+(-N(i,1)*M(i,2)+N(i,2)*M(i,1));
    B_2=B_2+(N(i,1)*M(i,1)+N(i,2)*M(i,2));
 end
 A=(A_1/p)+A_2;
 B=(B_1/p)+B_2;
 if B==0
     disp(M);
     disp(N);
 end
 alpha_1=atan(-A/B);
 alpha_2=atan(-A/B)+pi;
% t1_1=0;t1_2=0;
% t2_1=0;t2_2=0;
% for i=1:p
   %  t1_1=t1_1+cos(alpha_1)*N(i,1)-sin(alpha_1)*N(i,2)-M(i,1);
    % t1_2=t1_2+cos(alpha_2)*N(i,1)-sin(alpha_2)*N(i,2)-M(i,1);
     %t2_1=t2_1+cos(alpha_1)*N(i,2)+sin(alpha_1)*N(i,1)-M(i,2);
     %t2_2=t2_2+cos(alpha_2)*N(i,2)+sin(alpha_2)*N(i,1)-M(i,2);
 %end
 %t1_1=-t1_1/p;
 %t1_2=-t1_2/p;
 %t2_1=-t2_1/p;
 %t2_2=-t2_2/p;  
  t1_1=-mean(cos(alpha_1).*N(:,1)-sin(alpha_1).*N(:,2)-M(:,1));
 t1_2=-mean(cos(alpha_2).*N(:,1)-sin(alpha_2).*N(:,2)-M(:,1));
 t2_1=-mean(cos(alpha_1).*N(:,2)+sin(alpha_1).*N(:,1)-M(:,2));
 t2_2=-mean(cos(alpha_2).*N(:,2)+sin(alpha_2).*N(:,1)-M(:,2));
%  U_1=zeros(1,p);U_2=zeros(1,p);
 %V_1=zeros(1,p);V_2=zeros(1,p);
 %for i=1:p
    % U_1(i)=cos(alpha_1)*N(i,1)-sin(alpha_1)*N(i,2)-M(i,1);
    %U_2(i)=cos(alpha_2)*N(i,1)-sin(alpha_2)*N(i,2)-M(i,1);
     %V_1(i)=cos(alpha_1)*N(i,2)+sin(alpha_1)*N(i,1)-M(i,2);
     %V_2(i)=cos(alpha_2)*N(i,2)+sin(alpha_2)*N(i,1)-M(i,2);
 %end
 %ans=sum((U_1+t1_1).^2+(V_1+t2_1).^2);
 %options=optimset();
%T_1=fminsearch(@opt,[t1_1;t2_1],options,U_1,V_1);%计算出alpha_1的情况
%T_2=fminsearch(@opt,[t1_2;t2_2],options,U_2,V_2);%计算出alpha_2的情况
%t1_1=T_1(1);
%t2_1=T_1(2);
%t1_2=T_2(1);
%t2_2=T_2(2);
 E_1=0;
 E_2=0;
 for i=1:p
     E_1=E_1+(cos(alpha_1)*N(i,1)-sin(alpha_1)*N(i,2)-M(i,1)+t1_1).^2+(cos(alpha_1)*N(i,2)+sin(alpha_1)*N(i,1)-M(i,2)+t2_1).^2;
     E_2=E_2+(cos(alpha_2)*N(i,1)-sin(alpha_2)*N(i,2)-M(i,1)+t1_2).^2+(cos(alpha_2)*N(i,2)+sin(alpha_2)*N(i,1)-M(i,2)+t2_2).^2;
 end
 if E_1<E_2
     t1_r=t1_1;
     t2_r=t2_1;
     alpha_r=alpha_1;
 else
      t1_r=t1_2;
     t2_r=t2_2;
     alpha_r=alpha_2;
 end
 N(:,2)=-N(:,2);
 P=0;Q=0;
 for i=1:size(N,1)
     P=P+norm([cos(alpha_0),-sin(alpha_0);sin(alpha_0),cos(alpha_0)]*(N(i,:))'+[t1_0;t2_0]-(M(i,:))').^2;
     Q=Q+norm([cos(alpha_r),-sin(alpha_r);sin(alpha_r),cos(alpha_r)]*[1,0;0,-1]*(N(i,:))'+[t1_r;t2_r]-(M(i,:))').^2;
 end
     if P<=Q
     alpha=alpha_0;
     T=[t1_0,t2_0];
     r=0;
     else
        alpha=alpha_r;%进行了非法修改
     T=[t1_r,t2_r];%进行了非法修改
     r=1;
     end
     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -