mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-04 18:54:00 +08:00
Merged eigen/eigen into default
This commit is contained in:
commit
131027ee0a
@ -293,7 +293,8 @@ struct inplace_transpose_selector<MatrixType,false> { // non square matrix
|
|||||||
* Notice however that this method is only useful if you want to replace a matrix by its own transpose.
|
* Notice however that this method is only useful if you want to replace a matrix by its own transpose.
|
||||||
* If you just need the transpose of a matrix, use transpose().
|
* If you just need the transpose of a matrix, use transpose().
|
||||||
*
|
*
|
||||||
* \note if the matrix is not square, then \c *this must be a resizable matrix.
|
* \note if the matrix is not square, then \c *this must be a resizable matrix.
|
||||||
|
* This excludes (non-square) fixed-size matrices, block-expressions and maps.
|
||||||
*
|
*
|
||||||
* \sa transpose(), adjoint(), adjointInPlace() */
|
* \sa transpose(), adjoint(), adjointInPlace() */
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
@ -324,6 +325,7 @@ inline void DenseBase<Derived>::transposeInPlace()
|
|||||||
* If you just need the adjoint of a matrix, use adjoint().
|
* If you just need the adjoint of a matrix, use adjoint().
|
||||||
*
|
*
|
||||||
* \note if the matrix is not square, then \c *this must be a resizable matrix.
|
* \note if the matrix is not square, then \c *this must be a resizable matrix.
|
||||||
|
* This excludes (non-square) fixed-size matrices, block-expressions and maps.
|
||||||
*
|
*
|
||||||
* \sa transpose(), adjoint(), transposeInPlace() */
|
* \sa transpose(), adjoint(), transposeInPlace() */
|
||||||
template<typename Derived>
|
template<typename Derived>
|
||||||
|
@ -1128,6 +1128,8 @@ EIGEN_DONT_INLINE void gemm_pack_lhs<Scalar, Index, Pack1, Pack2, StorageOrder,
|
|||||||
enum { PacketSize = packet_traits<Scalar>::size };
|
enum { PacketSize = packet_traits<Scalar>::size };
|
||||||
|
|
||||||
EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK LHS");
|
EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK LHS");
|
||||||
|
EIGEN_UNUSED_VARIABLE(stride);
|
||||||
|
EIGEN_UNUSED_VARIABLE(offset);
|
||||||
eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
|
eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
|
||||||
eigen_assert( (StorageOrder==RowMajor) || ((Pack1%PacketSize)==0 && Pack1<=4*PacketSize) );
|
eigen_assert( (StorageOrder==RowMajor) || ((Pack1%PacketSize)==0 && Pack1<=4*PacketSize) );
|
||||||
conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
|
conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
|
||||||
@ -1215,6 +1217,8 @@ EIGEN_DONT_INLINE void gemm_pack_rhs<Scalar, Index, nr, ColMajor, Conjugate, Pan
|
|||||||
::operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride, Index offset)
|
::operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride, Index offset)
|
||||||
{
|
{
|
||||||
EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK RHS COLMAJOR");
|
EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK RHS COLMAJOR");
|
||||||
|
EIGEN_UNUSED_VARIABLE(stride);
|
||||||
|
EIGEN_UNUSED_VARIABLE(offset);
|
||||||
eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
|
eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
|
||||||
conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
|
conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
|
||||||
Index packet_cols = (cols/nr) * nr;
|
Index packet_cols = (cols/nr) * nr;
|
||||||
@ -1266,6 +1270,8 @@ EIGEN_DONT_INLINE void gemm_pack_rhs<Scalar, Index, nr, RowMajor, Conjugate, Pan
|
|||||||
::operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride, Index offset)
|
::operator()(Scalar* blockB, const Scalar* rhs, Index rhsStride, Index depth, Index cols, Index stride, Index offset)
|
||||||
{
|
{
|
||||||
EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK RHS ROWMAJOR");
|
EIGEN_ASM_COMMENT("EIGEN PRODUCT PACK RHS ROWMAJOR");
|
||||||
|
EIGEN_UNUSED_VARIABLE(stride);
|
||||||
|
EIGEN_UNUSED_VARIABLE(offset);
|
||||||
eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
|
eigen_assert(((!PanelMode) && stride==0 && offset==0) || (PanelMode && stride>=depth && offset<=stride));
|
||||||
conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
|
conj_if<NumTraits<Scalar>::IsComplex && Conjugate> cj;
|
||||||
Index packet_cols = (cols/nr) * nr;
|
Index packet_cols = (cols/nr) * nr;
|
||||||
|
@ -80,11 +80,8 @@ EIGEN_DONT_INLINE static void run(
|
|||||||
Index rows, Index cols,
|
Index rows, Index cols,
|
||||||
const LhsScalar* lhs, Index lhsStride,
|
const LhsScalar* lhs, Index lhsStride,
|
||||||
const RhsScalar* rhs, Index rhsIncr,
|
const RhsScalar* rhs, Index rhsIncr,
|
||||||
ResScalar* res, Index
|
ResScalar* res, Index resIncr,
|
||||||
#ifdef EIGEN_INTERNAL_DEBUGGING
|
RhsScalar alpha);
|
||||||
resIncr
|
|
||||||
#endif
|
|
||||||
, RhsScalar alpha);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>
|
template<typename Index, typename LhsScalar, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs, int Version>
|
||||||
@ -92,12 +89,10 @@ EIGEN_DONT_INLINE void general_matrix_vector_product<Index,LhsScalar,ColMajor,Co
|
|||||||
Index rows, Index cols,
|
Index rows, Index cols,
|
||||||
const LhsScalar* lhs, Index lhsStride,
|
const LhsScalar* lhs, Index lhsStride,
|
||||||
const RhsScalar* rhs, Index rhsIncr,
|
const RhsScalar* rhs, Index rhsIncr,
|
||||||
ResScalar* res, Index
|
ResScalar* res, Index resIncr,
|
||||||
#ifdef EIGEN_INTERNAL_DEBUGGING
|
RhsScalar alpha)
|
||||||
resIncr
|
|
||||||
#endif
|
|
||||||
, RhsScalar alpha)
|
|
||||||
{
|
{
|
||||||
|
EIGEN_UNUSED_VARIABLE(resIncr);
|
||||||
eigen_internal_assert(resIncr==1);
|
eigen_internal_assert(resIncr==1);
|
||||||
#ifdef _EIGEN_ACCUMULATE_PACKETS
|
#ifdef _EIGEN_ACCUMULATE_PACKETS
|
||||||
#error _EIGEN_ACCUMULATE_PACKETS has already been defined
|
#error _EIGEN_ACCUMULATE_PACKETS has already been defined
|
||||||
@ -351,7 +346,7 @@ EIGEN_DONT_INLINE static void run(
|
|||||||
Index rows, Index cols,
|
Index rows, Index cols,
|
||||||
const LhsScalar* lhs, Index lhsStride,
|
const LhsScalar* lhs, Index lhsStride,
|
||||||
const RhsScalar* rhs, Index rhsIncr,
|
const RhsScalar* rhs, Index rhsIncr,
|
||||||
ResScalar* res, Index resIncr,
|
ResScalar* res, Index resIncr,
|
||||||
ResScalar alpha);
|
ResScalar alpha);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -365,6 +360,7 @@ EIGEN_DONT_INLINE void general_matrix_vector_product<Index,LhsScalar,RowMajor,Co
|
|||||||
{
|
{
|
||||||
EIGEN_UNUSED_VARIABLE(rhsIncr);
|
EIGEN_UNUSED_VARIABLE(rhsIncr);
|
||||||
eigen_internal_assert(rhsIncr==1);
|
eigen_internal_assert(rhsIncr==1);
|
||||||
|
|
||||||
#ifdef _EIGEN_ACCUMULATE_PACKETS
|
#ifdef _EIGEN_ACCUMULATE_PACKETS
|
||||||
#error _EIGEN_ACCUMULATE_PACKETS has already been defined
|
#error _EIGEN_ACCUMULATE_PACKETS has already been defined
|
||||||
#endif
|
#endif
|
||||||
|
@ -261,7 +261,12 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Suppresses 'unused variable' warnings.
|
// Suppresses 'unused variable' warnings.
|
||||||
#define EIGEN_UNUSED_VARIABLE(var) (void)var;
|
namespace Eigen {
|
||||||
|
namespace internal {
|
||||||
|
template<typename T> void ignore_unused_variable(const T&) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#define EIGEN_UNUSED_VARIABLE(var) Eigen::internal::ignore_unused_variable(var);
|
||||||
|
|
||||||
#if !defined(EIGEN_ASM_COMMENT)
|
#if !defined(EIGEN_ASM_COMMENT)
|
||||||
#if (defined __GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
|
#if (defined __GNUC__) && ( defined(__i386__) || defined(__x86_64__) )
|
||||||
|
@ -223,7 +223,7 @@ class SparseMatrix
|
|||||||
|
|
||||||
if(isCompressed())
|
if(isCompressed())
|
||||||
{
|
{
|
||||||
reserve(VectorXi::Constant(outerSize(), 2));
|
reserve(Matrix<Index,Dynamic,1>::Constant(outerSize(), 2));
|
||||||
}
|
}
|
||||||
return insertUncompressed(row,col);
|
return insertUncompressed(row,col);
|
||||||
}
|
}
|
||||||
@ -939,12 +939,13 @@ void set_from_triplets(const InputIterator& begin, const InputIterator& end, Spa
|
|||||||
EIGEN_UNUSED_VARIABLE(Options);
|
EIGEN_UNUSED_VARIABLE(Options);
|
||||||
enum { IsRowMajor = SparseMatrixType::IsRowMajor };
|
enum { IsRowMajor = SparseMatrixType::IsRowMajor };
|
||||||
typedef typename SparseMatrixType::Scalar Scalar;
|
typedef typename SparseMatrixType::Scalar Scalar;
|
||||||
|
typedef typename SparseMatrixType::Index Index;
|
||||||
SparseMatrix<Scalar,IsRowMajor?ColMajor:RowMajor> trMat(mat.rows(),mat.cols());
|
SparseMatrix<Scalar,IsRowMajor?ColMajor:RowMajor> trMat(mat.rows(),mat.cols());
|
||||||
|
|
||||||
if(begin!=end)
|
if(begin!=end)
|
||||||
{
|
{
|
||||||
// pass 1: count the nnz per inner-vector
|
// pass 1: count the nnz per inner-vector
|
||||||
VectorXi wi(trMat.outerSize());
|
Matrix<Index,Dynamic,1> wi(trMat.outerSize());
|
||||||
wi.setZero();
|
wi.setZero();
|
||||||
for(InputIterator it(begin); it!=end; ++it)
|
for(InputIterator it(begin); it!=end; ++it)
|
||||||
{
|
{
|
||||||
@ -1018,7 +1019,7 @@ void SparseMatrix<Scalar,_Options,_Index>::sumupDuplicates()
|
|||||||
{
|
{
|
||||||
eigen_assert(!isCompressed());
|
eigen_assert(!isCompressed());
|
||||||
// TODO, in practice we should be able to use m_innerNonZeros for that task
|
// TODO, in practice we should be able to use m_innerNonZeros for that task
|
||||||
VectorXi wi(innerSize());
|
Matrix<Index,Dynamic,1> wi(innerSize());
|
||||||
wi.fill(-1);
|
wi.fill(-1);
|
||||||
Index count = 0;
|
Index count = 0;
|
||||||
// for each inner-vector, wi[inner_index] will hold the position of first element into the index/value buffers
|
// for each inner-vector, wi[inner_index] will hold the position of first element into the index/value buffers
|
||||||
@ -1081,7 +1082,7 @@ EIGEN_DONT_INLINE SparseMatrix<Scalar,_Options,_Index>& SparseMatrix<Scalar,_Opt
|
|||||||
|
|
||||||
// prefix sum
|
// prefix sum
|
||||||
Index count = 0;
|
Index count = 0;
|
||||||
VectorXi positions(dest.outerSize());
|
Matrix<Index,Dynamic,1> positions(dest.outerSize());
|
||||||
for (Index j=0; j<dest.outerSize(); ++j)
|
for (Index j=0; j<dest.outerSize(); ++j)
|
||||||
{
|
{
|
||||||
Index tmp = dest.m_outerIndex[j];
|
Index tmp = dest.m_outerIndex[j];
|
||||||
|
@ -57,7 +57,7 @@ struct permut_sparsematrix_product_retval
|
|||||||
if(MoveOuter)
|
if(MoveOuter)
|
||||||
{
|
{
|
||||||
SparseMatrix<Scalar,SrcStorageOrder,Index> tmp(m_matrix.rows(), m_matrix.cols());
|
SparseMatrix<Scalar,SrcStorageOrder,Index> tmp(m_matrix.rows(), m_matrix.cols());
|
||||||
VectorXi sizes(m_matrix.outerSize());
|
Matrix<Index,Dynamic,1> sizes(m_matrix.outerSize());
|
||||||
for(Index j=0; j<m_matrix.outerSize(); ++j)
|
for(Index j=0; j<m_matrix.outerSize(); ++j)
|
||||||
{
|
{
|
||||||
Index jp = m_permutation.indices().coeff(j);
|
Index jp = m_permutation.indices().coeff(j);
|
||||||
@ -77,7 +77,7 @@ struct permut_sparsematrix_product_retval
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> tmp(m_matrix.rows(), m_matrix.cols());
|
SparseMatrix<Scalar,int(SrcStorageOrder)==RowMajor?ColMajor:RowMajor,Index> tmp(m_matrix.rows(), m_matrix.cols());
|
||||||
VectorXi sizes(tmp.outerSize());
|
Matrix<Index,Dynamic,1> sizes(tmp.outerSize());
|
||||||
sizes.setZero();
|
sizes.setZero();
|
||||||
PermutationMatrix<Dynamic,Dynamic,Index> perm;
|
PermutationMatrix<Dynamic,Dynamic,Index> perm;
|
||||||
if((Side==OnTheLeft) ^ Transposed)
|
if((Side==OnTheLeft) ^ Transposed)
|
||||||
|
@ -173,21 +173,14 @@ template<typename ArrayType> void array_real(const ArrayType& m)
|
|||||||
Scalar s1 = internal::random<Scalar>();
|
Scalar s1 = internal::random<Scalar>();
|
||||||
|
|
||||||
// these tests are mostly to check possible compilation issues.
|
// these tests are mostly to check possible compilation issues.
|
||||||
// VERIFY_IS_APPROX(m1.sin(), std::sin(m1));
|
|
||||||
VERIFY_IS_APPROX(m1.sin(), sin(m1));
|
VERIFY_IS_APPROX(m1.sin(), sin(m1));
|
||||||
// VERIFY_IS_APPROX(m1.cos(), std::cos(m1));
|
|
||||||
VERIFY_IS_APPROX(m1.cos(), cos(m1));
|
VERIFY_IS_APPROX(m1.cos(), cos(m1));
|
||||||
// VERIFY_IS_APPROX(m1.asin(), std::asin(m1));
|
|
||||||
VERIFY_IS_APPROX(m1.asin(), asin(m1));
|
VERIFY_IS_APPROX(m1.asin(), asin(m1));
|
||||||
// VERIFY_IS_APPROX(m1.acos(), std::acos(m1));
|
|
||||||
VERIFY_IS_APPROX(m1.acos(), acos(m1));
|
VERIFY_IS_APPROX(m1.acos(), acos(m1));
|
||||||
// VERIFY_IS_APPROX(m1.tan(), std::tan(m1));
|
|
||||||
VERIFY_IS_APPROX(m1.tan(), tan(m1));
|
VERIFY_IS_APPROX(m1.tan(), tan(m1));
|
||||||
|
|
||||||
VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval()));
|
VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval()));
|
||||||
// VERIFY_IS_APPROX(std::cos(m1+RealScalar(3)*m2), std::cos((m1+RealScalar(3)*m2).eval()));
|
|
||||||
|
|
||||||
// VERIFY_IS_APPROX(m1.abs().sqrt(), std::sqrt(std::abs(m1)));
|
|
||||||
VERIFY_IS_APPROX(m1.abs().sqrt(), sqrt(abs(m1)));
|
VERIFY_IS_APPROX(m1.abs().sqrt(), sqrt(abs(m1)));
|
||||||
VERIFY_IS_APPROX(m1.abs(), sqrt(numext::abs2(m1)));
|
VERIFY_IS_APPROX(m1.abs(), sqrt(numext::abs2(m1)));
|
||||||
|
|
||||||
@ -196,9 +189,10 @@ template<typename ArrayType> void array_real(const ArrayType& m)
|
|||||||
if(!NumTraits<Scalar>::IsComplex)
|
if(!NumTraits<Scalar>::IsComplex)
|
||||||
VERIFY_IS_APPROX(numext::real(m1), m1);
|
VERIFY_IS_APPROX(numext::real(m1), m1);
|
||||||
|
|
||||||
VERIFY_IS_APPROX(m1.abs().log() , log(abs(m1)));
|
// shift argument of logarithm so that it is not zero
|
||||||
|
Scalar smallNumber = NumTraits<Scalar>::dummy_precision();
|
||||||
|
VERIFY_IS_APPROX((m1.abs() + smallNumber).log() , log(abs(m1) + smallNumber));
|
||||||
|
|
||||||
// VERIFY_IS_APPROX(m1.exp(), std::exp(m1));
|
|
||||||
VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2));
|
VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2));
|
||||||
VERIFY_IS_APPROX(m1.exp(), exp(m1));
|
VERIFY_IS_APPROX(m1.exp(), exp(m1));
|
||||||
VERIFY_IS_APPROX(m1.exp() / m2.exp(),(m1-m2).exp());
|
VERIFY_IS_APPROX(m1.exp() / m2.exp(),(m1-m2).exp());
|
||||||
@ -242,7 +236,6 @@ template<typename ArrayType> void array_complex(const ArrayType& m)
|
|||||||
m2(i,j) = sqrt(m1(i,j));
|
m2(i,j) = sqrt(m1(i,j));
|
||||||
|
|
||||||
VERIFY_IS_APPROX(m1.sqrt(), m2);
|
VERIFY_IS_APPROX(m1.sqrt(), m2);
|
||||||
// VERIFY_IS_APPROX(m1.sqrt(), std::sqrt(m1));
|
|
||||||
VERIFY_IS_APPROX(m1.sqrt(), Eigen::sqrt(m1));
|
VERIFY_IS_APPROX(m1.sqrt(), Eigen::sqrt(m1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user