/// <summary> /// Инициализация матрицы координатной матрицей /// </summary> /// <param name="c_matrix">Матрица в координатном формате</param> public DenseMatrix(CoordinateMatrix c_matrix) { d_matrix = new double[c_matrix.Size, c_matrix.Size]; this.Size = Size; for (int i = 0; i < Size; i++) { for (int j = 0; j < Size; j++) { d_matrix[i, j] = 0; } } foreach (var val in c_matrix) { this.d_matrix[val.row, val.col] = val.value; } }
public SparseRowMatrix(CoordinateMatrix c_matrix, bool isSym = false) { this.isSymmetric = isSym; List <List <KeyValuePair <int, double> > > elements_al; elements_al = new List <List <KeyValuePair <int, double> > >(); this.Size = c_matrix.Size; for (int m = 0; m < this.Size; m++) { elements_al.Add(new List <KeyValuePair <int, double> >()); } ig = new int[this.Size + 1]; int i, j; foreach (var val in c_matrix) { i = val.row; j = val.col; elements_al[i].Add(new KeyValuePair <int, double>(j, val.value)); } ig[0] = 0; for (int k = 1; k <= this.Size; k++) { ig[k] = ig[k - 1] + elements_al[k - 1].Count; } al = new double[ig[this.Size]]; jg = new int[ig[this.Size]]; int tmp = 0; for (int k = 0; k < this.Size; k++) { for (int l = 0; l < elements_al[k].Count; l++, tmp++) { al[tmp] = elements_al[k][l].Value; jg[tmp] = elements_al[k][l].Key; } } }
public SparseRowColumnMatrix(CoordinateMatrix c_matrix) { List <List <KeyValuePair <int, double> > > elements_al; List <List <KeyValuePair <int, double> > > elements_au; elements_al = new List <List <KeyValuePair <int, double> > >(); elements_au = new List <List <KeyValuePair <int, double> > >(); this.Size = c_matrix.Size; for (int m = 0; m < this.Size; m++) { elements_al.Add(new List <KeyValuePair <int, double> >()); elements_au.Add(new List <KeyValuePair <int, double> >()); } di = new double[this.Size]; ig = new int[this.Size + 1]; int i, j; foreach (var val in c_matrix) { i = val.row; j = val.col; if (i == j) { di[i] = val.value; } else { if (i > j) { elements_al[i].Add(new KeyValuePair <int, double>(j, val.value)); } else { elements_au[j].Add(new KeyValuePair <int, double>(i, val.value)); } } } ig[0] = 0; ig[1] = 0; for (int k = 2; k <= this.Size; k++) { if (elements_al[k - 1].Count == elements_au[k - 1].Count) { ig[k] = ig[k - 1] + elements_al[k - 1].Count; } else { if (elements_al[k - 1].Count < elements_au[k - 1].Count) { ig[k] = ig[k - 1] + elements_au[k - 1].Count; } else { ig[k] = ig[k - 1] + elements_al[k - 1].Count; } } } al = new double[ig[this.Size]]; au = new double[ig[this.Size]]; jg = new int[ig[this.Size]]; int tmp = 0; for (int k = 0; k < this.Size; k++) { for (int l = 0; l < elements_al[k].Count || l < elements_au[k].Count; l++, tmp++) { if (elements_al[k].Count > 0 && elements_au[k].Count > 0 && l < elements_al[k].Count && l < elements_au[k].Count) { if (elements_al[k][l].Key == elements_au[k][l].Key) { al[tmp] = elements_al[k][l].Value; au[tmp] = elements_au[k][l].Value; jg[tmp] = elements_au[k][l].Key; } else { if (elements_al[k][l].Key < elements_au[k][l].Key) { al[tmp] = elements_al[k][l].Value; au[tmp] = 0; jg[tmp] = elements_al[k][l].Key; } else { al[tmp] = 0; au[tmp] = elements_au[k][l].Value; jg[tmp] = elements_au[k][l].Key; } } } else { if (l < elements_au[k].Count) { if (elements_al[k].Count == 0) { al[tmp] = 0; } else { for (int h = 0; h < elements_al[k].Count; h++) { if (elements_al[k][h].Key == elements_au[k][l].Key) { al[tmp] = elements_al[k][h].Value; break; } } } au[tmp] = elements_au[k][l].Value; jg[tmp] = elements_au[k][l].Key; } else { al[tmp] = elements_al[k][l].Value; if (elements_au[k].Count == 0) { au[tmp] = 0; } else { for (int h = 0; h < elements_al[k].Count; h++) { if (elements_al[k][l].Key == elements_au[k][h].Key) { au[tmp] = elements_au[k][h].Value; break; } } } jg[tmp] = elements_al[k][l].Key; } } } } }