[R] How to speed up int2bin conversion?
Jonas Jägermeyr
jonasjae at pik-potsdam.de
Thu Dec 1 16:16:59 CET 2011
On 12/01/2011 02:46 PM, jim holtman wrote:
> If we assume that you are just convert 8 bits, here is one way with a
> table lookup. If more than 8 bits, just partition the data and
> repeat. This sets up a mapping table one time for the lookup. Does
> 1M in 0.3 seconds on my computer; is this fast enough?
>
>> # initialize a matrix with 8 bit binary values
>> # one time
>> require(bitops)
>> b2c<- character(256)
>> for (i in 0:255){
> + b2c[i + 1]<- sprintf("%1d%1d%1d%1d%1d%1d%1d%1d"
> + , bitAnd(i, 0x80) != 0
> + , bitAnd(i, 0x40) != 0
> + , bitAnd(i, 0x20) != 0
> + , bitAnd(i, 0x10) != 0
> + , bitAnd(i, 0x8) != 0
> + , bitAnd(i, 0x4) != 0
> + , bitAnd(i, 0x2) != 0
> + , bitAnd(i, 0x1) != 0
> + )
> + }
>> # create vector with 1M values
>> x<- as.integer(1:1e6)
>>
>> int2bin<- function(val)
> + {
> + b2c[bitAnd(val, 0xff) + 1]
> + }
>> system.time(int2bin(x))
> user system elapsed
> 0.31 0.00 0.32
>
> On Thu, Dec 1, 2011 at 7:14 AM, Jonas Jägermeyr<jonasjae at pik-potsdam.de> wrote:
>> Dear R-help members,
>>
>> I'm processing a large amount of MODIS data where quality assessment
>> information is stored as an integer value for each pixel. I have to
>> converted this number to an 8 digit binary flag to get access to the
>> stored quality code (e.g. in2bin(165,8) = 1 0 1 0 0 1 0 1).
>>
>> Unfortunately, I did not manage to find a package providing a fast
>> function to do so. I need to run this on millions of pixels and thus
>> wrote the following function.
>>
>> int2bin<- function(x,ndigits){
>> base<- array(NA, dim=c(length(x), ndigits))
>> for(q in 1:ndigits){
>> base[, ndigits-q+1]<- (x %% 2)
>> x<- (x %/% 2)
>> }
>> bin<- apply(base,1,paste,collapse="")
>> return(bin)
>> }
>>
>> Since it is still slow, I have to find a way to express this more
>> elegantly. I'd really appreciate any help.
>>
>> Thanking you, with best regards
>>
>> Jonas Jägermeyr
>>
>> Potsdam Institute for Climate Impact Research
>> Research Domain II
>>
>> [[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.
>>
>
>
Great Jim! Thanks a lot. New way of thinking, appreciated.
I also need 16 and 32 bit flags and hence I just added those two lines:
int2bin16<- function(val) {
paste(int2bin(val%/%256),int2bin(val),sep="")
}
int2bin32<- function(val) {
paste(int2bin(val%/%256^3),int2bin(val%/%256^2),int2bin(val%/%256),int2bin(val),sep="")
}
Best,
Jonas Jägermeyr
Potsdam Institute for Climate Impact Research
Research Domain II
More information about the R-help
mailing list