mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Added an ei_linspaced_op to create linearly spaced vectors.
Added setLinSpaced/LinSpaced functionality to DenseBase. Improved vectorized assignment - overcomes MSVC optimization issues. CwiseNullaryOp is now requiring functors to offer 1D and 2D operators. Adapted existing functors to the new CwiseNullaryOp requirements. Added ei_plset to create packages as [a, a+1, ..., a+size]. Added more nullaray unit tests.
This commit is contained in:
@@ -46,6 +46,54 @@ bool equalsIdentity(const MatrixType& A)
|
||||
return offDiagOK && diagOK;
|
||||
}
|
||||
|
||||
template<typename VectorType>
|
||||
void testVectorType(const VectorType& base)
|
||||
{
|
||||
typedef typename ei_traits<VectorType>::Scalar Scalar;
|
||||
Scalar low = ei_random(-500,500);
|
||||
Scalar high = ei_random(-500,500);
|
||||
if (low>high) std::swap(low,high);
|
||||
const int size = base.size();
|
||||
const Scalar step = (high-low)/(size-1);
|
||||
|
||||
// check whether the result yields what we expect it to do
|
||||
VectorType m(base);
|
||||
m.setLinSpaced(low,high,size);
|
||||
|
||||
VectorType n(size);
|
||||
for (int i=0; i<size; ++i)
|
||||
n(i) = low+i*step;
|
||||
|
||||
VERIFY( (m-n).norm() < std::numeric_limits<Scalar>::epsilon()*10e3 );
|
||||
|
||||
// random access version
|
||||
m = VectorType::LinSpaced(low,high,size);
|
||||
VERIFY( (m-n).norm() < std::numeric_limits<Scalar>::epsilon()*10e3 );
|
||||
|
||||
// These guys sometimes fail! This is not good. Any ideas how to fix them!?
|
||||
//VERIFY( m(m.size()-1) == high );
|
||||
//VERIFY( m(0) == low );
|
||||
|
||||
// sequential access version
|
||||
m = VectorType::LinSpaced(Sequential,low,high,size);
|
||||
VERIFY( (m-n).norm() < std::numeric_limits<Scalar>::epsilon()*10e3 );
|
||||
|
||||
// These guys sometimes fail! This is not good. Any ideas how to fix them!?
|
||||
//VERIFY( m(m.size()-1) == high );
|
||||
//VERIFY( m(0) == low );
|
||||
|
||||
// check whether everything works with row and col major vectors
|
||||
Matrix<Scalar,Dynamic,1> row_vector(size);
|
||||
Matrix<Scalar,1,Dynamic> col_vector(size);
|
||||
row_vector.setLinSpaced(low,high,size);
|
||||
col_vector.setLinSpaced(low,high,size);
|
||||
VERIFY( (row_vector-col_vector.transpose()).norm() < 1e-10 );
|
||||
|
||||
Matrix<Scalar,Dynamic,1> size_changer(size+50);
|
||||
size_changer.setLinSpaced(low,high,size);
|
||||
VERIFY( size_changer.size() == size );
|
||||
}
|
||||
|
||||
template<typename MatrixType>
|
||||
void testMatrixType(const MatrixType& m)
|
||||
{
|
||||
@@ -63,4 +111,10 @@ void test_nullary()
|
||||
CALL_SUBTEST_1( testMatrixType(Matrix2d()) );
|
||||
CALL_SUBTEST_2( testMatrixType(MatrixXcf(50,50)) );
|
||||
CALL_SUBTEST_3( testMatrixType(MatrixXf(5,7)) );
|
||||
CALL_SUBTEST_4( testVectorType(VectorXd(51)) );
|
||||
CALL_SUBTEST_5( testVectorType(VectorXd(41)) );
|
||||
CALL_SUBTEST_6( testVectorType(Vector3d()) );
|
||||
CALL_SUBTEST_7( testVectorType(VectorXf(51)) );
|
||||
CALL_SUBTEST_8( testVectorType(VectorXf(41)) );
|
||||
CALL_SUBTEST_9( testVectorType(Vector3f()) );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user