Example #1
0
 /** 
  * Tests LU, QR, SVD and symmetric Eig decompositions.
  *
  *   n       = order of magic square.
  *   trace   = diagonal sum, should be the magic sum, (n^3 + n)/2.
  *   max_eig = maximum eigenvalue of (A + A')/2, should equal trace.
  *   rank    = linear algebraic rank, should equal n if n is odd,
  *             be less than n if n is even.
  *   cond    = L_2 condition number, ratio of singular values.
  *   lu_res  = test of LU factorization, norm1(L*U-A(p,:))/(n*eps).
  *   qr_res  = test of QR factorization, norm1(Q*R-A)/(n*eps).
  */
 function main()
 {
     ?>
 <p>Test of Matrix Class, using magic squares.</p>
 <p>See MagicSquareExample.main() for an explanation.</p>          
 <table border='1' cellspacing='0' cellpadding='4'>
   <tr>
     <th>n</th>     
     <th>trace</th>       
     <th>max_eig</th>   
     <th>rank</th>        
     <th>cond</th>      
     <th>lu_res</th>           
     <th>qr_res</th>
   </tr>
   <?php 
     $start_time = $this->microtime_float();
     $eps = pow(2.0, -52.0);
     for ($n = 3; $n <= 6; $n++) {
         echo "<tr>";
         echo "<td align='right'>{$n}</td>";
         $M = $this->magic($n);
         $t = (int) $M->trace();
         echo "<td align='right'>{$t}</td>";
         $O = $M->plus($M->transpose());
         $E = new EigenvalueDecomposition($O->times(0.5));
         $d = $E->getRealEigenvalues();
         echo "<td align='right'>" . $d[$n - 1] . "</td>";
         $r = $M->rank();
         echo "<td align='right'>" . $r . "</td>";
         $c = $M->cond();
         if ($c < 1 / $eps) {
             echo "<td align='right'>" . sprintf("%.3f", $c) . "</td>";
         } else {
             echo "<td align='right'>Inf</td>";
         }
         $LU = new LUDecomposition($M);
         $L = $LU->getL();
         $U = $LU->getU();
         $p = $LU->getPivot();
         // Java version: R = L.times(U).minus(M.getMatrix(p,0,n-1));
         $S = $L->times($U);
         $R = $S->minus($M->getMatrix($p, 0, $n - 1));
         $res = $R->norm1() / ($n * $eps);
         echo "<td align='right'>" . sprintf("%.3f", $res) . "</td>";
         $QR = new QRDecomposition($M);
         $Q = $QR->getQ();
         $R = $QR->getR();
         $S = $Q->times($R);
         $R = $S->minus($M);
         $res = $R->norm1() / ($n * $eps);
         echo "<td align='right'>" . sprintf("%.3f", $res) . "</td>";
         echo "</tr>";
     }
     echo "<table>";
     echo "<br />";
     $stop_time = $this->microtime_float();
     $etime = $stop_time - $start_time;
     echo "<p>Elapsed time is " . sprintf("%.4f", $etime) . " seconds.</p>";
 }
Example #2
0
 /**
  * Solve A*X = B.
  * @param Matrix $B Right hand side
  * @return Matrix ... Solution if A is square, least squares solution otherwise
  */
 function solve($B)
 {
     if ($this->m == $this->n) {
         $LU = new LUDecomposition($this);
         return $LU->solve($B);
     } else {
         $QR = new QRDecomposition($this);
         return $QR->solve($B);
     }
 }
Example #3
0
 /**
  *	Solve A*X = B.
  *
  *	@param Matrix $B Right hand side
  *	@return Matrix ... Solution if A is square, least squares solution otherwise
  */
 public function solve($B)
 {
     if ($this->m == $this->n) {
         $LU = new PHPExcel_Shared_JAMA_LUDecomposition($this);
         return $LU->solve($B);
     } else {
         $QR = new QRDecomposition($this);
         return $QR->solve($B);
     }
 }