public SparseRowColumnMatrix(
            double[] di,
            double[] al,
            double[] au,
            int[] ia,
            int[] ja)
        {
            if (di == null)
            {
                throw new ArgumentNullException(nameof(di));
            }
            if (al == null)
            {
                throw new ArgumentNullException(nameof(al));
            }
            if (au == null)
            {
                throw new ArgumentNullException(nameof(au));
            }
            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 != al.Length ||
                ja.Length != au.Length ||
                di.Length != ia.Length - 1)
            {
                throw new RankException();
            }

            this.di = (double[])di.Clone();
            this.al = (double[])al.Clone();
            this.au = (double[])au.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.al, this.au);
                //Array.Sort(this.ja, this.aa, this.ia[i], this.ia[i + 1] - this.ia[i]);
            }
        }