[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
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list