| 468 | } |
| 469 | |
| 470 | template<typename ArrayType> void array_complex(const ArrayType& m) |
| 471 | { |
| 472 | typedef typename ArrayType::Scalar Scalar; |
| 473 | typedef typename NumTraits<Scalar>::Real RealScalar; |
| 474 | |
| 475 | Index rows = m.rows(); |
| 476 | Index cols = m.cols(); |
| 477 | |
| 478 | ArrayType m1 = ArrayType::Random(rows, cols), |
| 479 | m2(rows, cols), |
| 480 | m4 = m1; |
| 481 | |
| 482 | m4.real() = (m4.real().abs()==RealScalar(0)).select(RealScalar(1),m4.real()); |
| 483 | m4.imag() = (m4.imag().abs()==RealScalar(0)).select(RealScalar(1),m4.imag()); |
| 484 | |
| 485 | Array<RealScalar, -1, -1> m3(rows, cols); |
| 486 | |
| 487 | for (Index i = 0; i < m.rows(); ++i) |
| 488 | for (Index j = 0; j < m.cols(); ++j) |
| 489 | m2(i,j) = sqrt(m1(i,j)); |
| 490 | |
| 491 | // these tests are mostly to check possible compilation issues with free-functions. |
| 492 | VERIFY_IS_APPROX(m1.sin(), sin(m1)); |
| 493 | VERIFY_IS_APPROX(m1.cos(), cos(m1)); |
| 494 | VERIFY_IS_APPROX(m1.tan(), tan(m1)); |
| 495 | VERIFY_IS_APPROX(m1.sinh(), sinh(m1)); |
| 496 | VERIFY_IS_APPROX(m1.cosh(), cosh(m1)); |
| 497 | VERIFY_IS_APPROX(m1.tanh(), tanh(m1)); |
| 498 | VERIFY_IS_APPROX(m1.logistic(), logistic(m1)); |
| 499 | VERIFY_IS_APPROX(m1.arg(), arg(m1)); |
| 500 | VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all()); |
| 501 | VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all()); |
| 502 | VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all()); |
| 503 | VERIFY_IS_APPROX(m4.inverse(), inverse(m4)); |
| 504 | VERIFY_IS_APPROX(m1.log(), log(m1)); |
| 505 | VERIFY_IS_APPROX(m1.log10(), log10(m1)); |
| 506 | VERIFY_IS_APPROX(m1.log2(), log2(m1)); |
| 507 | VERIFY_IS_APPROX(m1.abs(), abs(m1)); |
| 508 | VERIFY_IS_APPROX(m1.abs2(), abs2(m1)); |
| 509 | VERIFY_IS_APPROX(m1.sqrt(), sqrt(m1)); |
| 510 | VERIFY_IS_APPROX(m1.square(), square(m1)); |
| 511 | VERIFY_IS_APPROX(m1.cube(), cube(m1)); |
| 512 | VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval())); |
| 513 | VERIFY_IS_APPROX(m1.sign(), sign(m1)); |
| 514 | |
| 515 | |
| 516 | VERIFY_IS_APPROX(m1.exp() * m2.exp(), exp(m1+m2)); |
| 517 | VERIFY_IS_APPROX(m1.exp(), exp(m1)); |
| 518 | VERIFY_IS_APPROX(m1.exp() / m2.exp(),(m1-m2).exp()); |
| 519 | |
| 520 | VERIFY_IS_APPROX(m1.expm1(), expm1(m1)); |
| 521 | VERIFY_IS_APPROX(expm1(m1), exp(m1) - 1.); |
| 522 | // Check for larger magnitude complex numbers that expm1 matches exp - 1. |
| 523 | VERIFY_IS_APPROX(expm1(10. * m1), exp(10. * m1) - 1.); |
| 524 | |
| 525 | VERIFY_IS_APPROX(sinh(m1), 0.5*(exp(m1)-exp(-m1))); |
| 526 | VERIFY_IS_APPROX(cosh(m1), 0.5*(exp(m1)+exp(-m1))); |
| 527 | VERIFY_IS_APPROX(tanh(m1), (0.5*(exp(m1)-exp(-m1)))/(0.5*(exp(m1)+exp(-m1)))); |