Re: [eigen] Forcing a conversion to ColMajor |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] Forcing a conversion to ColMajor
- From: Gael Guennebaud <gael.guennebaud@xxxxxxxxx>
- Date: Mon, 30 Jul 2012 10:00:30 +0200
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type; bh=ZH0wQpuSnXE7H4X4mVz+74CkZxoeKdMgC/guGAmF/0Y=; b=zqX7UOBoLYQ9wWD1UUEpyPWW3/G2hwTm6u/+JtW6d3DUIuUCYwwot/pAUONnU4j6EA ACPsoibWr/UA3VfFM04YXhq+IS7qLgyoE0Ahi9SOmrDc+yqzfdLVgE5NR3T4ZplIOldP K4vRQSg7cLUCJR/hbLwN8p//qmbcvniPYRE6Yf/V7RNykUElRDvUnS9PNUBqqOS/8jqE P8lftvarRdfcAMrp46ifjT5nvlbESHvh9aS6k/9nfBP6h8WPwu5tvUDOgVl+bFN5LcFr b8vMvLaTqZ+gNRU4cClW4OZQLXs/BX+3VpmfIom9SphOSAHS90ylZRY1lnrEOXedOJYW LWOA==
hi,
I think you can simply drop the explicit ColMajor:
typename Eigen::internal::conditional<T::IsRowMajor,
Eigen::Matrix<typename T::Scalar,
T::RowsAtCompileTime,T::ColsAtCompileTime>,
const T&>::type objCopy(obj);
gael
On Sat, Jul 28, 2012 at 8:12 PM, Douglas Bates <bates@xxxxxxxxxxxxx> wrote:
> On Sat, Jul 28, 2012 at 12:40 PM, Douglas Bates <bates@xxxxxxxxxxxxx> wrote:
>> On Sat, Jul 28, 2012 at 12:11 PM, Douglas Bates <bates@xxxxxxxxxxxxx> wrote:
>>> On Sat, Jul 28, 2012 at 2:52 AM, Gael Guennebaud
>>> <gael.guennebaud@xxxxxxxxx> wrote:
>>>> Hi,
>>>>
>>>> you could do something like:
>>>>
>>>> typename Eigen::internal::conditional<T::IsRowMajor,
>>>> Eigen::Matrix<typename T::Scalar,
>>>> T::RowsAtCompileTime,T::ColsAtCompileTime,ColMajor>,
>>>> const T&>::type objCopy(obj);
>>>>
>>>> and then use objCopy instead. If T is column major, then objCopy will
>>>> just be an alias (const ref).
>>>
>>> Thanks for the suggestion. That version fails with an
>>> INVALID_MATRIX_TEMPLATE_PARAMETERS error when trying to do the objCopy
>>> on a row-major object.
>>>
>>> ./include/Eigen/src/Core/Matrix.h:280:13: note: in instantiation of
>>> member function
>>> 'Eigen::PlainObjectBase<Eigen::Matrix<std::complex<double>, 1, -1, 0,
>>> 1, -1> >::_check_template_params' requested here
>>> Base::_check_template_params();
>>> ^
>>> ./include/RcppEigenWrap.h:89:31: note: in instantiation of function
>>> template specialization 'Eigen::Matrix<std::complex<double>, 1, -1, 0,
>>> 1, -1>::Matrix<Eigen::Matrix<std::complex<double>, 1, -1, 1, 1, -1> >'
>>> requested here
>>> const T&>::type objCopy(obj);
>>>
>>> I think this is triggered by an object of the form
>>>
>>> Eigen::RowVectorXcd::Zero(5)
>>>
>>> and my guess is that the condition failing is
>>>
>>> EIGEN_IMPLIES(MaxRowsAtCompileTime==1 && MaxColsAtCompileTime!=1,
>>> (Options&RowMajor)==RowMajor)
>>
>> Probably I should just trap the case of MaxRowsAtCompileTime == 1
>> because there really is no difference between row-major and
>> column-major in terms of the object returned to R.
>
> The last part of that sentence was for the case of
> MaxRowsAtCompileTime == 1. Of course I have since found out that I
> need to catch that case at compile time, not run time, for which I
> will need to do more template metaprogramming than I have done in the
> past.
>
>