52 const double epsilon = 1.0e-6) {
53 Eigen::JacobiSVD<Eigen::Matrix<T, N, N>> svd(
54 m, Eigen::ComputeFullU | Eigen::ComputeFullV);
55 return static_cast<Eigen::Matrix<T, N, N>
>(
57 (svd.singularValues().array().abs() > epsilon)
58 .select(svd.singularValues().array().inverse(), 0)
61 svd.matrixU().adjoint());
99 const Eigen::Matrix<T, L, N> &m_b,
100 const Eigen::Matrix<T, O, L> &m_c,
101 const Eigen::Matrix<T, O, N> &m_d,
const double ts,
102 Eigen::Matrix<T, L, L> *ptr_a_d,
103 Eigen::Matrix<T, L, N> *ptr_b_d,
104 Eigen::Matrix<T, O, L> *ptr_c_d,
105 Eigen::Matrix<T, O, N> *ptr_d_d) {
107 AERROR <<
"ContinuousToDiscrete : ts is less than or equal to zero";
113 if (m_a.rows() == 0) {
114 AERROR <<
"ContinuousToDiscrete: matrix_a size 0 ";
118 Eigen::Matrix<T, L, L> m_identity = Eigen::Matrix<T, L, L>::Identity();
119 *ptr_a_d = PseudoInverse<T, L>(m_identity - ts * 0.5 * m_a) *
120 (m_identity + ts * 0.5 * m_a);
123 std::sqrt(ts) * PseudoInverse<T, L>(m_identity - ts * 0.5 * m_a) * m_b;
126 std::sqrt(ts) * m_c * PseudoInverse<T, L>(m_identity - ts * 0.5 * m_a);
129 0.5 * m_c * PseudoInverse<T, L>(m_identity - ts * 0.5 * m_a) * m_b + m_d;
143 std::vector<T> *data, std::vector<D> *indices,
144 std::vector<D> *indptr) {
145 static constexpr double epsilon = 1e-9;
147 for (
int c = 0; c < dense_matrix.cols(); ++c) {
148 indptr->emplace_back(data_count);
149 for (
int r = 0; r < dense_matrix.rows(); ++r) {
150 if (std::fabs(dense_matrix(r, c)) < epsilon) {
153 data->emplace_back(dense_matrix(r, c));
155 indices->emplace_back(r);
158 indptr->emplace_back(data_count);
bool ContinuousToDiscrete(const Eigen::MatrixXd &m_a, const Eigen::MatrixXd &m_b, const Eigen::MatrixXd &m_c, const Eigen::MatrixXd &m_d, const double ts, Eigen::MatrixXd *ptr_a_d, Eigen::MatrixXd *ptr_b_d, Eigen::MatrixXd *ptr_c_d, Eigen::MatrixXd *ptr_d_d)
Eigen::Matrix< T, N, N > PseudoInverse(const Eigen::Matrix< T, N, N > &m, const double epsilon=1.0e-6)
Computes the Moore-Penrose pseudo-inverse of a given square matrix, rounding all eigenvalues with abs...