sift算法搭建(上半部,五,求二阶三阶黑塞矩阵的逆程序对比,c#实现)
先看二阶黑塞矩阵:
private void 二阶黑塞矩阵的逆(ref double a,ref double c,ref double b,ref double d)
{//未考虑bc-ad==0
//因为黑塞矩阵的逆*黑塞矩阵=单位矩阵
//a c*AA CC=1 0
//b d BB DD 0 1
//a*AA+c*BB=1;
//b*AA+d*BB=0;
aa=-d/(bc-ad);bb=b/(bc-ad)
//a*cc+c*dd=0;
//b*cc+d*dd=1;
///cc=c/(bc-ad);dd=-a/(bc-ad);
//所以a c*1/(bc-ad)*-d c= 1 0
// b d b -a 0 1
double tempa=0; double tempb=0; double tempc=0; double tempd=0;
double 系数=1.0/(b*c-a*d);
tempa=系数*(-d);
tempc = 系数 * (c);
tempb = 系数 * (b);
tempd = 系数 * (-a);
a = tempa; b = tempb; c = tempc; d = tempd;
}
注意:返回的逆黑塞矩阵值覆盖了原来的黑塞矩阵
再看三阶黑塞矩阵:
bool 黑塞矩阵三阶的逆(ref double a, ref double b, ref double c, ref double d, ref double e, ref double f, ref double g, ref double h, ref double i)
{
double 矩阵的值 = a * e * i + b * f * g + c * d * h - a * f * h - b * d * i - c * e * g;
if (0 == 矩阵的值) return false;
double 新a = e * i - h * f; 新a = 新a / 矩阵的值;
double 新b = b * i - h * c; 新b = -新b / 矩阵的值;
double 新c = b * f - c * e; 新c = 新c / 矩阵的值;
double 新d = f * g - i * d; 新d = 新d / 矩阵的值;
double 新e = c * g - i * a; 新e = -新e / 矩阵的值;
double 新f = c * d - a * f; 新f = 新f / 矩阵的值;
double 新g = d * h - g * e; 新g = 新g / 矩阵的值;
double 新h = a * h - g * b; 新h = -新h / 矩阵的值;
double 新i = a * e - b * d; 新i = 新i / 矩阵的值;
a = 新a;
b = 新b;
c = 新c;
d = 新d;
e = 新e;
f = 新f;
g = 新g;
h = 新h;
i = 新i;
return true;
}
调用三阶:注意:返回的逆黑塞矩阵值覆盖了原来的黑塞矩阵
bool hello= 黑塞矩阵三阶的逆(ref dxx,ref dxy,ref dxs,ref dxy,ref dyy,ref dys,ref dxs,ref dys,ref dss);//二阶导数的值全改变,要注意