public void SquareDecomp()
    {
      ComplexFloatMatrix a = new ComplexFloatMatrix(3);
      a[0,0] = new ComplexFloat(1.1f, 1.1f);
      a[0,1] = new ComplexFloat(2.2f, -2.2f);
      a[0,2] = new ComplexFloat(3.3f, 3.3f);
      a[1,0] = new ComplexFloat(4.4f, -4.4f);
      a[1,1] = new ComplexFloat(5.5f, 5.5f);
      a[1,2] = new ComplexFloat(6.6f, -6.6f);
      a[2,0] = new ComplexFloat(7.7f, 7.7f);
      a[2,1] = new ComplexFloat(8.8f, -8.8f);
      a[2,2] = new ComplexFloat(9.9f, 9.9f);
      
      ComplexFloatQRDecomp qrd = new ComplexFloatQRDecomp(a);
      ComplexFloatMatrix qq = qrd.Q.GetConjugateTranspose()*qrd.Q;
      ComplexFloatMatrix qr = qrd.Q*qrd.R;
      ComplexFloatMatrix I = ComplexFloatMatrix.CreateIdentity(3);
      
      // determine the maximum relative error
      double MaxError = 0.0;
      for (int i = 0; i < 3; i++) 
      {
        for (int j = 0; i < 3; i++) 
        {
          double E = ComplexMath.Absolute((qq[i, j] - I[i, j]));
          if (E > MaxError) 
          {
            MaxError = E;
          }
        }
      }
      
      Assert.IsTrue(MaxError < 1.0E-6);
      
      MaxError = 0.0;
      for (int i = 0; i < 3; i++) 
      {
        for (int j = 0; i < 3; i++) 
        {
          double E = ComplexMath.Absolute((qr[i, j] - a[i, j]) / a[i, j]);
          if (E > MaxError) 
          {
            MaxError = E;
          }
        }
      }

      Assert.IsTrue(MaxError < 2.4E-6);
    }
 public void NullTest()
 {
   ComplexFloatQRDecomp test = new ComplexFloatQRDecomp(null);
 }
    public void SolveMatrix()
    {
      ComplexFloatMatrix a = new ComplexFloatMatrix(3);
      a[0,0] = new ComplexFloat(1.1f, 1.1f);
      a[0,1] = new ComplexFloat(2.2f, -2.2f);
      a[0,2] = new ComplexFloat(3.3f, 3.3f);
      a[1,0] = new ComplexFloat(4.4f, -4.4f);
      a[1,1] = new ComplexFloat(5.5f, 5.5f);
      a[1,2] = new ComplexFloat(6.6f, -6.6f);
      a[2,0] = new ComplexFloat(7.7f, 7.7f);
      a[2,1] = new ComplexFloat(8.8f, -8.8f);
      a[2,2] = new ComplexFloat(9.9f, 9.9f);
      ComplexFloatQRDecomp qr = new ComplexFloatQRDecomp(a);

      ComplexFloatMatrix b = new ComplexFloatMatrix(3);
      b[0,0] = new ComplexFloat(2.3f, -3.2f);
      b[0,1] = new ComplexFloat(2.3f, -3.2f);
      b[0,2] = new ComplexFloat(2.3f, -3.2f);
      b[1,0] = new ComplexFloat(6.7f, 7.8f);
      b[1,1] = new ComplexFloat(6.7f, 7.8f);
      b[1,2] = new ComplexFloat(6.7f, 7.8f);
      b[2,0] = new ComplexFloat(1.3f, -9.7f);
      b[2,1] = new ComplexFloat(1.3f, -9.7f);
      b[2,2] = new ComplexFloat(1.3f, -9.7f);

      ComplexFloatMatrix X = qr.Solve(b);

      Assert.IsTrue(Comparer.AreEqual(X[0,0],new ComplexFloat(-0.57f,1.14f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[0,1],new ComplexFloat(-0.57f,1.14f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[0,2],new ComplexFloat(-0.57f,1.14f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[1,0],new ComplexFloat(1.03f,-0.16f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[1,1],new ComplexFloat(1.03f,-0.16f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[1,2],new ComplexFloat(1.03f,-0.16f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[2,0],new ComplexFloat(0.16f,-0.52f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[2,1],new ComplexFloat(0.16f,-0.52f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[2,2],new ComplexFloat(0.16f,-0.52f),.01));

      a = new ComplexFloatMatrix(3,2);
      a[0,0] = new ComplexFloat(1.1f, 1.1f);
      a[0,1] = new ComplexFloat(2.2f, -2.2f);
      a[1,0] = new ComplexFloat(4.4f, -4.4f);
      a[1,1] = new ComplexFloat(5.5f, 5.5f);
      a[2,0] = new ComplexFloat(7.7f, 7.7f);
      a[2,1] = new ComplexFloat(8.8f, -8.8f);
      qr = new ComplexFloatQRDecomp(a);

      b = new ComplexFloatMatrix(3);
      b[0,0] = new ComplexFloat(2.3f, -3.2f);
      b[0,1] = new ComplexFloat(2.3f, -3.2f);
      b[0,2] = new ComplexFloat(2.3f, -3.2f);
      b[1,0] = new ComplexFloat(6.7f, 7.8f);
      b[1,1] = new ComplexFloat(6.7f, 7.8f);
      b[1,2] = new ComplexFloat(6.7f, 7.8f);
      b[2,0] = new ComplexFloat(1.3f, -9.7f);
      b[2,1] = new ComplexFloat(1.3f, -9.7f);
      b[2,2] = new ComplexFloat(1.3f, -9.7f);

      X = qr.Solve(b);

      Assert.IsTrue(Comparer.AreEqual(X[0,0],new ComplexFloat(-0.344f,0.410f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[0,1],new ComplexFloat(-0.344f,0.410f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[0,2],new ComplexFloat(-0.344f,0.410f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[1,0],new ComplexFloat(1.01f,-0.170f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[1,1],new ComplexFloat(1.01f,-0.170f),.01));
      Assert.IsTrue(Comparer.AreEqual(X[1,2],new ComplexFloat(1.01f,-0.170f),.01));
    }