<div>Francois,</div>
<div>&nbsp;</div>
<div>Please submit a bug. Include the contents of your posting plus any other helpful info.</div>
<div>&nbsp;</div>
<div><a href="http://itk.org/Wiki/ITK_Procedure_for_Contributing_Bug_Fixes">http://itk.org/Wiki/ITK_Procedure_for_Contributing_Bug_Fixes</a></div>
<div>&nbsp;</div>
<div>Thanks,</div>
<div>&nbsp;</div>
<div>Bill<br><br></div>
<div class="gmail_quote">On Fri, Feb 8, 2008 at 4:02 PM, Francois Budin &lt;<a href="mailto:insight.mailinglist.francois@budin.fr">insight.mailinglist.francois@budin.fr</a>&gt; wrote:<br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Hi all,<br><br>I was trying to compute the inverse of an affine transform (<br>itk::AffineTransform&lt;double,3&gt; ) using the following function:<br>
bool GetInverse (Self *inverse) const<br><br>I couldn&#39;t succeed to detect when the matrix was non-invertible. I<br>tried to verify the value returned in the boolean but it always seems<br>to be 1. I also tried to detect if any exception were thrown but it<br>
didn&#39;t catch anything.<br>My code is the following:<br><br><br>&nbsp; &nbsp;bool noninvertible=0;<br>&nbsp; &nbsp;itk::Transform&lt;double,3,3&gt;::Pointer inverseTransform;<br>&nbsp; &nbsp;try<br>&nbsp; &nbsp;{<br>&nbsp; &nbsp; typename AffineTransformType::Pointer affine =<br>
dynamic_cast&lt;AffineTransformType* &gt; ( transform.GetPointer() ) ;<br>&nbsp; &nbsp;if(affine )<br>&nbsp; &nbsp;{<br>&nbsp; &nbsp; &nbsp;typename AffineTransformType::Pointer<br>affinetemp=AffineTransformType::New();<br>&nbsp; &nbsp; &nbsp;std::cout&lt;&lt;affine-&gt;GetInverse(affinetemp)&lt;&lt;std::endl;//should<br>
print 0 if non-invertible transform;<br>&nbsp; &nbsp; &nbsp;inverseTransform=affinetemp;<br>&nbsp; &nbsp;}<br>&nbsp;else<br>&nbsp; &nbsp;{<br>&nbsp; &nbsp; &nbsp;typename RotationType::Pointer rigid =<br>dynamic_cast&lt;RotationType* &gt; ( transform.GetPointer() ) ;<br>&nbsp; &nbsp; &nbsp;if(rigid)<br>
&nbsp; &nbsp; &nbsp;{<br>&nbsp; &nbsp; &nbsp; &nbsp;typename RotationType::Pointer rigidtemp=RotationType::New();<br>&nbsp; &nbsp; &nbsp; &nbsp;std::cout&lt;&lt;rigid-&gt;GetInverse(rigidtemp)&lt;&lt;std::endl;<br>&nbsp; &nbsp; &nbsp; &nbsp;inverseTransform=rigidtemp;<br>&nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp; &nbsp;else<br>&nbsp; &nbsp; &nbsp;{<br>
&nbsp; &nbsp; &nbsp; &nbsp;noninvertible=1;//I don&#39;t need to handle the other kinds of transform<br>&nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp;}<br>&nbsp; &nbsp;}<br>&nbsp; &nbsp;catch(...)<br>&nbsp; &nbsp;{<br>&nbsp; &nbsp; &nbsp;std::cout&lt;&lt;&quot;Exception Detected&quot;&lt;&lt;std::endl;<br>&nbsp; &nbsp;noninvertible=1;<br>
&nbsp; &nbsp;}<br><br><br>Then I tried to write a small piece of code which copies what ITK is<br>doing to inverse an affine transform to test the inversion of the<br>matrix itself:<br><br>#include &lt;itkMatrix.h&gt;<br><br>int main(int argnb,char* arg[])<br>
{<br>itk::Matrix&lt;double,3,3&gt; mat;<br>mat.Fill(0);<br>mat[0][0]=-1;<br>try<br>&nbsp; &nbsp; &nbsp;{<br>&nbsp; &nbsp; std::cout&lt;&lt;mat.GetInverse()&lt;&lt;std::endl;<br>&nbsp; &nbsp; &nbsp;}<br>&nbsp; &nbsp;catch(...)<br>&nbsp; &nbsp; &nbsp;{<br>&nbsp; &nbsp; &nbsp;std::cout&lt;&lt;&quot;Singular&quot;&lt;&lt;std::endl;<br>
&nbsp; &nbsp; &nbsp;}<br><br>return 0;<br>}<br><br>Nothing got caught, so I suspect that there is a problem somewhere and<br>that the vnl functions used to inverse the matrix does not throw any<br>exception when it is singular. If I am wrong, could anybody tell me<br>
what I should change in my code?<br>Sincerely,<br><br>Francois<br>_______________________________________________<br>Insight-users mailing list<br><a href="mailto:Insight-users@itk.org">Insight-users@itk.org</a><br><a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
</blockquote></div><br>