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); } }