[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] SVD Bug
- From: Benoit Jacob <jacob.benoit.1@xxxxxxxxx>
- Date: Thu, 23 Sep 2010 09:58:36 -0400
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=RMSvPuvbwFoO+6322iKCLK6mwiacfd+dLOuba3LccF0=; b=N+8OgoyyPUEHpNANneT3OE3lai14UdBp3OnTehaN3RF+Xi4FRevnsBVtAS+XvuG9wS 8SMNomMYyFZTy1bDROUpUhERplgXFUz4lF3B7ISY/fqo4BIofoFz3uiFIkr0A8U3Lcr7 2iZr9hy73ohfZLMxEAlcFllWYTtW5uIfiyfwI=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=OMdgs/lGCR+6+cbGBpDEC9PRzy0ObBpk51uC84aKtEJx3wbAEHtWb5UWWI+PhPJswf jTff4hkF52Ms+II4P1rHqSSo19ahlVRN3/4oPqz5keaSQd+od1NS84uqVi6klFFQhMWr Qcm5JYsOf12yq1eZj//k4I3NQSf8jgazX24dE=
It turns out that the unit test was failing because it was trying to
solve a system that didn't have solution. It took a random rectangular
matrix and a random rhs and tried to solve. That was working well on
square matrices, but broke on rectangular matrices with rows >= cols.
I pushed your patch plus one more changeset fixing the unit test, and
fixing the SVD to actually enforce rows >= cols since our code is
still relying on that.
Also I kept the existing U unchanged in all its stupidity (mxm filled
with zeros in the useless area) because it's not worth breaking
existing behavior at this point; once SVD is reimplemented the
matrixU() method will be deprecated anyway and replaced by something
that evaluates only what's needed.
In conclusion, problem solved, thanks for your memory error fix.
Benoit
2010/9/23 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:
> OK so what happens is that this SVD implementation computes a compact U:
>
> m_matU.setZero();
> if (m>=n)
> m_matU.block(0,0,m,n) = A;
> else
> m_matU = A.block(0,0,m,m);
>
> it doesn't bother extending the remaining rows by orthonormalization.
> That actually isn't a bad thing. So the decomposition itself is fine.
> We need to:
> - document that aspect of U when taking the SVD of a rectangular matrix
> - fix the solve method.
>
> Benoit
>
> 2010/9/23 Benoit Jacob <jacob.benoit.1@xxxxxxxxx>:
>> 2010/9/23 Hauke Heibel <hauke.heibel@xxxxxxxxxxxxxx>:
>>> I tried to look into it but failed. I can only say that already the
>>> matrix U is strange since its last row is zero and this should not be
>>> the case.
>>
>> Yes, indeed, that's very interesting:
>>
>> a
>> -0.08936 0.971
>> -0.5195 -0.1061
>> 0.3311 -0.4731
>>
>> matrixU
>> -0.8752 -0.2161 0
>> -0.009971 0.9026 0
>> 0.4837 -0.3723 0
>>
>> sigma
>> 1.105 0
>> 0 0.5873
>> 0 0
>>
>> matrixV.transpose()
>> 0.2205 -0.9754
>> -0.9754 -0.2205
>> This unit test is really very insufficient. It should at least have
>> checked that U is unitary.
>>
>> Benoit
>>
>>
>>>
>>> I know that Benoit is still working on rewriting the SVD but at least
>>> the bad memory access should be fixed.
>>>
>>> Cheers,
>>> Hauke
>>>
>>
>