[GRASS-user] log(0)-error in r.mapcalculator
Patrick S.
patrick_GIS at gmx.ch
Fri Nov 9 02:17:04 PST 2012
Markus,
I understand your arguments, but "A" is the slope of r.slope.aspect and
has floating point values as input for the formula. I just created a
testcase to be able to report on the behavior in detail. As you can see
below the results are truncated to integer as soon as I add a term to
"A" before the devision, but it remains unclear to me why adding a
float-value reduces the attributes to integer-level as well.
This is a somewhat tricky behavior as it is usual to add a small
constant to all values to avoid log(0)-errors.
Patrick
####TESTING
#algorithm:
param<-list(amap="r_slope_perc", formula=##varies in testing-see
below##", outfile="r_test_logit") ###formula has been replaced for each
execGRASS("r.mapcalculator", parameters=param, flags=c("overwrite"))
x_perc<-readRAST6("r_slope_perc")
x_log<-readRAST6("r_test_logit")
xperc<-x_perc$r_slope_perc
xlog<-x_log$r_test_logit
summary(xperc)
summary(xlog)
sum(xperclog(((A+1)/100)/(1-(A+1/100)))==0, na.rm=T)
###Testcase1: formula= log(((A/100)/(1-(A/100))
> summary(xperc)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.000 3.162 8.602 13.540 18.440 229.800 9852
> summary(xlog)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-4.9 -3.1 -2.2 -2.2 -1.4 9.5 564240
> sum(xperc==0, na.rm=T)
[1] 550958
###Testcase2: formula= log(((A+1)/100)/(1-(A+1/100)))
> summary(xperc)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.000 3.162 8.602 13.540 18.440 229.800 9852
> summary(xlog)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-5 -5 -5 -4 -5 -3 5369270
> sum(xperc==0, na.rm=T)
[1] 550958
###Testcase3: formula= log(((A+0.01)/100)/(1-(A+0.01/100)))
> summary(xperc)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
0.000 3.162 8.602 13.540 18.440 229.800 9852
> summary(xlog)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-9 -9 -9 -8 -9 -4 5369270
> sum(xperc==0, na.rm=T)
[1] 550958
On 11/09/2012 10:22 AM, Markus Metz wrote:
>
> The documentation is correct. The problem arose because
> ((A/100)/(1-(A/100)) returns an integer value if A is an integer, i.e.
> the truncation happened before log() is called.
>
> Markus M
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/grass-user/attachments/20121109/fec1c382/attachment-0001.html>
More information about the grass-user
mailing list