return A;
}
-SparseMatrix SparseMatrix_crop(SparseMatrix A, real epsilon){
- int i, j, *ia, *ja, nz, sta;
-
- if (!A) return A;
-
- nz = 0;
- ia = A->ia;
- ja = A->ja;
- sta = ia[0];
- switch (A->type){
- case MATRIX_TYPE_REAL:{
- real *a = (real*) A->a;
- for (i = 0; i < A->m; i++){
- for (j = sta; j < ia[i+1]; j++){
- if (fabs(a[j]) > epsilon){
- ja[nz] = ja[j];
- a[nz++] = a[j];
- }
- }
- sta = ia[i+1];
- ia[i+1] = nz;
- }
- A->nz = nz;
- break;
- }
- case MATRIX_TYPE_COMPLEX:{
- real *a = (real*) A->a;
- for (i = 0; i < A->m; i++){
- for (j = sta; j < ia[i+1]; j++){
- if (sqrt(a[2*j]*a[2*j]+a[2*j+1]*a[2*j+1]) > epsilon){
- ja[nz] = ja[j];
- a[2*nz] = a[2*j];
- a[2*nz+1] = a[2*j+1];
- nz++;
- }
- }
- sta = ia[i+1];
- ia[i+1] = nz;
- }
- A->nz = nz;
- break;
- }
- case MATRIX_TYPE_INTEGER:{
- int *a = (int*) A->a;
- for (i = 0; i < A->m; i++){
- for (j = sta; j < ia[i+1]; j++){
- if (abs(a[j]) > epsilon){
- ja[nz] = ja[j];
- a[nz++] = a[j];
- }
- }
- sta = ia[i+1];
- ia[i+1] = nz;
- }
- A->nz = nz;
- break;
- }
- case MATRIX_TYPE_PATTERN:{
- break;
- }
- case MATRIX_TYPE_UNKNOWN:
- return NULL;
- default:
- return NULL;
- }
-
- return A;
-}
-
SparseMatrix SparseMatrix_copy(SparseMatrix A){
SparseMatrix B;
if (!A) return A;
SparseMatrix SparseMatrix_apply_fun(SparseMatrix A, double (*fun)(double x));/* for real only! */
SparseMatrix SparseMatrix_copy(SparseMatrix A);
int SparseMatrix_has_diagonal(SparseMatrix A);
-SparseMatrix SparseMatrix_crop(SparseMatrix A, real epsilon);/*remove any entry <= epsilon*/
SparseMatrix SparseMatrix_scaled_by_vector(SparseMatrix A, real *v, int apply_to_row);
SparseMatrix SparseMatrix_make_undirected(SparseMatrix A);/* make it strictly low diag only, and set flag to undirected */
int SparseMatrix_connectedQ(SparseMatrix A);