本文整理汇总了C++中MatrixXf::fullPivLu方法的典型用法代码示例。如果您正苦于以下问题:C++ MatrixXf::fullPivLu方法的具体用法?C++ MatrixXf::fullPivLu怎么用?C++ MatrixXf::fullPivLu使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MatrixXf
的用法示例。
在下文中一共展示了MatrixXf::fullPivLu方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: fitTrack
double NHitSeedFinder::fitTrack(SimpleTrack3D& track, vector<double>& chi2_hit)
{
if(using_vertex == true)
{
track.hits.push_back(SimpleHit3D(0.,0., 0.,0., 0.,0., 0, 0));
}
chi2_hit.clear();
chi2_hit.resize(track.hits.size(), 0.);
MatrixXf y = MatrixXf::Zero(track.hits.size(), 1);
for(unsigned int i=0;i<track.hits.size();i++)
{
y(i, 0) = ( pow(track.hits[i].x,2) + pow(track.hits[i].y,2) );
if((using_vertex==true ) && (i == (track.hits.size() - 1))){y(i, 0) /= vertex_sigma_xy;}
else{y(i, 0) /= layer_xy_resolution[track.hits[i].layer];}
}
MatrixXf X = MatrixXf::Zero(track.hits.size(), 3);
for(unsigned int i=0;i<track.hits.size();i++)
{
X(i, 0) = track.hits[i].x;
X(i, 1) = track.hits[i].y;
X(i, 2) = -1.;
if((using_vertex==true ) && (i == (track.hits.size() - 1)))
{
X(i, 0) /= vertex_sigma_xy;
X(i, 1) /= vertex_sigma_xy;
X(i, 2) /= vertex_sigma_xy;
}
else
{
X(i, 0) /= layer_xy_resolution[track.hits[i].layer];
X(i, 1) /= layer_xy_resolution[track.hits[i].layer];
X(i, 2) /= layer_xy_resolution[track.hits[i].layer];
}
}
MatrixXf Xt = X.transpose();
MatrixXf prod = Xt*X;
MatrixXf inv = prod.fullPivLu().inverse();
MatrixXf beta = inv*Xt*y;
float cx = beta(0,0)*0.5;
float cy = beta(1,0)*0.5;
float r = sqrt(cx*cx + cy*cy - beta(2,0));
float phi = atan2(cy, cx);
float d = sqrt(cx*cx + cy*cy) - r;
float k = 1./r;
MatrixXf diff = y - (X*beta);
MatrixXf chi2 = (diff.transpose())*diff;
float dx = d*cos(phi);
float dy = d*sin(phi);
MatrixXf y2 = MatrixXf::Zero(track.hits.size(), 1);
for(unsigned int i=0;i<track.hits.size();i++)
{
y2(i,0) = track.hits[i].z;
if((using_vertex==true ) && (i == (track.hits.size() - 1))){y2(i, 0) /= vertex_sigma_z;}
else{y2(i, 0) /= layer_z_resolution[track.hits[i].layer];}
}
MatrixXf X2 = MatrixXf::Zero(track.hits.size(), 2);
for(unsigned int i=0;i<track.hits.size();i++)
{
float D = sqrt( pow(dx - track.hits[i].x, 2) + pow(dy - track.hits[i].y,2));
float s = 0.0;
if(0.5*k*D > 0.1)
{
float v = 0.5*k*D;
if(v >= 0.999999){v = 0.999999;}
s = 2.*asin(v)/k;
}
else
{
float temp1 = k*D*0.5;temp1*=temp1;
float temp2 = D*0.5;
s += 2.*temp2;
temp2*=temp1;
s += temp2/3.;
temp2*=temp1;
s += (3./20.)*temp2;
temp2*=temp1;
s += (5./56.)*temp2;
}
X2(i,0) = s;
X2(i,1) = 1.0;
if((using_vertex==true ) && (i == (track.hits.size() - 1)))
{
X2(i, 0) /= vertex_sigma_z;
X2(i, 1) /= vertex_sigma_z;
}
//.........这里部分代码省略.........
示例2:
MatrixXf m = MatrixXf::Random(3,5);
cout << "Here is the matrix m:" << endl << m << endl;
MatrixXf ker = m.fullPivLu().kernel();
cout << "Here is a matrix whose columns form a basis of the kernel of m:"
<< endl << ker << endl;
cout << "By definition of the kernel, m*ker is zero:"
<< endl << m*ker << endl;