Fastest way to set up a sparse matrix in matlab
I am working with iterative methods and hence large sparse matrices. For example, I want to create a matrix like this:
1 1 0 0 1 0 0 0 0 0
1 1 1 0 0 1 0 0 0 0
0 1 1 1 0 0 1 0 0 0
0 0 1 1 1 0 0 1 0 0
1 0 0 1 1 1 0 0 1 0
0 1 0 0 1 1 1 0 0 1
So, only some of the diagonals are nonzero. In my programming I will work with much larger matrix sizes, but the idea is the same: only a few diagonals are nonzero, all other entries are zeros.
I know how to do it for a loop, but it seems inefficient if the matrix size is large. I also work with symmetric matrices. I would appreciate it if you could provide me with the code for my sample matrix along with a description.
+3
source to share
1 answer
You want spdiags
:
m = 6; %// number of rows
n = 10; %// number of columns
diags = [-4 -1 0 1 4]; %// diagonals to be filled
A = spdiags(ones(min(m,n), numel(diags)), diags, m, n);
This gives:
>> full(A)
ans =
1 1 0 0 1 0 0 0 0 0
1 1 1 0 0 1 0 0 0 0
0 1 1 1 0 0 1 0 0 0
0 0 1 1 1 0 0 1 0 0
1 0 0 1 1 1 0 0 1 0
0 1 0 0 1 1 1 0 0 1
+5
source to share