| 318 | } |
| 319 | |
| 320 | template<typename ArrayType> void array_complex(const ArrayType& m) |
| 321 | { |
| 322 | typedef typename ArrayType::Index Index; |
| 323 | typedef typename ArrayType::Scalar Scalar; |
| 324 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 325 | |
| 326 | Index rows = m.rows(); |
| 327 | Index cols = m.cols(); |
| 328 | |
| 329 | ArrayType m1 = ArrayType::Random(rows, cols), |
| 330 | m2(rows, cols), |
| 331 | m4 = m1; |
| 332 | |
| 333 | m4.real() = (m4.real().abs()==RealScalar(0)).select(RealScalar(1),m4.real()); |
| 334 | m4.imag() = (m4.imag().abs()==RealScalar(0)).select(RealScalar(1),m4.imag()); |
| 335 | |
| 336 | Array<RealScalar, -1, -1> m3(rows, cols); |
| 337 | |
| 338 | for (Index i = 0; i < m.rows(); ++i) |
| 339 | for (Index j = 0; j < m.cols(); ++j) |
| 340 | m2(i,j) = sqrt(m1(i,j)); |
| 341 | |
| 342 | // these tests are mostly to check possible compilation issues with free-functions. |
| 343 | VERIFY_IS_APPROX(m1.sin(), sin(m1)); |
| 344 | VERIFY_IS_APPROX(m1.cos(), cos(m1)); |
| 345 | VERIFY_IS_APPROX(m1.tan(), tan(m1)); |
| 346 | VERIFY_IS_APPROX(m1.sinh(), sinh(m1)); |
| 347 | VERIFY_IS_APPROX(m1.cosh(), cosh(m1)); |
| 348 | VERIFY_IS_APPROX(m1.tanh(), tanh(m1)); |
| 349 | VERIFY_IS_APPROX(m1.arg(), arg(m1)); |
| 350 | VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all()); |
| 351 | VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all()); |
| 352 | VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all()); |
| 353 | VERIFY_IS_APPROX(m1.inverse(), inverse(m1)); |
| 354 | VERIFY_IS_APPROX(m1.log(), log(m1)); |
| 355 | VERIFY_IS_APPROX(m1.log10(), log10(m1)); |
| 356 | VERIFY_IS_APPROX(m1.abs(), abs(m1)); |
| 357 | VERIFY_IS_APPROX(m1.abs2(), abs2(m1)); |
| 358 | VERIFY_IS_APPROX(m1.sqrt(), sqrt(m1)); |
| 359 | VERIFY_IS_APPROX(m1.square(), square(m1)); |
| 360 | VERIFY_IS_APPROX(m1.cube(), cube(m1)); |
| 361 | VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); |
| 362 | VERIFY_IS_APPROX(m1.sign(), sign(m1)); |
| 363 | |
| 364 | |
| 365 | VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2)); |
| 366 | VERIFY_IS_APPROX(m1.exp(), exp(m1)); |
| 367 | VERIFY_IS_APPROX(m1.exp() / m2.exp(),(m1-m2).exp()); |
| 368 | |
| 369 | VERIFY_IS_APPROX(sinh(m1), 0.5*(exp(m1)-exp(-m1))); |
| 370 | VERIFY_IS_APPROX(cosh(m1), 0.5*(exp(m1)+exp(-m1))); |
| 371 | VERIFY_IS_APPROX(tanh(m1), (0.5*(exp(m1)-exp(-m1)))/(0.5*(exp(m1)+exp(-m1)))); |
| 372 | |
| 373 | for (Index i = 0; i < m.rows(); ++i) |
| 374 | for (Index j = 0; j < m.cols(); ++j) |
| 375 | m3(i,j) = std::atan2(imag(m1(i,j)), real(m1(i,j))); |
| 376 | VERIFY_IS_APPROX(arg(m1), m3); |
| 377 | |