Search code examples
matlabindexingblocksparse-matrix

Manipulating sparse matrices in Matlab


Suppose I have a sparse matrix Sparstica that is a vertical concatenation of several other sparse matrices. When I type Sparstica(:), I get a list of the nonzero elements. In the left column, will be the index of the element, in the right column will be the nonzero element.

How can I manipulate the i-th and j-th non-zero element of every other sparse block matrix in the middle n-2 blocks (n sparse block matrices in total)?


Appended: To clarify what I mean by the i-th and j-th element of every other sparse matrix, suppose I have

Sparstica = [A_1; A_2; A_3; ... ; A_n]

This was created from vertcat. Now I need to take the i-th and j-th, say the 3rd and 5th, nonzero element of every other sparse matrix from A_2 to A_{N-1} (I know the notation for this actually isn't allowed, but just for demonstrative purposes). I'd like to accomplish this without using for-loops if possible.


Solution

  • You can find the non-zero elements using find:

    >> A = speye(3)
    
    A =
    
       (1,1)        1
       (2,2)        1
       (3,3)        1
    
    >> I = find(A ~= 0)
    
    I =
    
         1
         5
         9
    

    If you need the indices in row/column format, use ind2sub:

    >> [X, Y] = ind2sub(size(A), I)
    
    X =
    
         1
         2
         3
    
    Y =
    
         1
         2
         3