## How to invert a dynamic 9x9 MatrixXd?

hsharma
Registered Member
Posts
11
Karma
0

### How to invert a dynamic 9x9 MatrixXd?

Sun Jul 14, 2013 6:52 pm
Hi,
I have an Eigen::MatrixXd m(9,9);
And when I am doing this:

m.inverse();

I am getting the same output.

Is there any other way to invert such a large matrix?

ggael
Moderator
Posts
2653
Karma
16
OS

### Re: How to invert a dynamic 9x9 MatrixXd?

Sun Jul 14, 2013 9:43 pm
As explained in the doc (http://eigen.tuxfamily.org/dox-devel/cl ... 030f79f9da), mat.inverse() returns the inverse of mat, keeping mat unchanged:
Code: Select all
`mat_inv = mat.inverse();`
hsharma
Registered Member
Posts
11
Karma
0

### Re: How to invert a dynamic 9x9 MatrixXd?

Sun Jul 14, 2013 10:10 pm
My problem is that when i calculate the inverse of my 9x9 matrix I get "nan" values.

I am having these values in my matrix:

1384.33 0 0 0 0 0 553.1 0 -1707.22
0 673.42 673.42 553.1 -601.406 229.515 0 241.537 0
0 673.42 673.42 553.1 -601.406 229.515 0 241.537 0
0 553.1 553.1 9288.69 771.387 4054.28 0 -672.069 0
0 -601.406 -601.406 771.387 2848.9 781.647 0 -777.88 0
0 229.515 229.515 4054.28 781.647 2986.75 0 -459.042 0
553.1 0 0 0 0 0 771.387 0 -672.069
0 241.537 241.537 -672.069 -777.88 -459.042 0 781.647 0
-1707.22 0 0 0 0 0 -672.069 0 4054.28

And when I printing the inverse I get:

-nan -nan -nan -nan -nan -nan -nan -nan -nan
-nan -nan -nan -nan -nan -nan -nan -nan -nan
-nan -nan -nan -nan -nan -nan -nan -nan -nan
-nan -nan -nan -nan -nan -nan -nan -nan -nan
-nan -nan -nan -nan -nan -nan -nan -nan -nan
-nan -nan -nan -nan -nan -nan -nan -nan -nan
-nan -nan -nan -nan -nan -nan -nan -nan -nan
-nan -inf inf -nan -nan -nan -nan -nan -nan
0.000636602 0 0 0 0 0 -9.36032e-06 0 0.000513168

I am not getting what's going wrong.
ggael
Moderator
Posts
2653
Karma
16
OS

### Re: How to invert a dynamic 9x9 MatrixXd?

Mon Jul 15, 2013 6:55 am
Your matrix is singular, so not invertible. Confirmed by matlab:
Code: Select all
`inv(M)warning: inverse: matrix singular to machine precision, rcond = 0ans =   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf`

If what you what is to solve for A x = b, or equivalently apply the inverse of A to tome matrices (A^-1 * B), then use a rank-revealing decomposition, e.g.:
Code: Select all
`ColPivHouseholderQr<MatrixXd> qr(A); ... qr.solve(B) ... ; // <=> A^-1 * B`
hsharma
Registered Member
Posts
11
Karma
0

### Re: How to invert a dynamic 9x9 MatrixXd?

Mon Jul 15, 2013 3:02 pm
Yeah...
this is what i want to do.

x = bA^-1

where, x = 3x9 mat
b = 3x9 mat
A = 9x9 mat

Is it possible to compute this with LU decomposition as I tried but it is crashing?
Or can I get inverse of A using LU decomposition?
ggael
Moderator
Posts
2653
Karma
16
OS

### Re: How to invert a dynamic 9x9 MatrixXd?

Mon Jul 15, 2013 3:40 pm
You have many options:
Code: Select all
`x = A.lu().solve(b);x = A.fullPivLu().solve(b);x = A.colPivHouseholderQr().solve(b);x = A.jacobiSVD(ComputeThinU|ComputeThinV).solve(b);`

If you want to solve for the same matrix multiple times, build the respective factorization object as shown in my previous post.
hsharma
Registered Member
Posts
11
Karma
0

### Re: How to invert a dynamic 9x9 MatrixXd?

Mon Jul 15, 2013 3:49 pm
I get this error when I am doing this:

x = A.lu().solve(b)

where, x = 3x9 mat
b = 3x9 mat
A = 9x9 mat

DeformationDynamics: ./Eigen/src/LU/PartialPivLU.h:449: void Eigen::internal::solve_retval<Eigen::PartialPivLU<_MatrixType>, Rhs>::evalTo(Dest&) const [with Dest = Eigen::Matrix<double, 3, 9>; _MatrixType = Eigen::Matrix<double, 9, 9>; Rhs = Eigen::Matrix<double, 3, 9>]: Assertion `rhs().rows() == dec().matrixLU().rows()' failed.
ggael
Moderator
Posts
2653
Karma
16
OS

### Re: How to invert a dynamic 9x9 MatrixXd?

Mon Jul 15, 2013 3:51 pm
x.transpose() = A.lu().solve(b.transpose());
hsharma
Registered Member
Posts
11
Karma
0

### Re: How to invert a dynamic 9x9 MatrixXd?

Mon Jul 15, 2013 4:07 pm
Yeah...
I did that but I am still getting some "nan" values in my output matrix.
ggael
Moderator
Posts
2653
Karma
16
OS

### Re: How to invert a dynamic 9x9 MatrixXd?

Mon Jul 15, 2013 7:11 pm
which solver did you tried? I shown the LU one for reference only, but is well known that a partial pivoting LU requires the matrix to be invertible, so not applicable in your case. This is also explain in our doc: http://eigen.tuxfamily.org/dox-devel/gr ... tions.html.

Have you the 3 others options I suggested? They are all working for me:

Code: Select all
`#include <iostream>#include <Eigen/Dense>using namespace Eigen;int main() {  MatrixXd A(9,9);  A <<  1384.33, 0, 0, 0, 0, 0, 553.1, 0, -1707.22,        0, 673.42, 673.42, 553.1, -601.406, 229.515, 0, 241.537, 0,        0, 673.42, 673.42, 553.1, -601.406, 229.515, 0, 241.537, 0,        0, 553.1, 553.1, 9288.69, 771.387, 4054.28, 0, -672.069, 0,        0, -601.406, -601.406, 771.387, 2848.9, 781.647, 0, -777.88, 0,        0, 229.515, 229.515, 4054.28, 781.647, 2986.75, 0, -459.042, 0,        553.1, 0, 0, 0, 0, 0, 771.387, 0, -672.069,        0, 241.537, 241.537, -672.069, -777.88, -459.042, 0, 781.647, 0,        -1707.22, 0, 0, 0, 0, 0, -672.069, 0, 4054.28;   RowVectorXd x(9), b(9);   x.setRandom();   b.transpose() = A * x.transpose(); // make sure a solution exists   x.setZero();      x.transpose() = A.jacobiSvd(ComputeThinU|ComputeThinV).solve(b.transpose());   std::cout << "svd: " << (A * x.transpose() - b.transpose()).norm() << "\n";      x.transpose() = A.fullPivLu().solve(b.transpose());   std::cout << "LU:  " << (A * x.transpose() - b.transpose()).norm() << "\n";      x.transpose() = A.colPivHouseholderQr().solve(b.transpose());   std::cout << "QR:  " << (A * x.transpose() - b.transpose()).norm() << "\n";}`

Output:
Code: Select all
`svd: 2.82792e-12LU:  4.58286e-13QR:  1.02002e-12`
hsharma
Registered Member
Posts
11
Karma
0

### Re: How to invert a dynamic 9x9 MatrixXd?

Tue Jul 16, 2013 11:03 pm
Thank you for the solution but I don't understand why these really large values (2.82792e-12) are coming and how can I avoid them?

And one more thing rather a stupid question but if the inverse of the matrix doesn't exist then how does the solution is reliable through these decomposition?

## Who is online

Registered users: andreas_k, Baidu [Spider], Bing [Bot], capslock, christopherwere, Google [Bot], IgorUkraine, koriun, Majestic-12 [Bot], mgraesslin, MSNbot Media, Nayar, paulus3005, peje, ramskulls, Sergey294511, smankowski, Sogou [Bot], Uri_Herrera, Yahoo [Bot]