Beispiel #1
0
        public static ComplexDoubleVector GenerateRow(IComplexDoubleMatrix A, int r, int c1, int c2)
        {
            int cu = c2 - c1 + 1;
            ComplexDoubleVector u = new ComplexDoubleVector(cu);

            for (int j = c1; j <= c2; j++)
            {
                u[j - c1] = A[r, j];
                A[r, j]   = Complex.Zero;
            }

            double norm = u.GetNorm();

            if (c1 == c2 || norm == 0)
            {
                A[r, c1] = new Complex(-u[0].Real, -u[0].Imag);
                u[0]     = System.Math.Sqrt(2);
                return(u);
            }

            Complex scale = new Complex(1 / norm);

            Complex t  = Complex.Zero;
            Complex t1 = Complex.Zero;

            if (u[0].Real != 0 || u[0].Imag != 0)
            {
                t     = u[0];
                t1    = ComplexMath.Conjugate(u[0]);
                t     = ComplexMath.Absolute(t);
                t     = t1 / t;
                scale = scale * t;
            }

            A[r, c1] = -Complex.One / scale;

            for (int j = 0; j < cu; j++)
            {
                u[j] *= scale;
            }

            u[0] = new Complex(u[0].Real + 1);
            double s = System.Math.Sqrt(1 / u[0].Real);

            for (int j = 0; j < cu; j++)
            {
                u[j] = new Complex(s * u[j].Real, -s * u[j].Imag);
            }
            return(u);
        }
Beispiel #2
0
        public static ComplexDoubleVector GenerateColumn(IComplexDoubleMatrix A, int r1, int r2, int c)
        {
            int ru = r2 - r1 + 1;
            ComplexDoubleVector u = new ComplexDoubleVector(r2 - r1 + 1);

            for (int i = r1; i <= r2; i++)
            {
                u[i - r1] = A[i, c];
                A[i, c]   = Complex.Zero;
            }

            double norm = u.GetNorm();

            if (r1 == r2 || norm == 0)
            {
                A[r1, c] = new Complex(-u[0]);
                u[0]     = System.Math.Sqrt(2);
                return(u);
            }

            Complex scale = new Complex(1 / norm, 0);

            Complex t  = Complex.Zero;
            Complex t1 = Complex.Zero;

            if (u[0].Real != 0 || u[0].Imag != 0)
            {
                t     = u[0];
                t1    = ComplexMath.Conjugate(u[0]);
                t     = ComplexMath.Absolute(t);
                t     = t1 / t;
                scale = scale * t;
            }
            A[r1, c] = -Complex.One / scale;

            for (int i = 0; i < ru; i++)
            {
                u[i] = u[i] * scale;
            }

            u[0] = new Complex(u[0].Real + 1, 0);
            double s = System.Math.Sqrt(1 / u[0].Real);

            for (int i = 0; i < ru; i++)
            {
                u[i] = new Complex(s * u[i].Real, s * u[i].Imag);
            }
            return(u);
        }
Beispiel #3
0
		public static ComplexDoubleVector GenerateColumn(IComplexDoubleMatrix A, int r1, int r2, int c)
		{
			int ru = r2 - r1 + 1;
			ComplexDoubleVector u = new ComplexDoubleVector(r2 - r1 + 1);

			for (int i = r1; i <= r2; i++)
			{
				u[i - r1] = A[i, c];
				A[i, c] = Complex.Zero;
			}

			double norm = u.GetNorm();

			if (r1 == r2 || norm == 0)
			{
				A[r1, c] = new Complex(-u[0]);
				u[0] = System.Math.Sqrt(2);
				return u;
			}

			Complex scale = new Complex(1 / norm, 0);

			Complex t = Complex.Zero;
			Complex t1 = Complex.Zero;
			if (u[0].Real != 0 || u[0].Imag != 0)
			{
				t = u[0];
				t1 = ComplexMath.Conjugate(u[0]);
				t = ComplexMath.Absolute(t);
				t = t1 / t;
				scale = scale * t;
			}
			A[r1, c] = -Complex.One / scale;

			for (int i = 0; i < ru; i++)
			{
				u[i] = u[i] * scale;
			}

			u[0] = new Complex(u[0].Real + 1, 0);
			double s = System.Math.Sqrt(1 / u[0].Real);

			for (int i = 0; i < ru; i++)
			{
				u[i] = new Complex(s * u[i].Real, s * u[i].Imag);
			}
			return u;
		}
 public void GetNorm()
 {
   ComplexDoubleVector a = new ComplexDoubleVector(new double[4]{0,1,2,3});
   ComplexDoubleVector b = new ComplexDoubleVector(new double[4]{4,5,6,7});
   
   Assert.AreEqual(a.GetNorm(),System.Math.Sqrt(14));
   Assert.AreEqual(a.GetNorm(),a.GetNorm(2));
   Assert.AreEqual(a.GetNorm(0),3);
   
   Assert.AreEqual(b.GetNorm(),3*System.Math.Sqrt(14));
   Assert.AreEqual(b.GetNorm(),b.GetNorm(2));
   Assert.AreEqual(b.GetNorm(0),7);  
 }
Beispiel #5
0
		public static ComplexDoubleVector GenerateRow(IComplexDoubleMatrix A, int r, int c1, int c2)
		{
			int cu = c2 - c1 + 1;
			ComplexDoubleVector u = new ComplexDoubleVector(cu);

			for (int j = c1; j <= c2; j++)
			{
				u[j - c1] = A[r, j];
				A[r, j] = Complex.Zero;
			}

			double norm = u.GetNorm();

			if (c1 == c2 || norm == 0)
			{
				A[r, c1] = new Complex(-u[0].Real, -u[0].Imag);
				u[0] = System.Math.Sqrt(2);
				return u;
			}

			Complex scale = new Complex(1 / norm);

			Complex t = Complex.Zero;
			Complex t1 = Complex.Zero;
			if (u[0].Real != 0 || u[0].Imag != 0)
			{
				t = u[0];
				t1 = ComplexMath.Conjugate(u[0]);
				t = ComplexMath.Absolute(t);
				t = t1 / t;
				scale = scale * t;
			}

			A[r, c1] = -Complex.One / scale;

			for (int j = 0; j < cu; j++)
			{
				u[j] *= scale;
			}

			u[0] = new Complex(u[0].Real + 1);
			double s = System.Math.Sqrt(1 / u[0].Real);

			for (int j = 0; j < cu; j++)
			{
				u[j] = new Complex(s * u[j].Real, -s * u[j].Imag);
			}
			return u;
		}