[R] Seeking a more efficient way to find partition maxima

Talbot Katz topkatz at msn.com
Mon Jan 7 20:19:48 CET 2008


Thanks Gabor!  This is the sort of thing I was trying to devise, but I ran up against my extensively documented brain power limitations ;-)  Per your remarks, it remains to be seen how it performs compared to a good implementation with one of the apply functions.

--  TMK  --
212-460-5430	home
917-656-5351	cell
t o p k a t z @ m s n . c o m



> Date: Mon, 7 Jan 2008 13:49:13 -0500
> From: ggrothendieck at gmail.com
> To: topkatz at msn.com
> Subject: Re: [R] Seeking a more efficient way to find partition maxima
> CC: r-help at stat.math.ethz.ch
>
> Try testing the performance of transforming your series to
> one in which the values of each partition are larger than all
> prior partitions and the untransforming back:
>
> # test data
> myseq <- c(1, 4, 2, 6, 7, 5)
> part <- c(1, 4, 5)
>
> M <- max(myseq)
>
> # transform
> myseq2 <- myseq + M * cumsum(replace(0 * myseq, part, 1))
>
> # calcuate on transformed version
> tmp <- partiCmax(myseq2, part)
>
> # untransform
> tmp - M * seq_along(tmp) # c(4, 6, 7)
>
> Also you might check how it compares to the simpler
>
> tapply(myseq, cumsum(replace(0 * myseq, part, 1)), max)
>
> On Jan 7, 2008 11:18 AM, Talbot Katz  wrote:
>>
>> Hi.
>>
>> Suppose I have a vector that I partition into disjoint, contiguous subvectors. For example, let v = c(1,4,2,6,7,5), partition it into three subvectors, v1 = v[1:3], v2 = v[4], v3 = v[5:6]. I want to find the maximum element of each subvector. In this example, max(v1) is 4, max(v2) is 6, max(v3) is 7. If I knew that the successive subvector maxima would never decrease, as in the example, I could do the following:
>>
>> partiCmax <- function( values, seriesIdx ) {
>> # assume seriesIdx is increasing integer sequence beginning with 1, ending at less than or equal to length(values)
>> parti <- cbind( seriesIdx, c( ( seriesIdx[ -1 ] - 1 ), length( values ) ) )
>> return( cummax( values )[ parti[ , 2 ] ] )
>> }
>>
>>
>> The use of cummax makes that pretty efficient, but if the subvector maxima are not non-decreasing, it doesn't work. The following function works (at least it did on the examples I tried):
>>
>> partiMax <- function( values, seriesIdx ) {
>> # assume seriesIdx is increasing integer sequence beginning with 1, ending at less than or equal to length(values)
>> parti <- cbind( seriesIdx, c( ( seriesIdx[ -1 ] - 1 ), length( values ) ) )
>> return( sapply( ( 1:length(seriesIdx) ), function ( i ) {return( max( values[ parti[ i, 1 ]:parti[ i, 2 ] ] ) ) } ) )
>> }
>>
>>
>> but I figured someone out there could come up with something cleverer. Thanks!
>>
>> -- TMK --212-460-5430 home917-656-5351 cellt o p k a t z @ m s n . c o m
>> [[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.
>>




More information about the R-help mailing list