www.pudn.com > 1111111registrationbasedoncorrelation.rar > POWELL.m


function [OUT]=POWELL(handles) 
 
F= handles.I;   
R= handles.J; % reference image 
 
len=10; 
 
%方向矢量矩阵存放d1,d2,d3三个方向矢量 
D=[1 0 0; 
    0 1 0; 
    0 0 1]; 
%从起始点X0出发,沿方向d3进行搜索,得到最大值fZ,对应点为Z。 
X0=[0 0 0]; 
d3=D(3,:); 
[Z,fZ,step]=oneDimSearch(R,F,X0,d3,len,handles); 
%从Z出发,沿方向d1进行搜索,得到最大值fX1,对应点为X1。 
d1=D(1,:); 
[X1,fX1,step]=oneDimSearch(R,F,Z,d1,len,handles); 
%从X1出发,沿方向d2进行搜索,得到最大值fX2,对应点为X2。 
d2=D(2,:); 
[X2,fX2,step]=oneDimSearch(R,F,X1,d2,len,handles);   
%从X2出发,沿方向d3进行搜索,得到最大值fX3,对应点为X3。 
d3=D(3,:); 
[X3,fX3,step]=oneDimSearch(R,F,X2,d3,len,handles); 
Cha=[fZ-fX1 fX1-fX2 fX2-fX3]; 
[maxCha,j0]=max(Cha); 
 
 
 
 e=9;   
 FANSHU=X3-X0; 
 Y=sum( FANSHU.*FANSHU ); 
 aaa=0; 
while(  Y>e ) 
    aaa=aaa+1; 
        % d为这一轮产生的新方向向量  
        d=X3-Z; 
        %从点X3出发沿d进行一轮搜索,得到最大值fZ1,对应点Z1以及到达极值点的步长landa。 
        [Z1,fZ1,landa]=oneDimSearch(R,F,X3,d,len,handles); 
        temp=sqrt( (fX3-fZ1)/maxCha ); 
        %判断是否替换方向向量 
        if( abs(landa) <= temp ) 
              %共轭性没有得到增强,不替换方向向量,重新进行搜索,不过X0换成Zk1,即起始点换成Zk1。 
              X0=Z1; 
           else 
              %共轭性得到增强,替换选定的方向向量d_j0。d_j0=d_j0+1,....,d_n=d。并用X3替换X0。然后从Zk1出发重新进行搜索 
              D(4,:)=d; 
                for i=j0:3 
                     D(i,:)=D(i+1,:); 
                end 
              X0=Z1; 
 
        end 
         
         
        %%%%%% 
              %从起始点X0(已被Z1替代)出发,沿方向d3进行搜索,得到最大值fZ,对应点为Z。 
             
              d3=D(3,:); 
              [Z,fZ,step]=oneDimSearch(R,F,X0,d3,len,handles); 
              %从Z出发,沿方向d1进行搜索,得到最大值fX1,对应点为X1。 
              d1=D(1,:); 
              [X1,fX1,step]=oneDimSearch(R,F,Z,d1,len,handles); 
              %从X1出发,沿方向d2进行搜索,得到最大值fX2,对应点为X2。 
              d2=D(2,:); 
              [X2,fX2,step]=oneDimSearch(R,F,X1,d2,len,handles);   
              %从X2出发,沿方向d3进行搜索,得到最大值fX3,对应点为X3。 
              d3=D(3,:); 
              [X3,fX3,step]=oneDimSearch(R,F,X2,d3,len,handles); 
              Cha=[fZ-fX1 fX1-fX2 fX2-fX3]; 
              [maxCha,j0]=max(Cha); 
               
              FANSHU=X3-X0; 
              Y=sum( FANSHU.*FANSHU ); 
       %%%%%% 
  end 
  OUT(1)=X3(2);  
  OUT(2)=X3(1);  
  OUT(3)=-X3(3);  
  OUT(4)=fX3;