Exemple #1
0
        EigenvalueDecomposition(
            Matrix Arg
            )
        {
            double[][] A = Arg;
            n = Arg.ColumnCount;
            V = Matrix.CreateMatrixData(n, n);
            d = new double[n];
            e = new double[n];

            isSymmetric = true;
            for (int j = 0; (j < n) & isSymmetric; j++)
            {
                for (int i = 0; (i < n) & isSymmetric; i++)
                {
                    isSymmetric &= (A[i][j] == A[j][i]);
                }
            }

            if (isSymmetric)
            {
                for (int i = 0; i < n; i++)
                {
                    for (int j = 0; j < n; j++)
                    {
                        V[i][j] = A[i][j];
                    }
                }

                SymmetricTridiagonalize();

                SymmetricDiagonalize();
            }
            else
            {
                H = new double[n][];
                for (int i = 0; i < n; i++)
                {
                    double[] Hi = new double[n];
                    double[] Ai = A[i];

                    for (int j = 0; j < n; j++)
                    {
                        Hi[j] = Ai[j];
                    }

                    H[i] = Hi;
                }

                NonsymmetricReduceToHessenberg();

                NonsymmetricReduceHessenberToRealSchur();
            }

            _eigenValuesReal = new Vector(d);
            _eigenValuesImag = new Vector(e);
            _eigenValues     = ComplexVector.Create(d, e);

            InitOnDemandComputations();
        }
Exemple #2
0
        EigenvalueDecomposition(
            double[] d,
            double[] e
            )
        {
            // TODO: unit test missing for EigenvalueDecomposition constructor.

            n = d.Length;
            V = Matrix.CreateMatrixData(n, n);

            this.d = new double[n];
            Array.Copy(d, 0, this.d, 0, n);

            this.e = new double[n];
            Array.Copy(e, 0, this.e, 1, n - 1);

            for (int i = 0; i < n; i++)
            {
                V[i][i] = 1;
            }

            SymmetricDiagonalize();

            _eigenValuesReal = new Vector(this.d);
            _eigenValuesImag = new Vector(this.e);
            _eigenValues     = ComplexVector.Create(this.d, this.e);

            InitOnDemandComputations();
        }
        CrossProduct(
            IVector <Complex> u,
            IVector <Complex> v
            )
        {
            CheckMatchingVectorDimensions(u, v);
            if (3 != u.Length)
            {
                throw new ArgumentOutOfRangeException("u", Resources.ArgumentVectorThreeDimensional);
            }

            ComplexVector product = new ComplexVector(new Complex[] {
                u[1] * v[2] - u[2] * v[1],
                u[2] * v[0] - u[0] * v[2],
                u[0] * v[1] - u[1] * v[0]
            });

            return(product);
        }