| 133 | |
| 134 | |
| 135 | template<typename MatrixType> void triangular_rect(const MatrixType& m) |
| 136 | { |
| 137 | typedef const typename MatrixType::Index Index; |
| 138 | typedef typename MatrixType::Scalar Scalar; |
| 139 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 140 | enum { Rows = MatrixType::RowsAtCompileTime, Cols = MatrixType::ColsAtCompileTime }; |
| 141 | |
| 142 | Index rows = m.rows(); |
| 143 | Index cols = m.cols(); |
| 144 | |
| 145 | MatrixType m1 = MatrixType::Random(rows, cols), |
| 146 | m2 = MatrixType::Random(rows, cols), |
| 147 | m3(rows, cols), |
| 148 | m4(rows, cols), |
| 149 | r1(rows, cols), |
| 150 | r2(rows, cols); |
| 151 | |
| 152 | MatrixType m1up = m1.template triangularView<Upper>(); |
| 153 | MatrixType m2up = m2.template triangularView<Upper>(); |
| 154 | |
| 155 | if (rows>1 && cols>1) |
| 156 | { |
| 157 | VERIFY(m1up.isUpperTriangular()); |
| 158 | VERIFY(m2up.transpose().isLowerTriangular()); |
| 159 | VERIFY(!m2.isLowerTriangular()); |
| 160 | } |
| 161 | |
| 162 | // test overloaded operator+= |
| 163 | r1.setZero(); |
| 164 | r2.setZero(); |
| 165 | r1.template triangularView<Upper>() += m1; |
| 166 | r2 += m1up; |
| 167 | VERIFY_IS_APPROX(r1,r2); |
| 168 | |
| 169 | // test overloaded operator= |
| 170 | m1.setZero(); |
| 171 | m1.template triangularView<Upper>() = 3 * m2; |
| 172 | m3 = 3 * m2; |
| 173 | VERIFY_IS_APPROX(m3.template triangularView<Upper>().toDenseMatrix(), m1); |
| 174 | |
| 175 | |
| 176 | m1.setZero(); |
| 177 | m1.template triangularView<Lower>() = 3 * m2; |
| 178 | VERIFY_IS_APPROX(m3.template triangularView<Lower>().toDenseMatrix(), m1); |
| 179 | |
| 180 | m1.setZero(); |
| 181 | m1.template triangularView<StrictlyUpper>() = 3 * m2; |
| 182 | VERIFY_IS_APPROX(m3.template triangularView<StrictlyUpper>().toDenseMatrix(), m1); |
| 183 | |
| 184 | |
| 185 | m1.setZero(); |
| 186 | m1.template triangularView<StrictlyLower>() = 3 * m2; |
| 187 | VERIFY_IS_APPROX(m3.template triangularView<StrictlyLower>().toDenseMatrix(), m1); |
| 188 | m1.setRandom(); |
| 189 | m2 = m1.template triangularView<Upper>(); |
| 190 | VERIFY(m2.isUpperTriangular()); |
| 191 | VERIFY(!m2.isLowerTriangular()); |
| 192 | m2 = m1.template triangularView<StrictlyUpper>(); |