1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_NO_STATIC_ASSERT
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h"
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ArrayType> void vectorwiseop_array(const ArrayType& m)
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename ArrayType::Index Index;
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename ArrayType::Scalar Scalar;
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Array<Scalar, ArrayType::RowsAtCompileTime, 1> ColVectorType;
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Array<Scalar, 1, ArrayType::ColsAtCompileTime> RowVectorType;
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows = m.rows();
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index cols = m.cols();
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index r = internal::random<Index>(0, rows-1),
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        c = internal::random<Index>(0, cols-1);
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  ArrayType m1 = ArrayType::Random(rows, cols),
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            m2(rows, cols),
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            m3(rows, cols);
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  ColVectorType colvec = ColVectorType::Random(rows);
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  RowVectorType rowvec = RowVectorType::Random(cols);
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // test addition
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.colwise() += colvec;
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.colwise() + colvec);
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec);
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.colwise() += colvec.transpose());
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.colwise() + colvec.transpose());
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.rowwise() += rowvec;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec);
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec);
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.rowwise() += rowvec.transpose());
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.rowwise() + rowvec.transpose());
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // test substraction
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.colwise() -= colvec;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.colwise() - colvec);
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec);
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.colwise() -= colvec.transpose());
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.colwise() - colvec.transpose());
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.rowwise() -= rowvec;
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec);
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec);
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.rowwise() -= rowvec.transpose());
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.rowwise() - rowvec.transpose());
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // test multiplication
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.colwise() *= colvec;
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.colwise() * colvec);
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.col(c), m1.col(c) * colvec);
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.colwise() *= colvec.transpose());
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.colwise() * colvec.transpose());
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.rowwise() *= rowvec;
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.rowwise() * rowvec);
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.row(r), m1.row(r) * rowvec);
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.rowwise() *= rowvec.transpose());
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.rowwise() * rowvec.transpose());
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // test quotient
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.colwise() /= colvec;
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.colwise() / colvec);
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.col(c), m1.col(c) / colvec);
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.colwise() /= colvec.transpose());
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.colwise() / colvec.transpose());
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.rowwise() /= rowvec;
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.rowwise() / rowvec);
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.row(r), m1.row(r) / rowvec);
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.rowwise() /= rowvec.transpose());
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.rowwise() / rowvec.transpose());
1047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2 = m1;
1067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // yes, there might be an aliasing issue there but ".rowwise() /="
1077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // is suppposed to evaluate " m2.colwise().sum()" into to temporary to avoid
1087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // evaluating the reducions multiple times
1097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if(ArrayType::RowsAtCompileTime>2 || ArrayType::RowsAtCompileTime==Dynamic)
1107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
1117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    m2.rowwise() /= m2.colwise().sum();
1127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    VERIFY_IS_APPROX(m2, m1.rowwise() / m1.colwise().sum());
1137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  }
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> void vectorwiseop_matrix(const MatrixType& m)
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Index Index;
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Scalar Scalar;
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename NumTraits<Scalar>::Real RealScalar;
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Scalar, MatrixType::RowsAtCompileTime, 1> ColVectorType;
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Scalar, 1, MatrixType::ColsAtCompileTime> RowVectorType;
1237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  typedef Matrix<RealScalar, MatrixType::RowsAtCompileTime, 1> RealColVectorType;
1247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  typedef Matrix<RealScalar, 1, MatrixType::ColsAtCompileTime> RealRowVectorType;
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows = m.rows();
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index cols = m.cols();
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index r = internal::random<Index>(0, rows-1),
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        c = internal::random<Index>(0, cols-1);
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType m1 = MatrixType::Random(rows, cols),
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            m2(rows, cols),
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            m3(rows, cols);
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  ColVectorType colvec = ColVectorType::Random(rows);
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  RowVectorType rowvec = RowVectorType::Random(cols);
1377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  RealColVectorType rcres;
1387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  RealRowVectorType rrres;
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // test addition
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.colwise() += colvec;
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.colwise() + colvec);
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.col(c), m1.col(c) + colvec);
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.colwise() += colvec.transpose());
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.colwise() + colvec.transpose());
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.rowwise() += rowvec;
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.rowwise() + rowvec);
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.row(r), m1.row(r) + rowvec);
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.rowwise() += rowvec.transpose());
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.rowwise() + rowvec.transpose());
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // test substraction
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.colwise() -= colvec;
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.colwise() - colvec);
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.col(c), m1.col(c) - colvec);
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.colwise() -= colvec.transpose());
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.colwise() - colvec.transpose());
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2 = m1;
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  m2.rowwise() -= rowvec;
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2, m1.rowwise() - rowvec);
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(m2.row(r), m1.row(r) - rowvec);
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m2.rowwise() -= rowvec.transpose());
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_RAISES_ASSERT(m1.rowwise() - rowvec.transpose());
1757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // test norm
1777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  rrres = m1.colwise().norm();
1787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX(rrres(c), m1.col(c).norm());
1797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  rcres = m1.rowwise().norm();
1807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX(rcres(r), m1.row(r).norm());
1817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // test normalized
1837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2 = m1.colwise().normalized();
1847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX(m2.col(c), m1.col(c).normalized());
1857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2 = m1.rowwise().normalized();
1867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX(m2.row(r), m1.row(r).normalized());
1877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // test normalize
1897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2 = m1;
1907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2.colwise().normalize();
1917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX(m2.col(c), m1.col(c).normalized());
1927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2 = m1;
1937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  m2.rowwise().normalize();
1947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  VERIFY_IS_APPROX(m2.row(r), m1.row(r).normalized());
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_vectorwiseop()
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(vectorwiseop_array(Array22cd()));
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_2(vectorwiseop_array(Array<double, 3, 2>()));
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(vectorwiseop_array(ArrayXXf(3, 4)));
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_4(vectorwiseop_matrix(Matrix4cf()));
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_5(vectorwiseop_matrix(Matrix<float,4,5>()));
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_6(vectorwiseop_matrix(MatrixXd(7,2)));
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
206