用C++实现p2'
整体步骤
a=(s>=0) & (s<=1);
b=(s>1);
ps=a.*sin(2*pi*s)/(2*pi)+b.*(s-1); % compute first order derivative of the double-well potential p2 in eqaution (16)
dps=((ps~=0).*ps+(ps==0))./((s~=0).*s+(s==0)); % compute d_p(s)=p'(s)/s in equation (10). As s-->0, we have d_p(s)-->1 according to equation (18)
C++
ImageF f=(1/2/sigma)*(cos(pi*x/sigma)+1);这样是对的,把1放在后面
而ImageF f=(1/2/sigma)*(1+cos(pi*x/sigma));是错的,找不到对应的操作
原因
下面的函数
ImageF operator+(ImageF x,float s)
{
/*
数组+标量s:每个元素都加s
*/
}
是按这个顺序定义的
定义一个符号函数
ImageF regFunction(ImageF s,int m,int n)
{
//if((s>=0) && (s<=1))
return s;
}
这样就可以计算
距离正则化的
ImageF distReg_p2(ImageF phi)
{
ImageF *phi_x=new ImageF();
ImageF *phi_y=new ImageF();
*phi_x=gradientx(phi);
*phi_y=gradienty(phi);
//ImageF s=ImageFSqrt(((*phi_x)*(*phi_x)) + ((*phi_y)*(*phi_y)));
ImageF s=ImageFSqrt(*phi_x,*phi_y);
ImageF a=regFunction(s,0,1);
ImageF b=regFunction(s,0,1);//此处的函数需该
ImageF ps=a*sin(2*pi*s)/(2*pi)+b*(s-1);
ImageF dps=regFunction(ps,0,0)*ps+regFunction(ps,0,0)/(regFunction(s,0,0)+regFunction(s,0,0));
ImageF f=div(dps**phi_x-*phi_x,dps**phi_y-*phi_y)+4*del2(phi);
//ImageF b=(s>1);
}