Re: [eigen] Matrix2i mean |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] Matrix2i mean
- From: Petr Kubánek <pkubanek@xxxxxxxxx>
- Date: Tue, 05 Nov 2019 08:44:10 -0700
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:subject:from:to:date:in-reply-to:references:mime-version :content-transfer-encoding; bh=Xw5SZK4gBSOuYNT3tNfMrQOK3Axhm4vGosyVzn7/Qi4=; b=ZJVu5ROPltO/TR3PvsB3grg3YE0G/+hTGDunn0yAtrTUF3qZsS1kvxNkMovOkxoybD KnHZyMDgk5OhFyyf5zC+hXHNuoUHOB7nji6WIrDuPMZ8MpGElPOLtbv/BaNp6aib2WBj ivDehgvYQ/FA8zgl/PO3AEUCl4G5xHu3GwAt214IJ54sHtoK2HAqsUro7JzMAivmijvE QM7nL1C9wf4kby9R9Owe92dHkMNf9VVuNwaOCFdgPGAvJs95cfAS8y3u6olFfDkNYn6j 6m6mGyHAR3fNlQ1K/C8wttXUCdDNAS4xMUUmjhHJrJwmhaZhvzSQ7o1l3ndwtpHRcl5W RObQ==
Hi,
I know what's the problem. I am just looking either to document it or
for a solution.
Why would:
template <typename dt> dt sum()
break API/ABI? You will be able to call either sum() or sum<int32_t>(),
shouldn't you? I will try that and submit a patch.
Having sum<dt>() working, one can hopefully create mean<dt_sum,
dt_mean>(), so one can code:
mean<int32_t,double>()
Petr
On Tue, 2019-11-05 at 16:36 +0100, Christoph Hertzberg wrote:
> On 05/11/2019 16.11, Peter wrote:
> > [...]
> >
> > actually, this would also be interesting for the scalar products
> > in
> > general, namely a different
> > type for accumulating the sums within a scalar product, e.g. as
> > yet
> > another template parameter for the matrices.
>
> Adding another template parameter to basic types is not an option.
> This
> would break ABI and API compatibility (even if the parameter has a
> default).
>
> You could create your own custom type `my_int16` for which `my_int16
> *
> my_int16` results in a `my_int32` (this needs to be told to Eigen,
> similar to how real*complex products are handled).
>
> > > [...]
> >
> > I think it's more subtle than that.
> > Even
> >
> > int16_t Two = 2;
> > int16_t Max = INT16_MAX;
> > int16_t mean = ( Max/2 + Max + Two + Two ) / int16_t(4);
> >
> > doesn't produce an overflow.
>
> Yes, because `Max/2` gets implicitly converted to `int`. Actually,
> even
> adding two `int16_t` get implicitly converted to `int` (search for
> integer promotion rules -- I don't know them entirely either). And
> dividing an `int` by an `int16_t` results in an `int` which is only
> afterwards converted to `int16_t`.
>
> In contrast, Eigen::DenseBase::sum() does something (more or less)
> equivalent to:
>
> T sum = T(0);
> for(Index i=0; i< size(); ++i)
> sum+=coeff(i);
> return sum;
>
> i.e., after each addition the result gets reduced to the scalar type
> of
> the matrix, thus it will immediately overflow.
>
> And mean() essentially just takes the return value of `sum()` and
> divides it by the size.
>
>
> Christoph
>
>