aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/nullary.cpp
diff options
context:
space:
mode:
authorGravatar Hauke Heibel <hauke.heibel@gmail.com>2010-01-26 19:42:17 +0100
committerGravatar Hauke Heibel <hauke.heibel@gmail.com>2010-01-26 19:42:17 +0100
commit4365a48748b3aeb6c15178b8471b1a5a8e0e9802 (patch)
treec41b0b82d4d32100c4fbae0d24d7867d0d31ddf9 /test/nullary.cpp
parentafb9bf628168a8b1119764628f716f52cf1c54ee (diff)
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.
Diffstat (limited to 'test/nullary.cpp')
-rw-r--r--test/nullary.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/test/nullary.cpp b/test/nullary.cpp
index a7f6c60a7..240365529 100644
--- a/test/nullary.cpp
+++ b/test/nullary.cpp
@@ -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()) );
}