mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-20 00:29:38 +08:00
* move cwise *= and /= to Core (like * and /)
* tidy the StdVector module * fix warnings (especially a | instead of ||) in stdvector test
This commit is contained in:
parent
af5034b3c0
commit
336ad58213
@ -1,28 +1,3 @@
|
|||||||
// This file is part of Eigen, a lightweight C++ template library
|
|
||||||
// for linear algebra. Eigen itself is part of the KDE project.
|
|
||||||
//
|
|
||||||
// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
|
|
||||||
// Copyright (C) 2009 Alex Stapleton <alex.stapleton@gmail.com>
|
|
||||||
//
|
|
||||||
// Eigen is free software; you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU Lesser General Public
|
|
||||||
// License as published by the Free Software Foundation; either
|
|
||||||
// version 3 of the License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// Alternatively, you can redistribute it and/or
|
|
||||||
// modify it under the terms of the GNU General Public License as
|
|
||||||
// published by the Free Software Foundation; either version 2 of
|
|
||||||
// the License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
||||||
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
||||||
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Lesser General Public
|
|
||||||
// License and a copy of the GNU General Public License along with
|
|
||||||
// Eigen. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#ifndef EIGEN_STDVECTOR_MODULE_H
|
#ifndef EIGEN_STDVECTOR_MODULE_H
|
||||||
#define EIGEN_STDVECTOR_MODULE_H
|
#define EIGEN_STDVECTOR_MODULE_H
|
||||||
|
|
||||||
@ -30,47 +5,11 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
template<typename aligned_type> class ei_unaligned_type;
|
#include "src/StdVector/UnalignedType.h"
|
||||||
|
|
||||||
template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
|
|
||||||
class ei_unaligned_type<Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> >
|
|
||||||
: public Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> aligned_base;
|
|
||||||
ei_unaligned_type() : aligned_base(ei_constructor_without_unaligned_array_assert()) {}
|
|
||||||
ei_unaligned_type(const aligned_base& other)
|
|
||||||
{
|
|
||||||
resize(other.rows(), other.cols());
|
|
||||||
ei_assign_impl<ei_unaligned_type,aligned_base,NoVectorization>::run(*this, other);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // namespace Eigen
|
} // namespace Eigen
|
||||||
|
|
||||||
namespace std {
|
namespace std {
|
||||||
|
#include "src/StdVector/StdVector.h"
|
||||||
template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols, typename _Alloc>
|
|
||||||
class vector<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols>, _Alloc>
|
|
||||||
: public vector<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> >,
|
|
||||||
Eigen::aligned_allocator<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > > >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > value_type;
|
|
||||||
typedef Eigen::aligned_allocator<value_type> allocator_type;
|
|
||||||
typedef vector<value_type, allocator_type > unaligned_base;
|
|
||||||
typedef typename unaligned_base::size_type size_type;
|
|
||||||
typedef typename unaligned_base::iterator iterator;
|
|
||||||
|
|
||||||
explicit vector(const allocator_type& __a = allocator_type()) : unaligned_base(__a) {}
|
|
||||||
vector(const vector& c) : unaligned_base(c) {}
|
|
||||||
vector(size_type num, const value_type& val = value_type()) : unaligned_base(num, val) {}
|
|
||||||
vector(iterator start, iterator end) : unaligned_base(start, end) {}
|
|
||||||
vector& operator=(const vector& __x) {
|
|
||||||
unaligned_base::operator=(__x);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
|
||||||
#endif // EIGEN_STDVECTOR_MODULE_H
|
#endif // EIGEN_STDVECTOR_MODULE_H
|
||||||
|
@ -418,43 +418,6 @@ inline ExpressionType& Cwise<ExpressionType>::operator+=(const Scalar& scalar)
|
|||||||
return m_matrix.const_cast_derived() = *this + scalar;
|
return m_matrix.const_cast_derived() = *this + scalar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//=============
|
|
||||||
|
|
||||||
/** \array_module
|
|
||||||
*
|
|
||||||
* Replaces this expression by its coefficient-wise product with \a other.
|
|
||||||
*
|
|
||||||
* Example: \include Cwise_times_equal.cpp
|
|
||||||
* Output: \verbinclude Cwise_times_equal.out
|
|
||||||
*
|
|
||||||
* \sa operator*(), operator/=()
|
|
||||||
*/
|
|
||||||
template<typename ExpressionType>
|
|
||||||
template<typename OtherDerived>
|
|
||||||
inline ExpressionType& Cwise<ExpressionType>::operator*=(const MatrixBase<OtherDerived> &other)
|
|
||||||
{
|
|
||||||
return m_matrix.const_cast_derived() = *this * other;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \array_module
|
|
||||||
*
|
|
||||||
* Replaces this expression by its coefficient-wise quotient with \a other.
|
|
||||||
*
|
|
||||||
* Example: \include Cwise_slash_equal.cpp
|
|
||||||
* Output: \verbinclude Cwise_slash_equal.out
|
|
||||||
*
|
|
||||||
* \sa operator/(), operator*=()
|
|
||||||
*/
|
|
||||||
template<typename ExpressionType>
|
|
||||||
template<typename OtherDerived>
|
|
||||||
inline ExpressionType& Cwise<ExpressionType>::operator/=(const MatrixBase<OtherDerived> &other)
|
|
||||||
{
|
|
||||||
return m_matrix.const_cast_derived() = *this / other;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=============
|
|
||||||
|
|
||||||
/** \array_module
|
/** \array_module
|
||||||
*
|
*
|
||||||
* \returns an expression of \c *this with each coeff decremented by the constant \a scalar
|
* \returns an expression of \c *this with each coeff decremented by the constant \a scalar
|
||||||
|
@ -224,6 +224,34 @@ Cwise<ExpressionType>::operator/(const MatrixBase<OtherDerived> &other) const
|
|||||||
return EIGEN_CWISE_BINOP_RETURN_TYPE(ei_scalar_quotient_op)(_expression(), other.derived());
|
return EIGEN_CWISE_BINOP_RETURN_TYPE(ei_scalar_quotient_op)(_expression(), other.derived());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Replaces this expression by its coefficient-wise product with \a other.
|
||||||
|
*
|
||||||
|
* Example: \include Cwise_times_equal.cpp
|
||||||
|
* Output: \verbinclude Cwise_times_equal.out
|
||||||
|
*
|
||||||
|
* \sa operator*(), operator/=()
|
||||||
|
*/
|
||||||
|
template<typename ExpressionType>
|
||||||
|
template<typename OtherDerived>
|
||||||
|
inline ExpressionType& Cwise<ExpressionType>::operator*=(const MatrixBase<OtherDerived> &other)
|
||||||
|
{
|
||||||
|
return m_matrix.const_cast_derived() = *this * other;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Replaces this expression by its coefficient-wise quotient by \a other.
|
||||||
|
*
|
||||||
|
* Example: \include Cwise_slash_equal.cpp
|
||||||
|
* Output: \verbinclude Cwise_slash_equal.out
|
||||||
|
*
|
||||||
|
* \sa operator/(), operator*=()
|
||||||
|
*/
|
||||||
|
template<typename ExpressionType>
|
||||||
|
template<typename OtherDerived>
|
||||||
|
inline ExpressionType& Cwise<ExpressionType>::operator/=(const MatrixBase<OtherDerived> &other)
|
||||||
|
{
|
||||||
|
return m_matrix.const_cast_derived() = *this / other;
|
||||||
|
}
|
||||||
|
|
||||||
/** \returns an expression of the coefficient-wise min of *this and \a other
|
/** \returns an expression of the coefficient-wise min of *this and \a other
|
||||||
*
|
*
|
||||||
* Example: \include Cwise_min.cpp
|
* Example: \include Cwise_min.cpp
|
||||||
|
51
Eigen/src/StdVector/StdVector.h
Normal file
51
Eigen/src/StdVector/StdVector.h
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
// This file is part of Eigen, a lightweight C++ template library
|
||||||
|
// for linear algebra. Eigen itself is part of the KDE project.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
|
||||||
|
// Copyright (C) 2009 Alex Stapleton <alex.stapleton@gmail.com>
|
||||||
|
//
|
||||||
|
// Eigen is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 3 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Alternatively, you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 2 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License and a copy of the GNU General Public License along with
|
||||||
|
// Eigen. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef EIGEN_STDVECTOR_H
|
||||||
|
#define EIGEN_STDVECTOR_H
|
||||||
|
|
||||||
|
template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols, typename _Alloc>
|
||||||
|
class vector<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols>, _Alloc>
|
||||||
|
: public vector<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> >,
|
||||||
|
Eigen::aligned_allocator<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > > >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > value_type;
|
||||||
|
typedef Eigen::aligned_allocator<value_type> allocator_type;
|
||||||
|
typedef vector<value_type, allocator_type > unaligned_base;
|
||||||
|
typedef typename unaligned_base::size_type size_type;
|
||||||
|
typedef typename unaligned_base::iterator iterator;
|
||||||
|
|
||||||
|
explicit vector(const allocator_type& __a = allocator_type()) : unaligned_base(__a) {}
|
||||||
|
vector(const vector& c) : unaligned_base(c) {}
|
||||||
|
vector(size_type num, const value_type& val = value_type()) : unaligned_base(num, val) {}
|
||||||
|
vector(iterator start, iterator end) : unaligned_base(start, end) {}
|
||||||
|
vector& operator=(const vector& __x) {
|
||||||
|
unaligned_base::operator=(__x);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // EIGEN_STDVECTOR_H
|
45
Eigen/src/StdVector/UnalignedType.h
Normal file
45
Eigen/src/StdVector/UnalignedType.h
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// This file is part of Eigen, a lightweight C++ template library
|
||||||
|
// for linear algebra. Eigen itself is part of the KDE project.
|
||||||
|
//
|
||||||
|
// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
|
||||||
|
// Copyright (C) 2009 Alex Stapleton <alex.stapleton@gmail.com>
|
||||||
|
//
|
||||||
|
// Eigen is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU Lesser General Public
|
||||||
|
// License as published by the Free Software Foundation; either
|
||||||
|
// version 3 of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Alternatively, you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License as
|
||||||
|
// published by the Free Software Foundation; either version 2 of
|
||||||
|
// the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
||||||
|
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Lesser General Public
|
||||||
|
// License and a copy of the GNU General Public License along with
|
||||||
|
// Eigen. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef EIGEN_UNALIGNEDTYPE_H
|
||||||
|
#define EIGEN_UNALIGNEDTYPE_H
|
||||||
|
|
||||||
|
template<typename aligned_type> class ei_unaligned_type;
|
||||||
|
|
||||||
|
template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
|
||||||
|
class ei_unaligned_type<Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> >
|
||||||
|
: public Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> aligned_base;
|
||||||
|
ei_unaligned_type() : aligned_base(ei_constructor_without_unaligned_array_assert()) {}
|
||||||
|
ei_unaligned_type(const aligned_base& other)
|
||||||
|
{
|
||||||
|
resize(other.rows(), other.cols());
|
||||||
|
ei_assign_impl<ei_unaligned_type,aligned_base,NoVectorization>::run(*this, other);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // EIGEN_UNALIGNEDTYPE_H
|
@ -53,9 +53,9 @@ void check_stdvector(const MatrixType& m)
|
|||||||
// do a lot of push_back such that the vector gets internally resized
|
// do a lot of push_back such that the vector gets internally resized
|
||||||
// (with memory reallocation)
|
// (with memory reallocation)
|
||||||
MatrixType* ref = &w[0];
|
MatrixType* ref = &w[0];
|
||||||
for(int i=0; i<30 | ((ref==&w[0]) && i<300); ++i)
|
for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
|
||||||
v.push_back(w[i%w.size()]);
|
v.push_back(w[i%w.size()]);
|
||||||
for(int i=23; i<v.size(); ++i)
|
for(unsigned int i=23; i<v.size(); ++i)
|
||||||
{
|
{
|
||||||
VERIFY(v[i]==w[(i-23)%w.size()]);
|
VERIFY(v[i]==w[(i-23)%w.size()]);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user