TSVDUnfold: Maximum matrix size

Dear All,

following question: I am using TSVDUnfold to unfold a smearing matrix in three several kinematic variables. This makes the smearing matrix (detector response matrix) quite large, 1089x1089. I get the following error message:
Error in ;TDecompSVD::Diagonalize;: no convergence after 10988 steps
It also doesn’t converge when I let it run for some more time, I just get more error messages.
I don’t think the matrix looks very ill conditioned, it is mostly diagonal, with some off diagonal elements and off-diagonal ‘blocks’, since the coordinate in the matrix is made of the bins of three variables.
If I restrict the matrix to 99x99 by only using two kinematical variables it works without problems.

So my question is, should it work with a large matrix like that?
And if so, is there something I can do to make it converge (normalize in some way etc…)



_ROOT Version:_6.14/04
Platform: macosx64
Compiler: precompiled


It could be that the hard-code maximum number of iterations= 10 * number of columns
(see line 313 of TDecompSVD::Diagonalize https://root.cern.ch/doc/master/TDecompSVD_8cxx_source.html#l00307 ) is too small.

If you can recompile ROOT, I would try to increase this number. Otherwise you might try to rescale the matrix to make the convergence working better


Hi Lorenzo,

thanks for the reply. I have the precompiled version, so I’ll try the rescaling. Any guidance on that? E.g. should I scale up or down, should I for a maximum value of 1?

I can try to compile myself and increase the maximum number of iterations. But if I understand you correctly, that just suppresses the error messages and wouldn’t help with the actual convergence…

Thanks again,


Hi Lorenzo,

I tried to increase the number of steps from 10 to 100 * number of columns but I get the same error message (albeit now after 10 times more iterations).
Any tips on how to rescale the matrix?


Hi Anselm,

You can not g’estimate a condition number by looking at the matrix. What is it ?
It is just a simple call to Double_t TDecompSVD::Condition()

This limit of 10*ncol iterations is rather standard in this kind of algorithm.

Could you please look at the comments in TDecompBase and consider
the consequences for your matrix.

If you really want to play with the algorithm change the conversion
threshold as defined by ‘eps’.


This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.