mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-06-03 18:24:02 +08:00
-add set...() methods and their documentation; remove Generic
-use row-major traversal when the number of columns is fixed and the number of rows is dynamic -other minor changes
This commit is contained in:
parent
aae0667e1e
commit
e092cbc75c
@ -71,7 +71,7 @@ template<typename NewScalar, typename MatrixType> class Cast : NoOperatorEquals,
|
||||
}
|
||||
|
||||
protected:
|
||||
MatRef m_matrix;
|
||||
const MatRef m_matrix;
|
||||
};
|
||||
|
||||
/** \returns an expression of *this with the \a Scalar type casted to
|
||||
|
@ -64,7 +64,7 @@ template<typename MatrixType> class Conjugate : NoOperatorEquals,
|
||||
}
|
||||
|
||||
protected:
|
||||
MatRef m_matrix;
|
||||
const MatRef m_matrix;
|
||||
};
|
||||
|
||||
/** \returns an expression of the complex conjugate of *this.
|
||||
|
@ -52,7 +52,7 @@ class DiagonalMatrix : NoOperatorEquals,
|
||||
DiagonalMatrix(const CoeffsVecRef& coeffs) : m_coeffs(coeffs)
|
||||
{
|
||||
assert(CoeffsVectorType::Traits::IsVectorAtCompileTime
|
||||
&& coeffs.coeffs() > 0);
|
||||
&& coeffs.size() > 0);
|
||||
}
|
||||
|
||||
private:
|
||||
@ -62,8 +62,8 @@ class DiagonalMatrix : NoOperatorEquals,
|
||||
};
|
||||
|
||||
const DiagonalMatrix& _ref() const { return *this; }
|
||||
int _rows() const { return m_coeffs.coeffs(); }
|
||||
int _cols() const { return m_coeffs.coeffs(); }
|
||||
int _rows() const { return m_coeffs.size(); }
|
||||
int _cols() const { return m_coeffs.size(); }
|
||||
|
||||
Scalar _coeff(int row, int col) const
|
||||
{
|
||||
@ -71,7 +71,7 @@ class DiagonalMatrix : NoOperatorEquals,
|
||||
}
|
||||
|
||||
protected:
|
||||
CoeffsVecRef m_coeffs;
|
||||
const CoeffsVecRef m_coeffs;
|
||||
};
|
||||
|
||||
/** \returns an expression of a diagonal matrix with *this as vector of diagonal coefficients
|
||||
|
@ -74,7 +74,7 @@ Scalar MatrixBase<Scalar, Derived>::dot(const OtherDerived& other) const
|
||||
{
|
||||
assert(Traits::IsVectorAtCompileTime
|
||||
&& OtherDerived::Traits::IsVectorAtCompileTime
|
||||
&& coeffs() == other.coeffs());
|
||||
&& size() == other.size());
|
||||
Scalar res;
|
||||
if(EIGEN_UNROLLED_LOOPS
|
||||
&& Traits::SizeAtCompileTime != Dynamic
|
||||
@ -85,7 +85,7 @@ Scalar MatrixBase<Scalar, Derived>::dot(const OtherDerived& other) const
|
||||
else
|
||||
{
|
||||
res = (*this).coeff(0) * conj(other.coeff(0));
|
||||
for(int i = 1; i < coeffs(); i++)
|
||||
for(int i = 1; i < size(); i++)
|
||||
res += (*this).coeff(i)* conj(other.coeff(i));
|
||||
}
|
||||
return res;
|
||||
|
@ -60,7 +60,7 @@ template<typename MatrixType> class Identity : NoOperatorEquals,
|
||||
}
|
||||
|
||||
protected:
|
||||
int m_rows;
|
||||
const int m_rows;
|
||||
};
|
||||
|
||||
/** \returns an expression of the identity matrix of given type and size.
|
||||
@ -108,5 +108,18 @@ bool MatrixBase<Scalar, Derived>::isIdentity
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Writes the identity expression into *this.
|
||||
*
|
||||
* Example: \include MatrixBase_setIdentity.cpp
|
||||
* Output: \verbinclude MatrixBase_setIdentity.out
|
||||
*
|
||||
* \sa class Identity, identity()
|
||||
*/
|
||||
template<typename Scalar, typename Derived>
|
||||
Derived& MatrixBase<Scalar, Derived>::setIdentity()
|
||||
{
|
||||
return *this = Identity<Derived>(rows());
|
||||
}
|
||||
|
||||
|
||||
#endif // EIGEN_IDENTITY_H
|
||||
|
@ -86,7 +86,7 @@ template<typename MatrixType> class Map
|
||||
|
||||
protected:
|
||||
const Scalar* m_data;
|
||||
int m_rows, m_cols;
|
||||
const int m_rows, m_cols;
|
||||
};
|
||||
|
||||
/** This is the const version of map(Scalar*,int,int). */
|
||||
|
@ -70,7 +70,7 @@
|
||||
* \c Matrix<double,3,5>.
|
||||
*
|
||||
* Note that most of the API is in the base class MatrixBase, and that the base class
|
||||
* MatrixStorage also provides the MatrixStorage::recoeffs() public method.
|
||||
* MatrixStorage also provides the MatrixStorage::resize() public method.
|
||||
*/
|
||||
template<typename _Scalar, int _Rows, int _Cols,
|
||||
int _StorageOrder = EIGEN_DEFAULT_MATRIX_STORAGE_ORDER>
|
||||
@ -135,12 +135,12 @@ class Matrix : public MatrixBase<_Scalar, Matrix<_Scalar, _Rows, _Cols, _Storage
|
||||
if(RowsAtCompileTime == 1)
|
||||
{
|
||||
assert(other.isVector());
|
||||
resize(1, other.coeffs());
|
||||
resize(1, other.size());
|
||||
}
|
||||
else if(ColsAtCompileTime == 1)
|
||||
{
|
||||
assert(other.isVector());
|
||||
resize(other.coeffs(), 1);
|
||||
resize(other.size(), 1);
|
||||
}
|
||||
else resize(other.rows(), other.cols());
|
||||
return Base::operator=(other);
|
||||
|
@ -115,7 +115,7 @@ template<typename Scalar, typename Derived> class MatrixBase
|
||||
int cols() const { return static_cast<const Derived *>(this)->_cols(); }
|
||||
/** \returns the number of coefficients, which is \a rows()*cols().
|
||||
* \sa rows(), cols(), Traits::SizeAtCompileTime. */
|
||||
int coeffs() const { return rows() * cols(); }
|
||||
int size() const { return rows() * cols(); }
|
||||
/** \returns true if either the number of rows or the number of columns is equal to 1.
|
||||
* In other words, this function returns
|
||||
* \code rows()==1 || cols()==1 \endcode
|
||||
@ -189,6 +189,11 @@ template<typename Scalar, typename Derived> class MatrixBase
|
||||
bool isIdentity(RealScalar prec = precision<Scalar>()) const;
|
||||
bool isDiagonal(RealScalar prec = precision<Scalar>()) const;
|
||||
|
||||
Derived& setZero();
|
||||
Derived& setOnes();
|
||||
Derived& setRandom();
|
||||
Derived& setIdentity();
|
||||
|
||||
const DiagonalMatrix<Derived> asDiagonal() const;
|
||||
|
||||
DiagonalCoeffs<Derived> diagonal();
|
||||
|
@ -64,7 +64,7 @@ template<typename MatrixType> class Ones : NoOperatorEquals,
|
||||
}
|
||||
|
||||
protected:
|
||||
int m_rows, m_cols;
|
||||
const int m_rows, m_cols;
|
||||
};
|
||||
|
||||
/** \returns an expression of a matrix where all coefficients equal one.
|
||||
@ -146,4 +146,17 @@ bool MatrixBase<Scalar, Derived>::isOnes
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Sets all coefficients in this expression to one.
|
||||
*
|
||||
* Example: \include MatrixBase_setOnes.cpp
|
||||
* Output: \verbinclude MatrixBase_setOnes.out
|
||||
*
|
||||
* \sa class Ones, ones()
|
||||
*/
|
||||
template<typename Scalar, typename Derived>
|
||||
Derived& MatrixBase<Scalar, Derived>::setOnes()
|
||||
{
|
||||
return *this = Ones<Derived>(rows(), cols());
|
||||
}
|
||||
|
||||
#endif // EIGEN_ONES_H
|
||||
|
@ -106,27 +106,45 @@ Derived& MatrixBase<Scalar, Derived>
|
||||
if(Traits::IsVectorAtCompileTime && OtherDerived::Traits::IsVectorAtCompileTime)
|
||||
// copying a vector expression into a vector
|
||||
{
|
||||
assert(coeffs() == other.coeffs());
|
||||
assert(size() == other.size());
|
||||
if(EIGEN_UNROLLED_LOOPS && Traits::SizeAtCompileTime != Dynamic && Traits::SizeAtCompileTime <= 25)
|
||||
VectorOperatorEqualsUnroller
|
||||
<Derived, OtherDerived, Traits::SizeAtCompileTime>::run
|
||||
(*static_cast<Derived*>(this), *static_cast<const OtherDerived*>(&other));
|
||||
else
|
||||
for(int i = 0; i < coeffs(); i++)
|
||||
for(int i = 0; i < size(); i++)
|
||||
coeffRef(i) = other.coeff(i);
|
||||
return *static_cast<Derived*>(this);
|
||||
}
|
||||
else // copying a matrix expression into a matrix
|
||||
{
|
||||
assert(rows() == other.rows() && cols() == other.cols());
|
||||
if(EIGEN_UNROLLED_LOOPS && Traits::SizeAtCompileTime != Dynamic && Traits::SizeAtCompileTime <= 25)
|
||||
if(EIGEN_UNROLLED_LOOPS
|
||||
&& Traits::SizeAtCompileTime != Dynamic
|
||||
&& Traits::SizeAtCompileTime <= 25)
|
||||
{
|
||||
MatrixOperatorEqualsUnroller
|
||||
<Derived, OtherDerived, Traits::SizeAtCompileTime>::run
|
||||
(*static_cast<Derived*>(this), *static_cast<const OtherDerived*>(&other));
|
||||
}
|
||||
else
|
||||
for(int j = 0; j < cols(); j++)
|
||||
{
|
||||
if(Traits::ColsAtCompileTime == Dynamic || Traits::RowsAtCompileTime != Dynamic)
|
||||
{
|
||||
// traverse in column-major order
|
||||
for(int j = 0; j < cols(); j++)
|
||||
for(int i = 0; i < rows(); i++)
|
||||
coeffRef(i, j) = other.coeff(i, j);
|
||||
}
|
||||
else
|
||||
{
|
||||
// traverse in row-major order
|
||||
// in order to allow the compiler to unroll the inner loop
|
||||
for(int i = 0; i < rows(); i++)
|
||||
coeffRef(i, j) = other.coeff(i, j);
|
||||
for(int j = 0; j < cols(); j++)
|
||||
coeffRef(i, j) = other.coeff(i, j);
|
||||
}
|
||||
}
|
||||
return *static_cast<Derived*>(this);
|
||||
}
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ template<typename MatrixType> class Opposite : NoOperatorEquals,
|
||||
}
|
||||
|
||||
protected:
|
||||
MatRef m_matrix;
|
||||
const MatRef m_matrix;
|
||||
};
|
||||
|
||||
/** \returns an expression of the opposite of \c *this
|
||||
|
@ -64,7 +64,7 @@ template<typename MatrixType> class Random : NoOperatorEquals,
|
||||
}
|
||||
|
||||
protected:
|
||||
int m_rows, m_cols;
|
||||
const int m_rows, m_cols;
|
||||
};
|
||||
|
||||
/** \returns a random matrix (not an expression, the matrix is immediately evaluated).
|
||||
@ -128,4 +128,17 @@ const Eval<Random<Derived> > MatrixBase<Scalar, Derived>::random()
|
||||
return Random<Derived>(Traits::RowsAtCompileTime, Traits::ColsAtCompileTime).eval();
|
||||
}
|
||||
|
||||
/** Sets all coefficients in this expression to random values.
|
||||
*
|
||||
* Example: \include MatrixBase_setRandom.cpp
|
||||
* Output: \verbinclude MatrixBase_setRandom.out
|
||||
*
|
||||
* \sa class Random, random()
|
||||
*/
|
||||
template<typename Scalar, typename Derived>
|
||||
Derived& MatrixBase<Scalar, Derived>::setRandom()
|
||||
{
|
||||
return *this = Random<Derived>(rows(), cols());
|
||||
}
|
||||
|
||||
#endif // EIGEN_RANDOM_H
|
||||
|
@ -89,7 +89,6 @@ EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, *=) \
|
||||
EIGEN_INHERIT_SCALAR_ASSIGNMENT_OPERATOR(Derived, /=)
|
||||
|
||||
const int Dynamic = -10;
|
||||
const int Generic = -20;
|
||||
const int ColumnMajor = 0;
|
||||
const int RowMajor = 1;
|
||||
|
||||
|
@ -64,7 +64,7 @@ template<typename MatrixType> class Zero : NoOperatorEquals,
|
||||
}
|
||||
|
||||
protected:
|
||||
int m_rows, m_cols;
|
||||
const int m_rows, m_cols;
|
||||
};
|
||||
|
||||
/** \returns an expression of a zero matrix.
|
||||
@ -146,4 +146,17 @@ bool MatrixBase<Scalar, Derived>::isZero
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Sets all coefficients in this expression to zero.
|
||||
*
|
||||
* Example: \include MatrixBase_setZero.cpp
|
||||
* Output: \verbinclude MatrixBase_setZero.out
|
||||
*
|
||||
* \sa class Zero, zero()
|
||||
*/
|
||||
template<typename Scalar, typename Derived>
|
||||
Derived& MatrixBase<Scalar, Derived>::setZero()
|
||||
{
|
||||
return *this = Zero<Derived>(rows(), cols());
|
||||
}
|
||||
|
||||
#endif // EIGEN_ZERO_H
|
||||
|
@ -16,7 +16,7 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
for(int a = 0; a < 400000000; a++)
|
||||
{
|
||||
m = I + 0.00005 * (m + m*m);
|
||||
m = Matrix3d::identity() + 0.00005 * (m + m*m);
|
||||
}
|
||||
cout << m << endl;
|
||||
return 0;
|
||||
|
3
doc/snippets/MatrixBase_setIdentity.cpp
Normal file
3
doc/snippets/MatrixBase_setIdentity.cpp
Normal file
@ -0,0 +1,3 @@
|
||||
Matrix4i m = Matrix4i::zero();
|
||||
m.block<3,3>(1,0).setIdentity();
|
||||
cout << m << endl;
|
3
doc/snippets/MatrixBase_setOnes.cpp
Normal file
3
doc/snippets/MatrixBase_setOnes.cpp
Normal file
@ -0,0 +1,3 @@
|
||||
Matrix4i m = Matrix4i::random();
|
||||
m.row(1).setOnes();
|
||||
cout << m << endl;
|
3
doc/snippets/MatrixBase_setRandom.cpp
Normal file
3
doc/snippets/MatrixBase_setRandom.cpp
Normal file
@ -0,0 +1,3 @@
|
||||
Matrix4i m = Matrix4i::zero();
|
||||
m.col(1).setRandom();
|
||||
cout << m << endl;
|
3
doc/snippets/MatrixBase_setZero.cpp
Normal file
3
doc/snippets/MatrixBase_setZero.cpp
Normal file
@ -0,0 +1,3 @@
|
||||
Matrix4i m = Matrix4i::random();
|
||||
m.row(1).setZero();
|
||||
cout << m << endl;
|
@ -31,7 +31,7 @@ template<typename VectorType> void tmap(const VectorType& m)
|
||||
{
|
||||
typedef typename VectorType::Scalar Scalar;
|
||||
|
||||
int size = m.coeffs();
|
||||
int size = m.size();
|
||||
|
||||
// test Map.h
|
||||
Scalar* array1 = new Scalar[size];
|
||||
|
Loading…
x
Reference in New Issue
Block a user