1. 概述
在研究课题中需要最优化多模态图像的互信息,引入的最优化算子便是Powell算子。Powell算子是一种有效的直接搜索方法,这种方法本质上是共轭方向法。Powell算子把整个计算过程分成若干个阶段,每一个阶段(一轮迭代)有n+1次一位搜索组成。在算法的每一阶段中,先依次沿着已知的n个方向搜索,得一个最好点,然后沿着本阶段的初点与该最好点连线方向进行搜索,求得这一阶段的最好点。在用最后的搜索方向取代前n个方向之一,开始下一阶段的迭代。算法过程如下:
但是因为在实际使用过程中可能找到的新的搜索方向与原有的搜索方向之间可能存在着互相关的情况,这就需要改进了下一个最优化搜索方向的选择。因而改进的Powell方法(Sargent形式)与原来方法的主要区别在于替换方向的规则不同。改进的Powell方法,当初始搜索方向线性无关时,能够保证每轮迭代中以搜索方向为列的行列式不为零,因此这些方向是线性无关的。而且随着迭代的延续,搜索方向接近共轭的程度逐渐增加。
2. 实现
注:由于这里贴出的Powell算子是基于课题的需要修改过的,在可能在您的使用中需要进行适当的修改
%优化搜索算法
function [RegistrationParameters]=Powell(A, B, pre_parameters)
e=0.1;
X0=[0 0 0]; %初始搜索点
X0(1) = pre_parameters(1)/10.0; %设置预先定义的搜索初始点
X0(2) = pre_parameters(2)/10.0;
X0(3) = pre_parameters(3);
D=[1 0 0;
0 1 0;
0 0 1]; %用单位矩阵去构造初始的搜索方向
while(1)
d1=D(1,:);
[X1,fX1]=OneDimensionSearch(X0,d1,A, B);
d2=D(2,:);
[X2,fX2]=OneDimensionSearch(X1,d2,A, B);
d3=D(3,:);
[X3,fX3]=OneDimensionSearch(X2,d3,A, B);
fX0=PV(X0(1),X0(2),-X0(3),A, B);
Diff=[fX1-fX0 fX2-fX1 fX3-fX2];
[maxDiff,m]=max(Diff);
d4=X3-X0; %生成的新的搜索方向
temp1=X3-X0; %计算新算出来的最小值点与之前搜索起点的的差距
Conditon1=sum(temp1.*temp1);
if Conditon1<e
break
end
[X4,fX4,landa]=OneDimensionSearch(X0,d4,A, B);
X0=X4;
temp2=X4-X3;
Conditon2=sum(temp2.*temp2);
if Conditon2<=e
X3=X4;
break;
end
temp3=sqrt((fX4-fX0)/(maxDiff+eps));
if(abs(landa)>temp3)
D(4,:)=d4;
for i=m:3
D(i,:)=D(i+1,:);
end
end
end
RegistrationParameters(1)=-X3(1);
RegistrationParameters(2)=-X3(2);
RegistrationParameters(3)=-X3(3);
RegistrationParameters(4)=fX3;