Question

My system is best described by a diagonal sparse matrix (Poisson). I have my diagonal sparse matrix, however, I want to change the boundary conditions (ie the "edges" of my matrix) to zero. It must be a common situation where a modeler wants to describe a system in a sparse diagonal matrix with distinct boundary conditions, is there a best practice for doing this?

[[0,0,0,0,..0],
 [0,2,1,0,..0],
 [0,1,2,1,..0],
 ...
 [0,0,0,0,..0]]
Was it helpful?

Solution

It depends on which sparse matrix format you use. Apparently lil_matrix and dok_matrix can use slice assignments.

To construct a matrix efficiently, use either lil_matrix (recommended) or dok_matrix. The lil_matrix class supports basic slicing and fancy indexing with a similar syntax to NumPy arrays.

Which makes this rather easy:

In : x = scipy.sparse.lil_matrix(np.ones((6,6)))

In : x.todense()
Out:
matrix([[ 1.,  1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.,  1.],
        [ 1.,  1.,  1.,  1.,  1.,  1.]])

In : x[:, 0] = 0

In : x[:, -1] = 0

In : x[0, :] = 0

In : x[-1, :] = 0

In : x.todense()
Out:
matrix([[ 0.,  0.,  0.,  0.,  0.,  0.],
        [ 0.,  1.,  1.,  1.,  1.,  0.],
        [ 0.,  1.,  1.,  1.,  1.,  0.],
        [ 0.,  1.,  1.,  1.,  1.,  0.],
        [ 0.,  1.,  1.,  1.,  1.,  0.],
        [ 0.,  0.,  0.,  0.,  0.,  0.]])

PS: FYI, your matrix is called tridiagonal, not diagonal.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top