public static CholmodInfo ConverterDouble(ref SparseMatrixDouble A, CholmodInfo.CholmodMatrixStorage storage) { CholmodInfo info = new CholmodInfo(); info.MatrixType = CholmodInfo.CholmodMatrixType.Sparse; info.MatrixStorageType = storage; info.RowCount = A.RowCount; info.ColumnCount = A.ColumnCount; switch (storage) { case CholmodInfo.CholmodMatrixStorage.CRS: A.ToCRS(out info.rowIndex, out info.colIndex, out info.values, out info.nnz); break; case CholmodInfo.CholmodMatrixStorage.CCS: A.ToCCS(out info.colIndex, out info.rowIndex, out info.values, out info.nnz); break; case CholmodInfo.CholmodMatrixStorage.Triplet: A.ToTriplet(out info.colIndex, out info.rowIndex, out info.values, out info.nnz); break; default: A.ToTriplet(out info.colIndex, out info.rowIndex, out info.values, out info.nnz); break; } return info; }
public static CholmodInfo ConverterDouble(ref SparseMatrixDouble A, CholmodInfo.CholmodMatrixStorage storage) { CholmodInfo info = new CholmodInfo(); info.MatrixType = CholmodInfo.CholmodMatrixType.Sparse; info.MatrixStorageType = storage; info.RowCount = A.RowCount; info.ColumnCount = A.ColumnCount; switch (storage) { case CholmodInfo.CholmodMatrixStorage.CRS: A.ToCRS(out info.rowIndex, out info.colIndex, out info.values, out info.nnz); break; case CholmodInfo.CholmodMatrixStorage.CCS: A.ToCCS(out info.colIndex, out info.rowIndex, out info.values, out info.nnz); break; case CholmodInfo.CholmodMatrixStorage.Triplet: A.ToTriplet(out info.colIndex, out info.rowIndex, out info.values, out info.nnz); break; default: A.ToTriplet(out info.colIndex, out info.rowIndex, out info.values, out info.nnz); break; } return(info); }
public Eigen ComputeEigensByLib(SparseMatrixDouble sparse, double sigma, int count) { int[] pCol; int[] iRow; double[] Values; int NNZ; int m = sparse.RowCount; sparse.ToCCS(out pCol, out iRow, out Values, out NNZ); double[] ImagePart = new double[count]; double[] RealPart = new double[count]; double[] Vectors = new double[count * m]; fixed(int *ri = iRow, cp = pCol) fixed(double *val = Values, vets = Vectors, imgPart = ImagePart, relPart = RealPart) { int result = ComputeEigenNoSymmetricShiftModeCRS(ri, cp, val, NNZ, m, count, sigma, relPart, imgPart, vets); } List <EigenPair> list = new List <EigenPair>(); for (int i = 0; i < count; i++) { double realPart = RealPart[i]; List <double> vector = new List <double>(); int startIndex = i * m; int endIndex = i * m + m; for (int j = startIndex; j < endIndex; j++) { double value = Vectors[j]; vector.Add(value); } EigenPair newPair = new EigenPair(realPart, vector); list.Add(newPair); } list.Sort(); Eigen eigen = new Eigen(); eigen.SortedEigens = list.ToArray(); return(eigen); }
public Eigen ComputeEigensByLib(SparseMatrixDouble sparse, double sigma, int count) { int[] pCol; int[] iRow; double[] Values; int NNZ; int m = sparse.RowCount; sparse.ToCCS(out pCol, out iRow, out Values, out NNZ); double[] ImagePart = new double[count]; double[] RealPart = new double[count]; double[] Vectors = new double[count * m]; fixed (int* ri = iRow, cp = pCol) fixed (double* val = Values, vets = Vectors, imgPart = ImagePart, relPart = RealPart) { int result = ComputeEigenNoSymmetricShiftModeCRS(ri, cp, val, NNZ, m, count, sigma, relPart, imgPart, vets); } List<EigenPair> list = new List<EigenPair>(); for (int i = 0; i < count; i++) { double realPart = RealPart[i]; List<double> vector = new List<double>(); int startIndex = i * m; int endIndex = i * m + m; for (int j = startIndex; j < endIndex; j++) { double value = Vectors[j]; vector.Add(value); } EigenPair newPair = new EigenPair(realPart, vector); list.Add(newPair); } list.Sort(); Eigen eigen = new Eigen(); eigen.SortedEigens = list.ToArray(); return eigen; }
public void ToCCS(out int[] colPtr, out int[] rowIndices, out double[] values, out int nnz) { SparseMatrixDouble sparse = new SparseMatrixDouble(4 * this.rowCount, 4 * this.columnCount); foreach (KeyValuePair <Pair, Quaternion> e in mapData) { Pair pair = e.Key; double q0 = e.Value.x; double q1 = e.Value.y; double q2 = e.Value.z; double q3 = e.Value.w; if (q0 != 0) { sparse.Datas.Add(new Pair(4 * pair.Key, 4 * pair.Value), q0); sparse.Datas.Add(new Pair(4 * pair.Key + 1, 4 * pair.Value + 1), q0); sparse.Datas.Add(new Pair(4 * pair.Key + 2, 4 * pair.Value + 2), q0); sparse.Datas.Add(new Pair(4 * pair.Key + 3, 4 * pair.Value + 3), q0); } if (q1 != 0) { sparse.Datas.Add(new Pair(4 * pair.Key + 1, 4 * pair.Value), q1); sparse.Datas.Add(new Pair(4 * pair.Key, 4 * pair.Value + 1), q1); sparse.Datas.Add(new Pair(4 * pair.Key + 3, 4 * pair.Value + 2), q1); sparse.Datas.Add(new Pair(4 * pair.Key + 2, 4 * pair.Value + 3), q1); } if (q2 != 0) { sparse.Datas.Add(new Pair(4 * pair.Key + 2, 4 * pair.Value), q1); sparse.Datas.Add(new Pair(4 * pair.Key, 4 * pair.Value + 2), q1); sparse.Datas.Add(new Pair(4 * pair.Key + 3, 4 * pair.Value + 1), q1); sparse.Datas.Add(new Pair(4 * pair.Key + 1, 4 * pair.Value + 3), q1); } if (q3 != 0) { sparse.Datas.Add(new Pair(4 * pair.Key + 3, 4 * pair.Value), q1); sparse.Datas.Add(new Pair(4 * pair.Key, 4 * pair.Value + 3), q1); sparse.Datas.Add(new Pair(4 * pair.Key + 2, 4 * pair.Value + 1), q1); sparse.Datas.Add(new Pair(4 * pair.Key + 1, 4 * pair.Value + 2), q1); } } sparse.ToCCS(out colPtr, out rowIndices, out values, out nnz); }
public void FactorizationQR(ref SparseMatrixDouble A) { // CholmodInfo cholmodA = CholmodConverter.Converter(ref A); int rowCount = A.RowCount; int columnCount = A.ColumnCount; int nnz = 0; this.m = rowCount; this.n = columnCount; int[] Ri = null; int[] Ci = null; double[] values = null; A.ToCCS(out Ci, out Ri, out values, out nnz); fixed(int *ri = Ri, ci = Ci) fixed(double *val = values) { solver = CreateSolverQRSuiteSparseQR_CCS(rowCount, columnCount, nnz, ri, ci, val); } if (solver == null) throw new Exception("Create Solver Fail"); }
public void ToCCS(out int[] colPtr, out int[] rowIndices, out double[] values, out int nnz) { SparseMatrixDouble sparse = new SparseMatrixDouble(4 * this.rowCount, 4 * this.columnCount); foreach (KeyValuePair<Pair, Quaternion> e in mapData) { Pair pair = e.Key; double q0 = e.Value.w; double q1 = e.Value.x; double q2 = e.Value.y; double q3 = e.Value.z; if (q0 != 0) { sparse.Datas.Add(new Pair(4 * pair.Key, 4 * pair.Value), q0); sparse.Datas.Add(new Pair(4 * pair.Key + 1, 4 * pair.Value + 1), q0); sparse.Datas.Add(new Pair(4 * pair.Key + 2, 4 * pair.Value + 2), q0); sparse.Datas.Add(new Pair(4 * pair.Key + 3, 4 * pair.Value + 3), q0); } if (q1 != 0) { sparse.Datas.Add(new Pair(4 * pair.Key + 1, 4 * pair.Value), q1); sparse.Datas.Add(new Pair(4 * pair.Key, 4 * pair.Value + 1), -q1); sparse.Datas.Add(new Pair(4 * pair.Key + 3, 4 * pair.Value + 2), q1); sparse.Datas.Add(new Pair(4 * pair.Key + 2, 4 * pair.Value + 3), -q1); } if (q2 != 0) { sparse.Datas.Add(new Pair(4 * pair.Key + 2, 4 * pair.Value), q2); sparse.Datas.Add(new Pair(4 * pair.Key + 3, 4 * pair.Value + 1), -q2); sparse.Datas.Add(new Pair(4 * pair.Key, 4 * pair.Value + 2), -q2); sparse.Datas.Add(new Pair(4 * pair.Key + 1, 4 * pair.Value + 3), q2); } if (q3 != 0) { sparse.Datas.Add(new Pair(4 * pair.Key + 3, 4 * pair.Value), q3); sparse.Datas.Add(new Pair(4 * pair.Key + 2, 4 * pair.Value + 1), q3); sparse.Datas.Add(new Pair(4 * pair.Key, 4 * pair.Value + 3), -q3); sparse.Datas.Add(new Pair(4 * pair.Key + 1, 4 * pair.Value + 2), -q3); } } sparse.ToCCS(out colPtr, out rowIndices, out values, out nnz); }
public void FactorizationQR(ref SparseMatrixDouble A) { // CholmodInfo cholmodA = CholmodConverter.Converter(ref A); int rowCount = A.RowCount; int columnCount = A.ColumnCount; int nnz = 0; this.m = rowCount; this.n = columnCount; int[] Ri = null; int[] Ci = null; double[] values = null; A.ToCCS(out Ci, out Ri, out values, out nnz); fixed (int* ri = Ri, ci = Ci) fixed (double* val = values) { solver = CreateSolverQRSuiteSparseQR_CCS(rowCount, columnCount, nnz, ri, ci, val); } if (solver == null) throw new Exception("Create Solver Fail"); }