public List <double> GetEigenvalues(Matrix A, QRDecomposition.QRAlgorithm method)
        {
            var eigenvalues = new List <double>();
            int iter        = 0;

            while (A.Row != 1)
            {
                iter++;
                for (int i = A.Row - 1; i > 0; i--)
                {
                    if (Math.Abs(A.Elem[i][i - 1]) < 1e-6)
                    {
                        eigenvalues.Add(A.Elem[i][i]);
                        A.ExcludeRowColumn(i);
                        i = A.Row;
                    }
                }

                if (A.Row == 1)
                {
                    break;
                }

                double shift = WilcoxonShift(A);
                Shift(A, -shift);

                QRDecomposition QR = new QRDecomposition(A, method);
                A = QR.R * QR.Q;
                Shift(A, shift);
            }

            Console.WriteLine("Iter = " + iter.ToString() + "\n");

            eigenvalues.Add(A.Elem[0][0]);
            eigenvalues.Sort();
            eigenvalues.Reverse();

            return(eigenvalues);
        }
Beispiel #2
0
        public double CondSquareMatrix()
        {
            if (Row != Column)
            {
                throw new Exception("Row != Column");
            }

            var QRSolver = new QRDecomposition(Transpose(), QRDecomposition.QRAlgorithm.Householder);

            int numberThreads = Environment.ProcessorCount;
            var semaphores    = new bool[numberThreads];

            var normaRowA  = new double[numberThreads];
            var normaRowA1 = new double[numberThreads];

            var StartSolver = new ThreadSolver(number =>
            {
                var A1 = new Vector(Row);
                double S1, S2;

                int begin = Column / numberThreads * number;
                int end   = begin + Column / numberThreads;

                if (number + 1 == numberThreads)
                {
                    end += Column % numberThreads;
                }

                for (int i = begin; i < end; i++)
                {
                    A1.Elem[i] = 1.0;
                    A1         = QRSolver.StartSolver(A1);

                    S1 = 0; S2 = 0;

                    for (int j = 0; j < Row; j++)
                    {
                        S1        += Math.Abs(Elem[i][j]);
                        S2        += Math.Abs(A1.Elem[j]);
                        A1.Elem[j] = 0;
                    }

                    normaRowA[number]  = normaRowA[number] < S1 ? S1 : normaRowA[number];
                    normaRowA1[number] = normaRowA1[number] < S2 ? S2 : normaRowA1[number];
                }

                semaphores[number] = true;
            });

            for (int I = 0; I < numberThreads - 1; I++)
            {
                int number = numberThreads - I - 1;
                ThreadPool.QueueUserWorkItem(par => StartSolver(number));
            }

            StartSolver(0);

            while (Array.IndexOf <bool>(semaphores, false) != -1)
            {
            }

            for (int i = 1; i < numberThreads; i++)
            {
                normaRowA[0]  = normaRowA[0] < normaRowA[i] ? normaRowA[i] : normaRowA[0];
                normaRowA1[0] = normaRowA1[0] < normaRowA1[i] ? normaRowA1[i] : normaRowA1[0];
            }

            return(normaRowA[0] * normaRowA1[0]);
        }