Lines 178-193
template<typename MatrixType> void block
Link Here
|
178 |
VERIFY_IS_EQUAL(dv, dm); |
178 |
VERIFY_IS_EQUAL(dv, dm); |
179 |
dm.setZero(); |
179 |
dm.setZero(); |
180 |
dv.setZero(); |
180 |
dv.setZero(); |
181 |
dm = m1.row(r1).segment(c1,c2-c1+1).transpose(); |
181 |
dm = m1.row(r1).segment(c1,c2-c1+1).transpose(); |
182 |
dv = m1.transpose().block(c1,r1,c2-c1+1,r2-r1+1).col(0); |
182 |
dv = m1.transpose().block(c1,r1,c2-c1+1,r2-r1+1).col(0); |
183 |
VERIFY_IS_EQUAL(dv, dm); |
183 |
VERIFY_IS_EQUAL(dv, dm); |
184 |
} |
184 |
} |
185 |
|
185 |
|
|
|
186 |
template<typename T> |
187 |
bool same_type(const T&, const T&) { return true; } |
188 |
|
189 |
template<typename Expr, typename Ref, typename ExprFused> |
190 |
void checkbb(const DenseBase<Expr> &a_xpr, const DenseBase<Ref> &a_ref, const DenseBase<ExprFused> &a_xprfused) |
191 |
{ |
192 |
const Expr& xpr(a_xpr.derived()); |
193 |
const Ref& ref(a_ref.derived()); |
194 |
const ExprFused& xprfused(a_xprfused.derived()); |
195 |
|
196 |
VERIFY_IS_APPROX(xprfused, ref); |
197 |
|
198 |
VERIFY(same_type<ExprFused>(xpr, xprfused)); |
199 |
|
200 |
VERIFY_IS_EQUAL(ExprFused::Flags, Expr::Flags); |
201 |
VERIFY_IS_EQUAL(ExprFused::RowsAtCompileTime, Expr::RowsAtCompileTime); |
202 |
VERIFY_IS_EQUAL(ExprFused::ColsAtCompileTime, Expr::ColsAtCompileTime); |
203 |
|
204 |
typedef internal::evaluator<ExprFused> EvalFused; |
205 |
typedef internal::evaluator<Expr> EvalExpr; |
206 |
VERIFY_IS_EQUAL(EvalFused::Flags, EvalExpr::Flags); |
207 |
VERIFY_IS_EQUAL(EvalFused::Alignment, EvalExpr::Alignment); |
208 |
|
209 |
VERIFY_IS_APPROX(xpr.derived(), ref); |
210 |
VERIFY_IS_APPROX(xpr, ref); |
211 |
} |
212 |
|
213 |
template<typename MatrixType> |
214 |
void check_block_block_fusion(const MatrixType &m) |
215 |
{ |
216 |
Index rows = m.rows(); |
217 |
Index cols = m.cols(); |
218 |
|
219 |
MatrixType m1 = MatrixType::Random(rows, cols), |
220 |
m2 = MatrixType::Random(rows, cols); |
221 |
|
222 |
Index r1 = internal::random<Index>(0,rows-1); |
223 |
Index c1 = internal::random<Index>(0,cols-1); |
224 |
Index nr1 = internal::random<Index>(1,rows-r1); |
225 |
Index nc1 = internal::random<Index>(1,cols-c1); |
226 |
|
227 |
Index r2 = internal::random<Index>(0,nr1-1); |
228 |
Index c2 = internal::random<Index>(0,nc1-1); |
229 |
Index nr2 = internal::random<Index>(1,nr1-r2); |
230 |
Index nc2 = internal::random<Index>(1,nc1-c2); |
231 |
|
232 |
CALL_SUBTEST( checkbb(m1.block(r1,c1, nr1,nc1).block(r2,c2,nr2,nc2), |
233 |
m1.block(r1,c1, nr1,nc1).eval().block(r2,c2,nr2,nc2).eval(), |
234 |
m1.block(r1+r2, c1+c2, nr2, nc2)) ); |
235 |
CALL_SUBTEST( checkbb((m1+m2).block(r1,c1, nr1,nc1).block(r2,c2,nr2,nc2), |
236 |
(m1+m2).block(r1,c1, nr1,nc1).eval().block(r2,c2,nr2,nc2).eval(), |
237 |
(m1+m2).block(r1+r2, c1+c2, nr2, nc2)) ); |
238 |
|
239 |
CALL_SUBTEST( checkbb(m1.block(r1,c1, nr1,nc1).row(r2), |
240 |
m1.block(r1,c1, nr1,nc1).eval().row(r2).eval(), |
241 |
m1.template block<1,Dynamic>(r1+r2, c1, 1, nc1)) ); |
242 |
CALL_SUBTEST( checkbb((m1+m2).block(r1,c1, nr1,nc1).row(r2), |
243 |
(m1+m2).block(r1,c1, nr1,nc1).eval().row(r2).eval(), |
244 |
(m1+m2).template block<1,Dynamic>(r1+r2, c1, 1, nc1)) ); |
245 |
|
246 |
CALL_SUBTEST( checkbb(m1.block(r1,c1, nr1,nc1).col(c2), |
247 |
m1.block(r1,c1, nr1,nc1).eval().col(c2).eval(), |
248 |
m1.template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
249 |
CALL_SUBTEST( checkbb((m1+m2).block(r1,c1, nr1,nc1).col(c2), |
250 |
(m1+m2).block(r1,c1, nr1,nc1).eval().col(c2).eval(), |
251 |
(m1+m2).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
252 |
|
253 |
CALL_SUBTEST( checkbb(m1.row(r1).segment(c1,nc1), |
254 |
m1.row(r1).eval().segment(c1,nc1).eval(), |
255 |
m1.template block<1,Dynamic>(r1, c1, 1, nc1)) ); |
256 |
CALL_SUBTEST( checkbb((m1+m2).row(r1).segment(c1,nc1), |
257 |
(m1+m2).row(r1).eval().segment(c1,nc1).eval(), |
258 |
(m1+m2).template block<1,Dynamic>(r1, c1, 1, nc1)) ); |
259 |
|
260 |
CALL_SUBTEST( checkbb(m1.col(c1).segment(r1,nr1), |
261 |
m1.col(c1).eval().segment(r1,nr1).eval(), |
262 |
m1.template block<Dynamic,1>(r1, c1, nr1, 1)) ); |
263 |
CALL_SUBTEST( checkbb((m1+m2).col(c1).segment(r1,nr1), |
264 |
(m1+m2).col(c1).eval().segment(r1,nr1).eval(), |
265 |
(m1+m2).template block<Dynamic,1>(r1, c1, nr1, 1)) ); |
266 |
|
267 |
CALL_SUBTEST( checkbb(m1.middleCols(c1,nc1).col(c2).segment(r1,nr1), |
268 |
m1.middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
269 |
m1.template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
270 |
CALL_SUBTEST( checkbb((m1+m2).middleCols(c1,nc1).col(c2).segment(r1,nr1), |
271 |
(m1+m2).middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
272 |
(m1+m2).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
273 |
|
274 |
CALL_SUBTEST( checkbb(m1.row(r1).col(c1), |
275 |
m1.row(r1).eval().col(c1).eval(), |
276 |
m1.template block<1,1>(r1, c1)) ); |
277 |
CALL_SUBTEST( checkbb((m1+m2).row(r1).col(c1), |
278 |
(m1+m2).row(r1).eval().col(c1).eval(), |
279 |
(m1+m2).template block<1,1>(r1, c1)) ); |
280 |
|
281 |
CALL_SUBTEST( checkbb(m1.row(r1).col(c1).segment(0,1), |
282 |
m1.row(r1).eval().col(c1).eval().segment(0,1).eval(), |
283 |
m1.template block<Dynamic,1>(r1, c1, 1,1)) ); |
284 |
CALL_SUBTEST( checkbb((m1+m2).row(r1).col(c1).segment(0,1), |
285 |
(m1+m2).row(r1).eval().col(c1).eval().segment(0,1).eval(), |
286 |
(m1+m2).template block<Dynamic,1>(r1, c1, 1,1)) ); |
287 |
} |
186 |
|
288 |
|
187 |
template<typename MatrixType> |
289 |
template<typename MatrixType> |
188 |
void compare_using_data_and_stride(const MatrixType& m) |
290 |
void compare_using_data_and_stride(const MatrixType& m) |
189 |
{ |
291 |
{ |
190 |
typedef typename MatrixType::Index Index; |
292 |
typedef typename MatrixType::Index Index; |
191 |
Index rows = m.rows(); |
293 |
Index rows = m.rows(); |
192 |
Index cols = m.cols(); |
294 |
Index cols = m.cols(); |
193 |
Index size = m.size(); |
295 |
Index size = m.size(); |
Lines 246-259
void test_block()
Link Here
|
246 |
CALL_SUBTEST_2( block(Matrix4d()) ); |
348 |
CALL_SUBTEST_2( block(Matrix4d()) ); |
247 |
CALL_SUBTEST_3( block(MatrixXcf(3, 3)) ); |
349 |
CALL_SUBTEST_3( block(MatrixXcf(3, 3)) ); |
248 |
CALL_SUBTEST_4( block(MatrixXi(8, 12)) ); |
350 |
CALL_SUBTEST_4( block(MatrixXi(8, 12)) ); |
249 |
CALL_SUBTEST_5( block(MatrixXcd(20, 20)) ); |
351 |
CALL_SUBTEST_5( block(MatrixXcd(20, 20)) ); |
250 |
CALL_SUBTEST_6( block(MatrixXf(20, 20)) ); |
352 |
CALL_SUBTEST_6( block(MatrixXf(20, 20)) ); |
251 |
|
353 |
|
252 |
CALL_SUBTEST_8( block(Matrix<float,Dynamic,4>(3, 4)) ); |
354 |
CALL_SUBTEST_8( block(Matrix<float,Dynamic,4>(3, 4)) ); |
253 |
|
355 |
|
|
|
356 |
CALL_SUBTEST_9( check_block_block_fusion(MatrixXi(internal::random(1,50), internal::random(1,50))) ); |
357 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix4i()) ); |
358 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix3i()) ); |
359 |
|
360 |
CALL_SUBTEST_9( check_block_block_fusion(MatrixXd(internal::random(1,50), internal::random(1,50))) ); |
361 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix4d()) ); |
362 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix3d()) ); |
363 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix2d()) ); |
364 |
|
254 |
#ifndef EIGEN_DEFAULT_TO_ROW_MAJOR |
365 |
#ifndef EIGEN_DEFAULT_TO_ROW_MAJOR |
255 |
CALL_SUBTEST_6( data_and_stride(MatrixXf(internal::random(5,50), internal::random(5,50))) ); |
366 |
CALL_SUBTEST_6( data_and_stride(MatrixXf(internal::random(5,50), internal::random(5,50))) ); |
256 |
CALL_SUBTEST_7( data_and_stride(Matrix<int,Dynamic,Dynamic,RowMajor>(internal::random(5,50), internal::random(5,50))) ); |
367 |
CALL_SUBTEST_7( data_and_stride(Matrix<int,Dynamic,Dynamic,RowMajor>(internal::random(5,50), internal::random(5,50))) ); |
257 |
#endif |
368 |
#endif |
258 |
} |
369 |
} |
259 |
} |
370 |
} |