Re: [eigen] Custom expression type API stability

[ Thread Index | Date Index | More Archives ]

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);

Mail converted by MHonArc 2.6.19+