Ошибка в смежных взглядах броненосца?
Я столкнулся с очень странным поведением броненосца с использованием метода subvec.
Вот короткий фрагмент, иллюстрирующий проблему. Возникает в рамках обычая operator()
метод, используемый boost::numeric::odeint
, X
является вектором столбца длиной 156.
void operator()(const arma::vec & X , arma::vec & dxdt , const double t){
std::cout << X << std::endl; // OK, prints the correct X
std::cout << X.subvec(0,8) << std::endl; // OK, prints the correct subvector of X
std::cout << X.subvec(0,9) << std::endl; // NOT OK. All sub-vector
// values are spurious, like 1e-314
}
Доступ к элементам с 0-го по 8-й работает нормально, но доступ с 0-го по 9-й портит весь подвектор.
С какой стати подвекторный взгляд так и не сработает?
Обратите внимание, что прямо перед operator ()
называется, resize_impl
как определено ниже, вызывается на X
( см. ответ на этот вопрос)
namespace boost {
namespace numeric {
namespace odeint {
template <>
struct is_resizeable<arma::vec>{
typedef boost::true_type type;
const static bool value = type::value;
};
template <>
struct same_size_impl<arma::vec, arma::vec>{
static bool same_size(const arma::vec & x, const arma::vec& y){
return x.n_rows == y.n_rows;
}
};
template<>
struct resize_impl<arma::vec, arma::vec>{
static void resize(arma::vec & v1, const arma::vec& v2){
v1 = arma::reshape(v1,v2.n_rows,1);
}
};
}
}
} // namespace boost::numeric::odeint
#endif
редактировать: кажется, что ошибка возникает, когда извлеченный фрагмент имеет длину, строго превышающую 9.