[GRASS-dev] r.series threshold patch
Glynn Clements
glynn at gclements.plus.com
Mon Aug 20 16:48:27 EDT 2007
Markus Neteler wrote:
> >> >> to easier operate on incomplete time series from MODIS (and
> >> >> others), we would like to suggest attached patch. It
> >> >> adds a threshold to filter out incomplete pixel series
> >> >> before calling the aggregation function which saves us
> >> >> to perform extra runs on counting valid pixels and to
> >> >> post-filter the aggregated results.
> >> >
> >> > While I don't doubt that this is a useful optimisation for your
> >> > particular case, I'm generally opposed to adding such optimisations
> >> > for specific cases.
> >> >
> >> > A more general optimisation would be to extend the method= and output=
> >> > options to accept multiple values, so that you can compute multiple
> >> > aggregates in a single run. You would still need to combine the two
> >> > outputs with e.g. r.mapcalc, but you would only need one run of
> >> > r.series.
> >> >
> >> The optimization you propose is of course far more general than what
> >> we did, and could be extremely valuable.
> >>
> >> Nonetheless, we think that introducing the threshold parameter is not
> >> really a special case hack: all it really does is a straightforward
> >> generalization of the current -n flag, transforming it from a ON/OFF
> >> switch to an integer value.
> >>
> >> The threshold parameter indicates the minimum number of non NULL
> >> inputs required for passing over the inputs to the aggregation
> >> function.
> >>
> >> It varies in the range [1,num_inputs]; thresh=num_inputs is equivalent
> >> to -n (return NULL unless the inputs are all non NULL), while thresh=1
> >> is the standard behaviour (compute the aggregation if there is at
> >> least 1 non NULL input).
> >
> > Actually, thresh=0 would give the existing behaviour. If -n isn't
> > used, the values are always passed to the aggregate function. If all
> > of the values are null, most aggregates will return null, but the
> > "count" aggregate will return 0.
>
> You are right.
> Do you still vote against the patch in general (along with better
> documentation)?
I probably won't be extending r.series to support multiple aggregates
and outputs in the near future, so I don't have any real objection to
the patch.
One minor nit: the test doesn't need any additional parentheses; using:
if (null && flag.nulls->answer || num_inputs - null < thresh)
is sufficient.
C operator precedence (highest to lowest):
application () [] -> .
unary ! ~ ++ -- + - * (type) sizeof
multiplicative * / %
additive + -
shift << >>
inequality < <= > >=
equality == !=
bitwise-and &
bitwise-xor ^
bitwise-or |
logical-and &&
logical-or ||
conditional ?:
assignment = += -= *= /= %= &= ^= |= <<= >>=
sequencing ,
The unary, conditional and assignment operators are right-associative,
all others are left-associative.
Briefly: arithmetic operators are higher than relational operators
which are higher than logical operators, which is the most convenient
order for if/while/etc tests, and && is higher than ||, so
sum-of-products doesn't require parentheses.
--
Glynn Clements <glynn at gclements.plus.com>
More information about the grass-dev
mailing list