Re: [eigen] Custom expression type API stability |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
On Thursday, February 18, 2016 11:04:11 AM Benoit Steiner wrote:
> On Thu, Feb 18, 2016 at 4:46 AM, Dan Čermák <dan.cermak@xxxxxxxxxxxxxxxxxxx>
> wrote:
> > I need basically two different expressions:
> >
> > 1. given two vectors:
> > cond_vec and choice_vec -> result(i) = choice_vec(i) if
> >
> > cond_vec(i) > 0
> >
> > else choice_vec(i+1)
> > this is rather simple and maybe doable otherwise (and I have already
> > managed
> > that using the 3.3 development version, although it's probably ugly)
> >
> > 2. calculate reductions of 3d matrices times 2d matrices (they are not
> > stored
> > fully, since they can be calculated fairly easily from e.g. a matrix and a
> > vector, or are highly sparse): result(i) = Sum_j,k M_ijk * K_jk (as a full
> > reduction) or result(i,j) = Sum_k M_ikj * K_kj
> > I would like to create some abstraction where I only need to provide a
> > function which calculates the elements or row/col of the contraction
> > result.
>
> You can use a tensor contraction code to do this:
> Tensor<float, 3> M(m_dimensions)
> Tensor<float, 3> K(k_dimensions);
>
> For the first case
> Eigen::array<Eigen::IndexPair<Eigen::DenseIndex>, 2> indices;
> indices[0]= Eigen::IndexPair(1, 0);
> indices[1]= Eigen::IndexPair(2, 1);
> Tensor<float, 1> result = M.contract(K, indices);
>
> For the second case
> Eigen::array<Eigen::IndexPair<Eigen::DenseIndex>, 1> indices;
> indices[0]= Eigen::IndexPair(1, 0);
> Tensor<float, 2> result = M.contract(K, indices);
I wasn't aware of the tensor module, but I am afraid I cannot really use this,
since my tensors are expected to have a dimension of up to 1000 while being
either redundant or highly sparse or cheaply to calculate. But I might end up
using these for unit tests where problem sizes are drastically reduced, so
thanks for pointing that out!