Lines 3-18
Link Here
|
3 |
// |
3 |
// |
4 |
// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com> |
4 |
// Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com> |
5 |
// |
5 |
// |
6 |
// This Source Code Form is subject to the terms of the Mozilla |
6 |
// This Source Code Form is subject to the terms of the Mozilla |
7 |
// Public License v. 2.0. If a copy of the MPL was not distributed |
7 |
// Public License v. 2.0. If a copy of the MPL was not distributed |
8 |
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
8 |
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. |
9 |
|
9 |
|
10 |
#define EIGEN_NO_STATIC_ASSERT // otherwise we fail at compile time on unused paths |
10 |
#define EIGEN_NO_STATIC_ASSERT // otherwise we fail at compile time on unused paths |
|
|
11 |
#define EIGEN_DEBUG_DEMANGLING |
11 |
#include "main.h" |
12 |
#include "main.h" |
12 |
|
13 |
|
13 |
template<typename MatrixType, typename Index, typename Scalar> |
14 |
template<typename MatrixType, typename Index, typename Scalar> |
14 |
typename Eigen::internal::enable_if<!NumTraits<typename MatrixType::Scalar>::IsComplex,typename MatrixType::Scalar>::type |
15 |
typename Eigen::internal::enable_if<!NumTraits<typename MatrixType::Scalar>::IsComplex,typename MatrixType::Scalar>::type |
15 |
block_real_only(const MatrixType &m1, Index r1, Index r2, Index c1, Index c2, const Scalar& s1) { |
16 |
block_real_only(const MatrixType &m1, Index r1, Index r2, Index c1, Index c2, const Scalar& s1) { |
16 |
// check cwise-Functions: |
17 |
// check cwise-Functions: |
17 |
VERIFY_IS_APPROX(m1.row(r1).cwiseMax(s1), m1.cwiseMax(s1).row(r1)); |
18 |
VERIFY_IS_APPROX(m1.row(r1).cwiseMax(s1), m1.cwiseMax(s1).row(r1)); |
18 |
VERIFY_IS_APPROX(m1.col(c1).cwiseMin(s1), m1.cwiseMin(s1).col(c1)); |
19 |
VERIFY_IS_APPROX(m1.col(c1).cwiseMin(s1), m1.cwiseMin(s1).col(c1)); |
Lines 183-198
template<typename MatrixType> void block
Link Here
|
183 |
VERIFY_IS_EQUAL(dv, dm); |
184 |
VERIFY_IS_EQUAL(dv, dm); |
184 |
|
185 |
|
185 |
VERIFY_IS_EQUAL( (m1.template block<Dynamic,1>(1,0,0,1)), m1.block(1,0,0,1)); |
186 |
VERIFY_IS_EQUAL( (m1.template block<Dynamic,1>(1,0,0,1)), m1.block(1,0,0,1)); |
186 |
VERIFY_IS_EQUAL( (m1.template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); |
187 |
VERIFY_IS_EQUAL( (m1.template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); |
187 |
VERIFY_IS_EQUAL( ((m1*1).template block<Dynamic,1>(1,0,0,1)), m1.block(1,0,0,1)); |
188 |
VERIFY_IS_EQUAL( ((m1*1).template block<Dynamic,1>(1,0,0,1)), m1.block(1,0,0,1)); |
188 |
VERIFY_IS_EQUAL( ((m1*1).template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); |
189 |
VERIFY_IS_EQUAL( ((m1*1).template block<1,Dynamic>(0,1,1,0)), m1.block(0,1,1,0)); |
189 |
} |
190 |
} |
190 |
|
191 |
|
|
|
192 |
template<typename T> |
193 |
bool same_type(const T&, const T&) { return true; } |
194 |
|
195 |
template<typename Expr, typename Ref, typename ExprFused> |
196 |
void checkbb(const DenseBase<Expr> &a_xpr, const DenseBase<Ref> &a_ref, const DenseBase<ExprFused> &a_xprfused) |
197 |
{ |
198 |
const Expr& xpr(a_xpr.derived()); |
199 |
const Ref& ref(a_ref.derived()); |
200 |
const ExprFused& xprfused(a_xprfused.derived()); |
201 |
|
202 |
VERIFY_IS_APPROX(xprfused, ref); |
203 |
|
204 |
VERIFY(same_type<ExprFused>(xpr, xprfused)); |
205 |
|
206 |
if(ExprFused::Flags!=Expr::Flags) |
207 |
std::cerr << "Expected: " << internal::demangle_flags(ExprFused::Flags) << std::endl |
208 |
<< "Got: " << internal::demangle_flags(Expr::Flags) << std::endl; |
209 |
|
210 |
VERIFY_IS_EQUAL(ExprFused::Flags, Expr::Flags); |
211 |
VERIFY_IS_EQUAL(ExprFused::RowsAtCompileTime, Expr::RowsAtCompileTime); |
212 |
VERIFY_IS_EQUAL(ExprFused::ColsAtCompileTime, Expr::ColsAtCompileTime); |
213 |
VERIFY_IS_EQUAL(ExprFused::MaxRowsAtCompileTime, Expr::MaxRowsAtCompileTime); |
214 |
VERIFY_IS_EQUAL(ExprFused::MaxColsAtCompileTime, Expr::MaxColsAtCompileTime); |
215 |
|
216 |
typedef internal::evaluator<ExprFused> EvalFused; |
217 |
typedef internal::evaluator<Expr> EvalExpr; |
218 |
VERIFY_IS_EQUAL(EvalFused::Flags, EvalExpr::Flags); |
219 |
VERIFY_IS_EQUAL(EvalFused::Alignment, EvalExpr::Alignment); |
220 |
|
221 |
VERIFY_IS_APPROX(xpr.derived(), ref); |
222 |
VERIFY_IS_APPROX(xpr, ref); |
223 |
} |
224 |
|
225 |
template<typename MatrixType> |
226 |
void block_rec(const MatrixType& a) |
227 |
{ |
228 |
if(a.cols()>1) |
229 |
{ |
230 |
block_rec(a.leftCols(a.cols()/2)); |
231 |
block_rec(a.rightCols(a.cols()/2)); |
232 |
} |
233 |
} |
234 |
|
235 |
template<typename T> const T& make_const(const T& x) { return x; } |
236 |
|
237 |
template<typename MatrixType> |
238 |
void check_block_block_fusion(const MatrixType &m) |
239 |
{ |
240 |
Index rows = m.rows(); |
241 |
Index cols = m.cols(); |
242 |
|
243 |
MatrixType m1 = MatrixType::Random(rows, cols), |
244 |
m2 = MatrixType::Random(rows, cols); |
245 |
|
246 |
Index r1 = internal::random<Index>(0,rows-1); |
247 |
Index c1 = internal::random<Index>(0,cols-1); |
248 |
Index nr1 = internal::random<Index>(1,rows-r1); |
249 |
Index nc1 = internal::random<Index>(1,cols-c1); |
250 |
|
251 |
Index r2 = internal::random<Index>(0,nr1-1); |
252 |
Index c2 = internal::random<Index>(0,nc1-1); |
253 |
Index nr2 = internal::random<Index>(1,nr1-r2); |
254 |
Index nc2 = internal::random<Index>(1,nc1-c2); |
255 |
|
256 |
CALL_SUBTEST( checkbb(m1.block(r1,c1, nr1,nc1).block(r2,c2,nr2,nc2), |
257 |
m1.block(r1,c1, nr1,nc1).eval().block(r2,c2,nr2,nc2).eval(), |
258 |
m1.block(r1+r2, c1+c2, nr2, nc2)) ); |
259 |
CALL_SUBTEST( checkbb(make_const(m1.block(r1,c1, nr1,nc1)).block(r2,c2,nr2,nc2), |
260 |
m1.block(r1,c1, nr1,nc1).eval().block(r2,c2,nr2,nc2).eval(), |
261 |
make_const(m1).block(r1+r2, c1+c2, nr2, nc2)) ); |
262 |
CALL_SUBTEST( checkbb((m1+m2).block(r1,c1, nr1,nc1).block(r2,c2,nr2,nc2), |
263 |
(m1+m2).block(r1,c1, nr1,nc1).eval().block(r2,c2,nr2,nc2).eval(), |
264 |
(m1+m2).block(r1+r2, c1+c2, nr2, nc2)) ); |
265 |
|
266 |
CALL_SUBTEST( checkbb(m1.block(r1,c1, nr1,nc1).row(r2), |
267 |
m1.block(r1,c1, nr1,nc1).eval().row(r2).eval(), |
268 |
m1.template block<1,Dynamic>(r1+r2, c1, 1, nc1)) ); |
269 |
CALL_SUBTEST( checkbb(make_const(m1.block(r1,c1, nr1,nc1)).row(r2), |
270 |
m1.block(r1,c1, nr1,nc1).eval().row(r2).eval(), |
271 |
make_const(m1).template block<1,Dynamic>(r1+r2, c1, 1, nc1)) ); |
272 |
CALL_SUBTEST( checkbb((m1+m2).block(r1,c1, nr1,nc1).row(r2), |
273 |
(m1+m2).block(r1,c1, nr1,nc1).eval().row(r2).eval(), |
274 |
(m1+m2).template block<1,Dynamic>(r1+r2, c1, 1, nc1)) ); |
275 |
|
276 |
CALL_SUBTEST( checkbb(m1.block(r1,c1, nr1,nc1).col(c2), |
277 |
m1.block(r1,c1, nr1,nc1).eval().col(c2).eval(), |
278 |
m1.template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
279 |
CALL_SUBTEST( checkbb(make_const(m1.block(r1,c1, nr1,nc1)).col(c2), |
280 |
m1.block(r1,c1, nr1,nc1).eval().col(c2).eval(), |
281 |
make_const(m1).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
282 |
CALL_SUBTEST( checkbb((m1+m2).block(r1,c1, nr1,nc1).col(c2), |
283 |
(m1+m2).block(r1,c1, nr1,nc1).eval().col(c2).eval(), |
284 |
(m1+m2).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
285 |
|
286 |
CALL_SUBTEST( checkbb(m1.row(r1).segment(c1,nc1), |
287 |
m1.row(r1).eval().segment(c1,nc1).eval(), |
288 |
m1.template block<1,Dynamic>(r1, c1, 1, nc1)) ); |
289 |
CALL_SUBTEST( checkbb(make_const(m1.row(r1)).segment(c1,nc1), |
290 |
m1.row(r1).eval().segment(c1,nc1).eval(), |
291 |
make_const(m1).template block<1,Dynamic>(r1, c1, 1, nc1)) ); |
292 |
CALL_SUBTEST( checkbb((m1+m2).row(r1).segment(c1,nc1), |
293 |
(m1+m2).row(r1).eval().segment(c1,nc1).eval(), |
294 |
(m1+m2).template block<1,Dynamic>(r1, c1, 1, nc1)) ); |
295 |
|
296 |
CALL_SUBTEST( checkbb(m1.col(c1).segment(r1,nr1), |
297 |
m1.col(c1).eval().segment(r1,nr1).eval(), |
298 |
m1.template block<Dynamic,1>(r1, c1, nr1, 1)) ); |
299 |
CALL_SUBTEST( checkbb(make_const(m1.col(c1)).segment(r1,nr1), |
300 |
m1.col(c1).eval().segment(r1,nr1).eval(), |
301 |
make_const(m1).template block<Dynamic,1>(r1, c1, nr1, 1)) ); |
302 |
CALL_SUBTEST( checkbb((m1+m2).col(c1).segment(r1,nr1), |
303 |
(m1+m2).col(c1).eval().segment(r1,nr1).eval(), |
304 |
(m1+m2).template block<Dynamic,1>(r1, c1, nr1, 1)) ); |
305 |
|
306 |
CALL_SUBTEST( checkbb(m1.middleCols(c1,nc1).col(c2).segment(r1,nr1), |
307 |
m1.middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
308 |
m1.template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
309 |
CALL_SUBTEST( checkbb(make_const(m1.middleCols(c1,nc1)).col(c2).segment(r1,nr1), |
310 |
m1.middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
311 |
make_const(m1).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
312 |
CALL_SUBTEST( checkbb(make_const(m1.middleCols(c1,nc1).col(c2)).segment(r1,nr1), |
313 |
m1.middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
314 |
make_const(m1).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
315 |
CALL_SUBTEST( checkbb((m1+m2).middleCols(c1,nc1).col(c2).segment(r1,nr1), |
316 |
(m1+m2).middleCols(c1,nc1).eval().col(c2).eval().segment(r1,nr1).eval(), |
317 |
(m1+m2).template block<Dynamic,1>(r1, c1+c2, nr1, 1)) ); |
318 |
|
319 |
CALL_SUBTEST( checkbb(m1.row(r1).col(c1), |
320 |
m1.row(r1).eval().col(c1).eval(), |
321 |
m1.template block<1,1>(r1, c1)) ); |
322 |
CALL_SUBTEST( checkbb(make_const(m1.row(r1)).col(c1), |
323 |
m1.row(r1).eval().col(c1).eval(), |
324 |
make_const(m1).template block<1,1>(r1, c1)) ); |
325 |
CALL_SUBTEST( checkbb((m1+m2).row(r1).col(c1), |
326 |
(m1+m2).row(r1).eval().col(c1).eval(), |
327 |
(m1+m2).template block<1,1>(r1, c1)) ); |
328 |
|
329 |
CALL_SUBTEST( checkbb(m1.row(r1).col(c1).segment(0,1), |
330 |
m1.row(r1).eval().col(c1).eval().segment(0,1).eval(), |
331 |
m1.template block<Dynamic,1>(r1, c1, 1,1)) ); |
332 |
CALL_SUBTEST( checkbb(make_const(m1.row(r1)).col(c1).segment(0,1), |
333 |
m1.row(r1).eval().col(c1).eval().segment(0,1).eval(), |
334 |
make_const(m1).template block<Dynamic,1>(r1, c1, 1,1)) ); |
335 |
CALL_SUBTEST( checkbb(make_const(m1.row(r1).col(c1)).segment(0,1), |
336 |
m1.row(r1).eval().col(c1).eval().segment(0,1).eval(), |
337 |
make_const(m1).template block<Dynamic,1>(r1, c1, 1,1)) ); |
338 |
CALL_SUBTEST( checkbb((m1+m2).row(r1).col(c1).segment(0,1), |
339 |
(m1+m2).row(r1).eval().col(c1).eval().segment(0,1).eval(), |
340 |
(m1+m2).template block<Dynamic,1>(r1, c1, 1,1)) ); |
341 |
|
342 |
block_rec(m1); |
343 |
block_rec(m1+m2); |
344 |
block_rec(m1.transpose()); |
345 |
|
346 |
|
347 |
// Check compatibility with hand-writen Block<Block<> > expression. |
348 |
{ |
349 |
typedef Block<MatrixType> B; |
350 |
B m11 = m1.block(r1,c1,nr1,nc1); |
351 |
Block<B> m111 = m11.block(r2,c2,nr2,nc2); |
352 |
VERIFY_IS_APPROX(m111, m1.block(r1+r2,c1+c2, nr2, nc2)); |
353 |
|
354 |
Block<B> m112(m11,r2,c2,nr2,nc2); |
355 |
VERIFY_IS_APPROX(m112, m1.block(r1+r2,c1+c2, nr2, nc2)); |
356 |
CALL_SUBTEST( checkbb(m112, m1.block(r1+r2,c1+c2, nr2, nc2), m1.block(r1+r2,c1+c2, nr2, nc2)) ); |
357 |
|
358 |
typename B::BlockXpr m113 = m11.block(r2,c2,nr2,nc2); |
359 |
VERIFY_IS_APPROX(m113, m1.block(r1+r2,c1+c2, nr2, nc2)); |
360 |
CALL_SUBTEST( checkbb(m113, m1.block(r1+r2,c1+c2, nr2, nc2), m1.block(r1+r2,c1+c2, nr2, nc2)) ); |
361 |
} |
362 |
|
363 |
// Check preservation of max-sizes |
364 |
if(m1.rows()>=2 && m2.cols()>=2) { |
365 |
|
366 |
typedef Block<MatrixType,2,2> B; |
367 |
B m3(m1,0,0); |
368 |
VERIFY_IS_EQUAL(m3.MaxRowsAtCompileTime, 2); |
369 |
VERIFY_IS_EQUAL(m3.MaxColsAtCompileTime, 2); |
370 |
VERIFY_IS_EQUAL((m3.block(0,0,1,1)).MaxRowsAtCompileTime, 2); |
371 |
VERIFY_IS_EQUAL((m3.block(0,0,1,1)).MaxColsAtCompileTime, 2); |
372 |
|
373 |
VERIFY_IS_EQUAL((m1.template block<2,2>(0,0).block(0,0,1,1)).MaxRowsAtCompileTime, 2); |
374 |
VERIFY_IS_EQUAL((m1.template block<2,2>(0,0).block(0,0,1,1)).MaxColsAtCompileTime, 2); |
375 |
|
376 |
} |
377 |
} |
191 |
|
378 |
|
192 |
template<typename MatrixType> |
379 |
template<typename MatrixType> |
193 |
void compare_using_data_and_stride(const MatrixType& m) |
380 |
void compare_using_data_and_stride(const MatrixType& m) |
194 |
{ |
381 |
{ |
195 |
typedef typename MatrixType::Index Index; |
382 |
typedef typename MatrixType::Index Index; |
196 |
Index rows = m.rows(); |
383 |
Index rows = m.rows(); |
197 |
Index cols = m.cols(); |
384 |
Index cols = m.cols(); |
198 |
Index size = m.size(); |
385 |
Index size = m.size(); |
Lines 251-264
void test_block()
Link Here
|
251 |
CALL_SUBTEST_2( block(Matrix4d()) ); |
438 |
CALL_SUBTEST_2( block(Matrix4d()) ); |
252 |
CALL_SUBTEST_3( block(MatrixXcf(3, 3)) ); |
439 |
CALL_SUBTEST_3( block(MatrixXcf(3, 3)) ); |
253 |
CALL_SUBTEST_4( block(MatrixXi(8, 12)) ); |
440 |
CALL_SUBTEST_4( block(MatrixXi(8, 12)) ); |
254 |
CALL_SUBTEST_5( block(MatrixXcd(20, 20)) ); |
441 |
CALL_SUBTEST_5( block(MatrixXcd(20, 20)) ); |
255 |
CALL_SUBTEST_6( block(MatrixXf(20, 20)) ); |
442 |
CALL_SUBTEST_6( block(MatrixXf(20, 20)) ); |
256 |
|
443 |
|
257 |
CALL_SUBTEST_8( block(Matrix<float,Dynamic,4>(3, 4)) ); |
444 |
CALL_SUBTEST_8( block(Matrix<float,Dynamic,4>(3, 4)) ); |
258 |
|
445 |
|
|
|
446 |
CALL_SUBTEST_9( check_block_block_fusion(MatrixXi(internal::random(1,50), internal::random(1,50))) ); |
447 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix4i()) ); |
448 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix3i()) ); |
449 |
|
450 |
CALL_SUBTEST_9( check_block_block_fusion(MatrixXd(internal::random(1,50), internal::random(1,50))) ); |
451 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix4d()) ); |
452 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix3d()) ); |
453 |
CALL_SUBTEST_9( check_block_block_fusion(Matrix2d()) ); |
454 |
|
259 |
#ifndef EIGEN_DEFAULT_TO_ROW_MAJOR |
455 |
#ifndef EIGEN_DEFAULT_TO_ROW_MAJOR |
260 |
CALL_SUBTEST_6( data_and_stride(MatrixXf(internal::random(5,50), internal::random(5,50))) ); |
456 |
CALL_SUBTEST_6( data_and_stride(MatrixXf(internal::random(5,50), internal::random(5,50))) ); |
261 |
CALL_SUBTEST_7( data_and_stride(Matrix<int,Dynamic,Dynamic,RowMajor>(internal::random(5,50), internal::random(5,50))) ); |
457 |
CALL_SUBTEST_7( data_and_stride(Matrix<int,Dynamic,Dynamic,RowMajor>(internal::random(5,50), internal::random(5,50))) ); |
262 |
#endif |
458 |
#endif |
263 |
} |
459 |
} |
264 |
} |
460 |
} |