public SymmetricSparseRowColumnMatrix(
            double[] di,
            double[] aa,
            int[] ia,
            int[] ja)
        {
            if (di == null)
            {
                throw new ArgumentNullException(nameof(di));
            }
            if (aa == null)
            {
                throw new ArgumentNullException(nameof(aa));
            }
            if (ia == null)
            {
                throw new ArgumentNullException(nameof(ia));
            }
            if (ja == null)
            {
                throw new ArgumentNullException(nameof(ja));
            }

            if (ja.Length != ia[ia.Length - 1] - ia[0] ||
                ja.Length != aa.Length ||
                di.Length != ia.Length - 1)
            {
                throw new RankException();
            }

            this.di = (double[])di.Clone();
            this.aa = (double[])aa.Clone();
            this.ia = (int[])ia.Clone();
            this.ja = (int[])ja.Clone();

            if (this.ia[0] == 1)
            {
                for (int i = 0; i < this.ia.Length; i++)
                {
                    this.ia[i]--;
                }

                for (int j = 0; j < this.ja.Length; j++)
                {
                    this.ja[j]--;
                }
            }

            for (int i = 0; i < Size; i++)
            {
                Sorter.QuickSort(this.ja, this.ia[i], this.ia[i + 1] - 1, this.aa);
                //Array.Sort(this.ja, this.aa, this.ia[i], this.ia[i + 1] - this.ia[i]);
            }
        }
        private int[] ia;   //количество ненулевых элементов в строк

        //ia1- первый элемент в строке
        //ia2 - последний элемент в строке или первый элемент следующий строки

        public SymmetricSparseRowMatrix(double[] a, int[] ja, int[] ia)
        {
            if (a == null)
            {
                throw new ArgumentNullException(nameof(a));
            }

            if (ja == null)
            {
                throw new ArgumentNullException(nameof(ja));
            }

            if (ia == null)
            {
                throw new ArgumentNullException(nameof(ia));
            }

            if (a.Length != ja.Length)
            {
                throw new ArgumentNullException("a and ja must be equal size");
            }

            if (a.Length != ia[ia.Length - 1])
            {
                throw new ArgumentNullException("wrong count of elements");
            }
            this.ia = (int[])ia.Clone();
            this.ja = (int[])ja.Clone();
            this.a  = (double[])a.Clone();

            if (this.ia[0] == 1)
            {
                for (int i = 0; i < this.ia.Length; i++)
                {
                    this.ia[i]--;
                }

                for (int j = 0; j < this.ja.Length; j++)
                {
                    this.ja[j]--;
                }
            }

            for (int i = 1; i < Size; i++)
            {
                Sorter.QuickSort(this.ja, this.ia[i], this.ia[i + 1] - 1, this.a);
            }
        }