Ошибка в смежных взглядах броненосца?

Я столкнулся с очень странным поведением броненосца с использованием метода 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.

0 ответов

Другие вопросы по тегам