1 // This file is part of Eigen, a lightweight C++ template library
4 // Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr>
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
8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
12 template<typename MatrixType
> void replicate(const MatrixType
& m
)
14 /* this test covers the following files:
17 typedef typename
MatrixType::Index Index
;
18 typedef typename
MatrixType::Scalar Scalar
;
19 typedef Matrix
<Scalar
, MatrixType::RowsAtCompileTime
, 1> VectorType
;
20 typedef Matrix
<Scalar
, Dynamic
, Dynamic
> MatrixX
;
21 typedef Matrix
<Scalar
, Dynamic
, 1> VectorX
;
23 Index rows
= m
.rows();
24 Index cols
= m
.cols();
26 MatrixType m1
= MatrixType::Random(rows
, cols
),
27 m2
= MatrixType::Random(rows
, cols
);
29 VectorType v1
= VectorType::Random(rows
);
34 int f1
= internal::random
<int>(1,10),
35 f2
= internal::random
<int>(1,10);
37 x1
.resize(rows
*f1
,cols
*f2
);
38 for(int j
=0; j
<f2
; j
++)
39 for(int i
=0; i
<f1
; i
++)
40 x1
.block(i
*rows
,j
*cols
,rows
,cols
) = m1
;
41 VERIFY_IS_APPROX(x1
, m1
.replicate(f1
,f2
));
43 x2
.resize(2*rows
,3*cols
);
46 VERIFY_IS_APPROX(x2
, (m2
.template replicate
<2,3>()));
48 x2
.resize(rows
,3*cols
);
50 VERIFY_IS_APPROX(x2
, (m2
.template replicate
<1,3>()));
52 vx1
.resize(3*rows
,cols
);
54 VERIFY_IS_APPROX(vx1
+vx1
, vx1
+(m2
.template replicate
<3,1>()));
56 vx1
=m2
+(m2
.colwise().replicate(1));
59 VERIFY_IS_APPROX(m2
.coeff(0), (m2
.template replicate
<3,1>().coeff(m2
.rows())));
62 for (int j
=0; j
<f1
; ++j
)
64 VERIFY_IS_APPROX(x2
, v1
.rowwise().replicate(f1
));
67 for (int j
=0; j
<f2
; ++j
)
68 vx1
.segment(j
*rows
,rows
) = v1
;
69 VERIFY_IS_APPROX(vx1
, v1
.colwise().replicate(f2
));
72 void test_array_replicate()
74 for(int i
= 0; i
< g_repeat
; i
++) {
75 CALL_SUBTEST_1( replicate(Matrix
<float, 1, 1>()) );
76 CALL_SUBTEST_2( replicate(Vector2f()) );
77 CALL_SUBTEST_3( replicate(Vector3d()) );
78 CALL_SUBTEST_4( replicate(Vector4f()) );
79 CALL_SUBTEST_5( replicate(VectorXf(16)) );
80 CALL_SUBTEST_6( replicate(VectorXcd(10)) );