mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Complete LU documentation
This commit is contained in:
10
doc/snippets/LU_computeKernel.cpp
Normal file
10
doc/snippets/LU_computeKernel.cpp
Normal file
@@ -0,0 +1,10 @@
|
||||
MatrixXf m = MatrixXf::Random(3,5);
|
||||
cout << "Here is the matrix m:" << endl << m << endl;
|
||||
LU<MatrixXf> lu(m);
|
||||
// allocate the matrix ker with the correct size to avoid reallocation
|
||||
MatrixXf ker(m.rows(), lu.dimensionOfKernel());
|
||||
lu.computeKernel(&ker);
|
||||
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;
|
||||
7
doc/snippets/LU_kernel.cpp
Normal file
7
doc/snippets/LU_kernel.cpp
Normal file
@@ -0,0 +1,7 @@
|
||||
MatrixXf m = MatrixXf::Random(3,5);
|
||||
cout << "Here is the matrix m:" << endl << m << endl;
|
||||
MatrixXf ker = m.lu().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;
|
||||
15
doc/snippets/LU_solve.cpp
Normal file
15
doc/snippets/LU_solve.cpp
Normal file
@@ -0,0 +1,15 @@
|
||||
typedef Matrix<float,2,3> Matrix2x3;
|
||||
typedef Matrix<float,3,2> Matrix3x2;
|
||||
Matrix2x3 m = Matrix2x3::Random();
|
||||
Matrix2f y = Matrix2f::Random();
|
||||
cout << "Here is the matrix m:" << endl << m << endl;
|
||||
cout << "Here is the matrix y:" << endl << y << endl;
|
||||
Matrix3x2 x;
|
||||
if(m.lu().solve(y, &x))
|
||||
{
|
||||
assert(y.isApprox(m*x));
|
||||
cout << "Here is a solution x to the equation mx=y:" << endl << x << endl;
|
||||
}
|
||||
else
|
||||
cout << "The equation mx=y does not have any solution." << endl;
|
||||
|
||||
12
doc/snippets/class_LU_1.cpp
Normal file
12
doc/snippets/class_LU_1.cpp
Normal file
@@ -0,0 +1,12 @@
|
||||
Matrix3d m = Matrix3d::Random();
|
||||
cout << "Here is the matrix m:" << endl << m << endl;
|
||||
Eigen::LU<Matrix3d> lu(m);
|
||||
cout << "Here is, up to permutations, its LU decomposition matrix:"
|
||||
<< endl << lu.matrixLU() << endl;
|
||||
cout << "Let us now reconstruct the original matrix m from it:" << endl;
|
||||
Matrix3d x = lu.matrixL() * lu.matrixU();
|
||||
Matrix3d y;
|
||||
for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++)
|
||||
y(i, lu.permutationQ()[j]) = x(lu.permutationP()[i], j);
|
||||
cout << y << endl;
|
||||
assert(y.isApprox(m));
|
||||
18
doc/snippets/class_LU_2.cpp
Normal file
18
doc/snippets/class_LU_2.cpp
Normal file
@@ -0,0 +1,18 @@
|
||||
typedef Matrix<double, 5, 3> Matrix5x3;
|
||||
typedef Matrix<double, 5, 5> Matrix5x5;
|
||||
Matrix5x3 m = Matrix5x3::Random();
|
||||
cout << "Here is the matrix m:" << endl << m << endl;
|
||||
Eigen::LU<Matrix5x3> lu(m);
|
||||
cout << "Here is, up to permutations, its LU decomposition matrix:"
|
||||
<< endl << lu.matrixLU() << endl;
|
||||
cout << "Here is the actual L matrix in this decomposition:" << endl;
|
||||
Matrix5x5 l = Matrix5x5::Identity();
|
||||
l.block<5,3>(0,0).part<StrictlyLower>() = lu.matrixLU();
|
||||
cout << l << endl;
|
||||
cout << "Let us now reconstruct the original matrix m:" << endl;
|
||||
Matrix5x3 x = l * lu.matrixU();
|
||||
Matrix5x3 y;
|
||||
for(int i = 0; i < 5; i++) for(int j = 0; j < 3; j++)
|
||||
y(i, lu.permutationQ()[j]) = x(lu.permutationP()[i], j);
|
||||
cout << y << endl;
|
||||
assert(y.isApprox(m));
|
||||
Reference in New Issue
Block a user