Ejemplo n.º 1
0
 /**
  *	QR Decomposition computed by Householder reflections.
  *
  *	@param matrix $A Rectangular matrix
  *	@return Structure to access R and the Householder vectors and compute Q.
  */
 public function __construct($A)
 {
     if ($A instanceof PHPExcel_Shared_JAMA_Matrix) {
         // Initialize.
         $this->QR = $A->getArrayCopy();
         $this->m = $A->getRowDimension();
         $this->n = $A->getColumnDimension();
         // Main loop.
         for ($k = 0; $k < $this->n; ++$k) {
             // Compute 2-norm of k-th column without under/overflow.
             $nrm = 0.0;
             for ($i = $k; $i < $this->m; ++$i) {
                 $nrm = hypo($nrm, $this->QR[$i][$k]);
             }
             if ($nrm != 0.0) {
                 // Form k-th Householder vector.
                 if ($this->QR[$k][$k] < 0) {
                     $nrm = -$nrm;
                 }
                 for ($i = $k; $i < $this->m; ++$i) {
                     $this->QR[$i][$k] /= $nrm;
                 }
                 $this->QR[$k][$k] += 1.0;
                 // Apply transformation to remaining columns.
                 for ($j = $k + 1; $j < $this->n; ++$j) {
                     $s = 0.0;
                     for ($i = $k; $i < $this->m; ++$i) {
                         $s += $this->QR[$i][$k] * $this->QR[$i][$j];
                     }
                     $s = -$s / $this->QR[$k][$k];
                     for ($i = $k; $i < $this->m; ++$i) {
                         $this->QR[$i][$j] += $s * $this->QR[$i][$k];
                     }
                 }
             }
             $this->Rdiag[$k] = -$nrm;
         }
     } else {
         throw new Exception(PHPExcel_Shared_JAMA_Matrix::ArgumentTypeException);
     }
 }