# [R] sub-matrix block size

David Winsemius dwinsemius at comcast.net
Wed Apr 27 14:57:33 CEST 2011

```On Apr 27, 2011, at 12:07 AM, Dennis Murphy wrote:

> Hi:
>
> Maybe this can help get you started. Reading your data into a matrix
> m,
>
> m <- structure(c(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,
> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
> 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
> 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0,
> 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), .Dim =
> c(11L,
> 11L))
>
> rowSums(m) + colSums(m) - 1
> [1]  2  2  1 -1  3  3  3  3  3  3 -1
>
> The pair of 2's => a 2 x 2 block, 1 => a 1 x 1 matrix with value 1, -1
> => a 1 x 1 matrix with entry 0, a triplet of 3's => a 3 x 3 subblock,
> etc. You should be able to figure out the rows and columns for each
> submatrix from the indices of the vector above; the values provide an
> indication of matrix size as well as position.
>

If we are in the stage of providing potentially useful but incomplete
ideas, this would be my notion. Use the row and col functions with "["
to locate non-zero elements in the diagonal and subdiagonal:

Diagonal:  (My matrix was named `mm`)
> mm[row(mm)==col(mm)]
[1] 1 1 1 0 1 1 1 1 1 1 0
First subdiagonal:
> mm[row(mm)==col(mm)+1]
[1] 0 0 0 0 0 0 0 0 0 0
First superdiagonal:
> mm[row(mm)==col(mm)-1]
[1] 1 0 0 0 1 1 0 1 1 0

Perhaps a combination of the two? It seems as though the rowSums/
colSums approach might be insensitive to whether triangular blocks
were sub or super diagonal:

> rowSums(mm) + colSums(mm) - 1
[1]  2  2  1 -1  3  3  3  3  3  3 -1
> mm[1,2]<-0
> mm[2,1]<-1
> rowSums(mm) + colSums(mm) - 1
[1]  2  2  1 -1  3  3  3  3  3  3 -1

> HTH,
> Dennis
>
>
>
> On Tue, Apr 26, 2011 at 5:13 PM, Santosh <santosh2005 at gmail.com>
> wrote:
>> Dear Rxperts
>>
>> Below is a small vector of values of zeros and non-zeros... was
>> wondering if
>> there is an efficient way to get the block sizes of submatrices of
>> a big
>> matrix similar to the one shown below? diagonal elements can be
>> zero too.
>> Rows with only a diagonal element may be considered as a unit block
>> size.
>>
>> c(1,0,0,0,0,0,0,0,0,0,0,
>>   1,1,0,0,0,0,0,0,0,0,0,
>>   0,0,1,0,0,0,0,0,0,0,0,
>>   0,0,0,0,0,0,0,0,0,0,0,
>>   0,0,0,0,1,0,0,0,0,0,0,
>>   0,0,0,0,1,1,0,0,0,0,0,
>>   0,0,0,0,1,1,1,0,0,0,0,
>>   0,0,0,0,0,0,0,1,0,0,0,
>>   0,0,0,0,0,0,0,1,1,0,0,
>>   0,0,0,0,0,0,0,1,1,1,0,
>>   0,0,0,0,0,0,0,0,0,0,0)
>>
>> Thanks much!
>> Santosh
>>
>>        [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-help at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help