public void NullTest()
 {
     Assert.Throws(typeof(ArgumentNullException), () =>
     {
         var test = new ComplexFloatQRDecomp(null);
     });
 }
        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));
        }