39 assert(A.rows() == C.cols());
42 if (n < 1 || p < 1)
return false;
44 Eigen::MatrixXd observ_mat(n * p, n);
46 observ_mat.topRows(p) = C;
47 if (n > 1) observ_mat.middleRows(p, p) = C *
A;
51 Eigen::MatrixXd A_aux =
A;
52 int current_row = 2 * p;
53 for (
int i = 2; i <
n; ++i)
56 observ_mat.middleRows(current_row, p) = C * A_aux;
66 int observ_mat_rank = decomp.
rank();
67 if (rank) *rank = observ_mat_rank;
68 return (observ_mat_rank == n);
bool is_square(const Eigen::MatrixBase< Derived > &matrix)
Determine if a given matrix is square.
MatrixType A(a, *n, *n, *lda)
Householder rank-revealing QR decomposition of a matrix with column-pivoting.
static bool checkLinearTimeInvariantSystem(const Eigen::Ref< const Eigen::MatrixXd > &A, const Eigen::Ref< const Eigen::MatrixXd > &C, int *rank=nullptr)
Check observability of linear time invariant system.
A matrix or vector expression mapping an existing expression.