<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://programmingexamples.net/w/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://programmingexamples.net/w/index.php?action=history&amp;feed=atom&amp;title=CPP%2FBoost%2FMath%2FuBLAS%2Fdeterminant</id>
		<title>CPP/Boost/Math/uBLAS/determinant - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://programmingexamples.net/w/index.php?action=history&amp;feed=atom&amp;title=CPP%2FBoost%2FMath%2FuBLAS%2Fdeterminant"/>
		<link rel="alternate" type="text/html" href="http://programmingexamples.net/w/index.php?title=CPP/Boost/Math/uBLAS/determinant&amp;action=history"/>
		<updated>2026-05-30T04:14:11Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.23.5</generator>

	<entry>
		<id>http://programmingexamples.net/w/index.php?title=CPP/Boost/Math/uBLAS/determinant&amp;diff=4718&amp;oldid=prev</id>
		<title>Awallin: lu_factorize determinant example</title>
		<link rel="alternate" type="text/html" href="http://programmingexamples.net/w/index.php?title=CPP/Boost/Math/uBLAS/determinant&amp;diff=4718&amp;oldid=prev"/>
				<updated>2011-08-14T12:27:39Z</updated>
		
		<summary type="html">&lt;p&gt;lu_factorize determinant example&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Note: if you need to calculate the determinant of a 'small' matrix (3x3 or maybe 5x5) I have found that a brute-force method is much faster than using lu_factorize().&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/numeric/ublas/matrix.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/numeric/ublas/io.hpp&amp;gt;&lt;br /&gt;
#include &amp;lt;boost/numeric/ublas/lu.hpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
namespace bnu = boost::numeric::ublas;&lt;br /&gt;
&lt;br /&gt;
int determinant_sign(const bnu::permutation_matrix&amp;lt;std::size_t&amp;gt;&amp;amp; pm)&lt;br /&gt;
{&lt;br /&gt;
    int pm_sign=1;&lt;br /&gt;
    std::size_t size = pm.size();&lt;br /&gt;
    for (std::size_t i = 0; i &amp;lt; size; ++i)&lt;br /&gt;
        if (i != pm(i))&lt;br /&gt;
            pm_sign *= -1.0; // swap_rows would swap a pair of rows here, so we change sign&lt;br /&gt;
    return pm_sign;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
double determinant( bnu::matrix&amp;lt;double&amp;gt;&amp;amp; m ) {&lt;br /&gt;
    bnu::permutation_matrix&amp;lt;std::size_t&amp;gt; pm(m.size1());&lt;br /&gt;
    double det = 1.0;&lt;br /&gt;
    if( bnu::lu_factorize(m,pm) ) {&lt;br /&gt;
        det = 0.0;&lt;br /&gt;
    } else {&lt;br /&gt;
        for(int i = 0; i &amp;lt; m.size1(); i++) &lt;br /&gt;
            det *= m(i,i); // multiply by elements on diagonal&lt;br /&gt;
        det = det * determinant_sign( pm );&lt;br /&gt;
    }&lt;br /&gt;
    return det;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main () {&lt;br /&gt;
    bnu::matrix&amp;lt;double&amp;gt; m(3, 3);&lt;br /&gt;
    for (unsigned i = 0; i &amp;lt; m.size1() ; ++i) {&lt;br /&gt;
        for (unsigned j = 0; j &amp;lt; m.size2() ; ++j) {&lt;br /&gt;
            m (i, j) = 3 * i + sqrt(j+1); // fill matrix&lt;br /&gt;
            m(i,j) = m(i,j)*m(i,j);       // with some numbers&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;before det() call m= &amp;quot; &amp;lt;&amp;lt; m &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    double det = determinant(m);&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;after det() call  m= &amp;quot; &amp;lt;&amp;lt; m &amp;lt;&amp;lt; std::endl; // m has changed afted determinant() call!&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;determinant=&amp;quot; &amp;lt;&amp;lt; det &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Awallin</name></author>	</entry>

	</feed>