LADEL main
Sparse LDL factorization package with rank 1 and rowadd/rowdel updates
ladel_transpose.c
Go to the documentation of this file.
1#include "ladel_types.h"
2#include "ladel_global.h"
3#include "ladel_constants.h"
4
6{
7 if (!M) return NULL;
8 ladel_int *col_pointers, index;
9
10 ladel_sparse_matrix *M_transpose = ladel_sparse_alloc(M->ncol, M->nrow, M->nzmax, -M->symmetry, values && M->values, FALSE);
11
12 if (!M_transpose) return NULL;
13 if (M->nzmax == 0) return M_transpose; //Empty matrix, so no work left
14
15 if (work) col_pointers = work->array_int_ncol1;
16 else col_pointers = ladel_malloc(M->nrow, sizeof(ladel_int));
17 for (index = 0; index < M->nrow; index++) col_pointers[index] = 0;
18
19 ladel_int col, new_index, prev_col_count;
20 for (col = 0; col < M->ncol; col++)
21 LADEL_FOR(index, M, col)
22 col_pointers[M->i[index]]++;
23
24 M_transpose->p[0] = 0;
25 for (col = 1; col < M_transpose->ncol; col++)
26 {
27 prev_col_count = col_pointers[col-1];
28 col_pointers[col] += prev_col_count;
29 M_transpose->p[col] = prev_col_count;
30 col_pointers[col-1] = M_transpose->p[col-1];
31 }
32 M_transpose->p[M_transpose->ncol] = col_pointers[M_transpose->ncol-1];
33 col_pointers[M_transpose->ncol-1] = M_transpose->p[M_transpose->ncol-1];
34
35 for (col = 0; col < M->ncol; col++)
36 {
37 LADEL_FOR(index, M, col)
38 {
39 new_index = col_pointers[M->i[index]]++;
40 M_transpose->i[new_index] = col;
41 if (M_transpose->values) M_transpose->x[new_index] = M->x[index];
42 }
43 }
44
45 if (!work) ladel_free(col_pointers);
46 return M_transpose;
47}
#define FALSE
For booleans.
#define LADEL_FOR(index, M, col)
Loop through a column of a sparse matrix.
Constants and macros used in LADEL.
Memory allocation routines.
ladel_sparse_matrix * ladel_sparse_alloc(ladel_int nrow, ladel_int ncol, ladel_int nzmax, ladel_int symmetry, ladel_int values, ladel_int nz)
Allocate a sparse matrix.
Definition: ladel_global.c:101
void * ladel_malloc(ladel_int n, size_t size)
Version of malloc (for mex or for regular C).
Definition: ladel_global.c:52
void * ladel_free(void *p)
Version of free (for mex or for regular C).
Definition: ladel_global.c:60
ladel_sparse_matrix * ladel_transpose(ladel_sparse_matrix *M, ladel_int values, ladel_work *work)
Returns the transpose of a matrix, that is .
Structures and types used in LADEL routines.
int64_t ladel_int
Type for integer numbers (default: int64_t)
Definition: ladel_types.h:24
Sparse matrix in compressed column storage.
Definition: ladel_types.h:35
ladel_int symmetry
type of symmetry (UNSYMMETRIC, UPPER or LOWER)
Definition: ladel_types.h:46
ladel_int ncol
number of columns
Definition: ladel_types.h:38
ladel_double * x
numerical values (size nzmax)
Definition: ladel_types.h:42
ladel_int nzmax
number of nonzeros
Definition: ladel_types.h:36
ladel_int * p
column pointers (size ncol+1)
Definition: ladel_types.h:40
ladel_int values
has numerical values
Definition: ladel_types.h:45
ladel_int nrow
number of rows
Definition: ladel_types.h:37
ladel_int * i
row pointers (size nzmax)
Definition: ladel_types.h:41
Workspace required for various routines in LADEL.
Definition: ladel_types.h:109
ladel_int * array_int_ncol1
An array of ncol integers.
Definition: ladel_types.h:116