This forum has been archived. All content is frozen. Please use KDE Discuss instead.

Doubt regarding diagonal preconditioner

Tags: None
(comma "," separated)
hkannan
Registered Member
Posts
9
Karma
0
In the page, http://eigen.tuxfamily.org/dox-devel/cl ... ioner.html, this is the description for the diagonal preconditioner:

This class allows to approximately solve for A.x = b problems assuming A is a diagonal matrix. In other words, this preconditioner neglects all off diagonal entries and, in Eigen's language, solves for: A.diagonal().asDiagonal() . x = b

I am not clear about this description. What is meant by "solves for: A.diagonal().asDiagonal() . x = b"? That is a big simplification and I don't think that is happening.
User avatar
ggael
Moderator
Posts
3447
Karma
19
OS
More precisely is basically does something like:

x = A.diagonal().asDiagonal().inverse() * b;

except that the zeros on the diagonal are ignored (if any).
hkannan
Registered Member
Posts
9
Karma
0
Sorry for the late reply.

Isnt the following a huge simplification?

x = A.diagonal().asDiagonal().inverse() * b;

Diagonal preconditioning solves the following system in general:

A.diagonal().asDiagonal() * A * x = A.diagonal().asDiagonal() * b;
User avatar
ggael
Moderator
Posts
3447
Karma
19
OS
hkannan wrote:A.diagonal().asDiagonal() * A * x = A.diagonal().asDiagonal() * b;


once integrated within a solver, the problem that is really solved is A.diagonal().inverse()*(A*x-b)=0 (you forgot the inverse in your equation). Within the solver, we need to be able to apply A.diagonal().inverse() to some vectors, this is what DiagonalPreconditioner::solve() is responsible for. So at the level of DiagonalPreconditioner::solve(), it does something like y = A.diagonal().asDiagonal().pseudoInverse() * f;
hkannan
Registered Member
Posts
9
Karma
0
Thanks for the clarification.


Bookmarks



Who is online

Registered users: bartoloni, Bing [Bot], Google [Bot], Yahoo [Bot]