本文整理汇总了C++中VectorNd::set_sub_vec方法的典型用法代码示例。如果您正苦于以下问题:C++ VectorNd::set_sub_vec方法的具体用法?C++ VectorNd::set_sub_vec怎么用?C++ VectorNd::set_sub_vec使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类VectorNd
的用法示例。
在下文中一共展示了VectorNd::set_sub_vec方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: solve_nqp_work
/**
* \param x the solution is returned here; zeros will be returned at appropriate indices for inactive contacts
*/
void ImpactConstraintHandler::solve_nqp_work(UnilateralConstraintProblemData& q, VectorNd& x)
{
const double INF = std::numeric_limits<double>::max();
// setup constants
const unsigned N_CONTACTS = q.N_CONTACTS;
const unsigned N_LIMITS = q.N_LIMITS;
const unsigned N_CONSTRAINT_EQNS_IMP = q.N_CONSTRAINT_EQNS_IMP;
const unsigned CN_IDX = 0;
const unsigned CS_IDX = N_CONTACTS;
const unsigned CT_IDX = CS_IDX + N_CONTACTS;
const unsigned CL_IDX = CT_IDX + N_CONTACTS;
const unsigned NVARS = N_LIMITS + CL_IDX;
// setup the optimization data
_ipsolver->epd = &q;
_ipsolver->mu_c.resize(N_CONTACTS);
_ipsolver->mu_visc.resize(N_CONTACTS);
// setup true friction cone for every contact
for (unsigned i=0; i< N_CONTACTS; i++)
{
_ipsolver->mu_c[i] = sqr(q.contact_constraints[i]->contact_mu_coulomb);
_ipsolver->mu_visc[i] = (sqr(q.Cs_v[i]) + sqr(q.Ct_v[i])) *
sqr(q.contact_constraints[i]->contact_mu_viscous);
}
// setup matrices
MatrixNd& R = _ipsolver->R;
MatrixNd& H = _ipsolver->H;
VectorNd& c = _ipsolver->c;
VectorNd& z = _ipsolver->z;
// init z (particular solution)
z.set_zero(NVARS);
// first, compute the appropriate nullspace
if (N_CONSTRAINT_EQNS_IMP > 0)
{
// compute the homogeneous solution
_A = q.Jx_iM_JxT;
(_workv = q.Jx_v).negate();
try
{
_LA.solve_LS_fast1(_A, _workv);
}
catch (NumericalException e)
{
_A = q.Jx_iM_JxT;
_LA.solve_LS_fast2(_A, _workv);
}
z.set_sub_vec(q.ALPHA_X_IDX, _workv);
// setup blocks of A
_A.resize(N_CONSTRAINT_EQNS_IMP, NVARS);
SharedMatrixNd b1 = _A.block(0, N_CONSTRAINT_EQNS_IMP, 0, N_CONTACTS);
SharedMatrixNd b2 = _A.block(0, N_CONSTRAINT_EQNS_IMP, N_CONTACTS, N_CONTACTS*2);
SharedMatrixNd b3 = _A.block(0, N_CONSTRAINT_EQNS_IMP, N_CONTACTS*2, N_CONTACTS*3);
SharedMatrixNd b4 = _A.block(0, N_CONSTRAINT_EQNS_IMP, N_CONTACTS*3, N_CONTACTS*3+N_LIMITS);
// compute the nullspace
MatrixNd::transpose(q.Cn_iM_JxT, b1);
MatrixNd::transpose(q.Cs_iM_JxT, b2);
MatrixNd::transpose(q.Ct_iM_JxT, b3);
MatrixNd::transpose(q.L_iM_JxT, b4);
_LA.nullspace(_A, R);
}
else
// clear the nullspace
R.resize(0,0);
// get number of qp variables
const unsigned N_PRIMAL = (R.columns() > 0) ? R.columns() : NVARS;
// setup number of nonlinear inequality constraints
const unsigned NONLIN_INEQUAL = N_CONTACTS;
// init the QP matrix and vector
H.resize(N_PRIMAL, N_PRIMAL);
c.resize(H.rows());
// setup row (block) 1 -- Cn * iM * [Cn' Cs Ct' L']
unsigned col_start = 0, col_end = N_CONTACTS;
unsigned row_start = 0, row_end = N_CONTACTS;
SharedMatrixNd Cn_iM_CnT = H.block(row_start, row_end, col_start, col_end);
col_start = col_end; col_end += N_CONTACTS;
SharedMatrixNd Cn_iM_CsT = H.block(row_start, row_end, col_start, col_end);
col_start = col_end; col_end += N_CONTACTS;
SharedMatrixNd Cn_iM_CtT = H.block(row_start, row_end, col_start, col_end);
col_start = col_end; col_end += N_LIMITS;
SharedMatrixNd Cn_iM_LT = H.block(row_start, row_end, col_start, col_end);
// setup row (block) 2 -- Cs * iM * [Cn' Cs' Ct' L']
row_start = row_end; row_end += N_CONTACTS;
col_start = 0; col_end = N_CONTACTS;
SharedMatrixNd Cs_iM_CnT = H.block(row_start, row_end, col_start, col_end);
col_start = col_end; col_end += N_CONTACTS;
//.........这里部分代码省略.........