| 44 | } |
| 45 | |
| 46 | template<typename SparseMatrixType> void sparse_basic(const SparseMatrixType& ref) |
| 47 | { |
| 48 | const int rows = ref.rows(); |
| 49 | const int cols = ref.cols(); |
| 50 | typedef typename SparseMatrixType::Scalar Scalar; |
| 51 | enum { Flags = SparseMatrixType::Flags }; |
| 52 | |
| 53 | double density = std::max(8./(rows*cols), 0.01); |
| 54 | typedef Matrix<Scalar,Dynamic,Dynamic> DenseMatrix; |
| 55 | typedef Matrix<Scalar,Dynamic,1> DenseVector; |
| 56 | Scalar eps = 1e-6; |
| 57 | |
| 58 | SparseMatrixType m(rows, cols); |
| 59 | DenseMatrix refMat = DenseMatrix::Zero(rows, cols); |
| 60 | DenseVector vec1 = DenseVector::Random(rows); |
| 61 | Scalar s1 = ei_random<Scalar>(); |
| 62 | |
| 63 | std::vector<Vector2i> zeroCoords; |
| 64 | std::vector<Vector2i> nonzeroCoords; |
| 65 | initSparse<Scalar>(density, refMat, m, 0, &zeroCoords, &nonzeroCoords); |
| 66 | |
| 67 | if (zeroCoords.size()==0 || nonzeroCoords.size()==0) |
| 68 | return; |
| 69 | |
| 70 | // test coeff and coeffRef |
| 71 | for (int i=0; i<(int)zeroCoords.size(); ++i) |
| 72 | { |
| 73 | VERIFY_IS_MUCH_SMALLER_THAN( m.coeff(zeroCoords[i].x(),zeroCoords[i].y()), eps ); |
| 74 | if(ei_is_same_type<SparseMatrixType,SparseMatrix<Scalar,Flags> >::ret) |
| 75 | VERIFY_RAISES_ASSERT( m.coeffRef(zeroCoords[0].x(),zeroCoords[0].y()) = 5 ); |
| 76 | } |
| 77 | VERIFY_IS_APPROX(m, refMat); |
| 78 | |
| 79 | m.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5); |
| 80 | refMat.coeffRef(nonzeroCoords[0].x(), nonzeroCoords[0].y()) = Scalar(5); |
| 81 | |
| 82 | VERIFY_IS_APPROX(m, refMat); |
| 83 | /* |
| 84 | // test InnerIterators and Block expressions |
| 85 | for (int t=0; t<10; ++t) |
| 86 | { |
| 87 | int j = ei_random<int>(0,cols-1); |
| 88 | int i = ei_random<int>(0,rows-1); |
| 89 | int w = ei_random<int>(1,cols-j-1); |
| 90 | int h = ei_random<int>(1,rows-i-1); |
| 91 | |
| 92 | // VERIFY_IS_APPROX(m.block(i,j,h,w), refMat.block(i,j,h,w)); |
| 93 | for(int c=0; c<w; c++) |
| 94 | { |
| 95 | VERIFY_IS_APPROX(m.block(i,j,h,w).col(c), refMat.block(i,j,h,w).col(c)); |
| 96 | for(int r=0; r<h; r++) |
| 97 | { |
| 98 | // VERIFY_IS_APPROX(m.block(i,j,h,w).col(c).coeff(r), refMat.block(i,j,h,w).col(c).coeff(r)); |
| 99 | } |
| 100 | } |
| 101 | // for(int r=0; r<h; r++) |
| 102 | // { |
| 103 | // VERIFY_IS_APPROX(m.block(i,j,h,w).row(r), refMat.block(i,j,h,w).row(r)); |
no test coverage detected