2010-11-30 3 views
13

Я хотел использовать импульсные аккумуляторы для вычисления статистики переменной, которая является вектором. Есть простой способ сделать это. Я думаю, что невозможно использовать самую тупую вещь:Можно ли использовать импульсные аккумуляторы с векторами?

using namespace boost::accumulators; 
    //stuff... 

    accumulator_set<vector<double>, stats<tag::mean> > acc; 
    vector<double> some_vetor; 
    //stuff 
    some_vector = doStuff(); 
    acc(some_vector); 

Возможно, это очевидно, но я все равно попытался. : P

Я хотел бы иметь аккумулятор, который будет вычислять вектор, являющийся средним компонентом многих векторов. Есть ли легкий выход?

EDIT:

Я не знаю, если бы я был полностью ясно. Я не хочу этого:

for_each(vec.begin(), vec.end(),acc); 

Это вычислило бы среднее значение элементов данного вектора. Мне нужно другое. У меня есть функция, которая будет плеваться векторов:

vector<double> doSomething(); 
// this is a monte carlo simulation; 

И мне нужно, чтобы запустить это много раз и вычислить векторную означают этих векторов:

for(int i = 0; i < numberOfMCSteps; i++){ 
    vec = doSomething(); 
    acc(vec); 
    } 
    cout << mean(acc); 

И я хочу, имею в виду (в соотв) с быть самим вектором, чей вход [i] был бы средством записей [i] накопленных векторов.

Theres намек об этом в документах Boost, но ничего конкретного. И я немного тупой. : P

+1

Разум взорван. Я использовал Boost Accumulator совсем немного и никогда не подходил к тому, что он поддерживает нескалярные типы образцов. – sehe 2014-09-03 09:10:05

ответ

9

Я посмотрел на свой вопрос немного, и мне кажется, что Boost.Accumulators уже обеспечивает поддержку std::vector. Вот то, что я мог бы найти в a section of the user's guide:

Другой пример, где Числовой операторы Sub-библиотека полезна , когда тип не определяет оператора перегрузки, необходимые для использования его для некоторых статистических расчетов. Например, std::vector<> не перегружает любые арифметические операторы, но может быть полезным использовать std::vector<> в качестве образца или типоразмера. В Числовые операторы Суб-библиотека определяет необходимые оператора перегрузки в boost::numeric::operators пространства имен, которое приведено в рамки Рамками Аккумуляторы с использованием директивы.

Действительно, после проверки, файл boost/accumulators/numeric/functional/vector.hppделает содержат необходимые операторы для «наивное» решения для работы.

Я считаю, что вы должны попробовать:

  • Включая либо
    • boost/accumulators/numeric/functional/vector.hpp перед любыми другими аккумуляторами заголовка
    • boost/accumulators/numeric/functional.hpp при определении BOOST_NUMERIC_FUNCTIONAL_STD_VECTOR_SUPPORT
  • Приведение операторов в область видимости с using namespace boost::numeric::operators; ,

Там только одна последняя деталь слева: выполнение сломается во время выполнения, поскольку начальное накопленное значение по умолчанию, возведенные, и утверждение будет происходить при попытке добавить вектор размера п к пустому вектору. Для этого, мне кажется, вы должны инициализировать аккумулятор с (где п является количество элементов в вашем вектора):

accumulator_set<std::vector<double>, stats<tag::mean> > acc(std::vector<double>(n)); 

Я попытался следующий код, mean дает мне std::vector размера 2:

int main() 
{ 
    accumulator_set<std::vector<double>, stats<tag::mean> > acc(std::vector<double>(2)); 

    const std::vector<double> v1 = boost::assign::list_of(1.)(2.); 
    const std::vector<double> v2 = boost::assign::list_of(2.)(3.); 
    const std::vector<double> v3 = boost::assign::list_of(3.)(4.); 
    acc(v1); 
    acc(v2); 
    acc(v3); 

    const std::vector<double> &meanVector = mean(acc); 
} 

Я считаю, что это то, что вы хотели?

2

У меня нет его настроить, чтобы попробовать прямо сейчас, но если все повышение :: аккумуляторы необходимо правильно определить математические операторы, то вы можете быть в состоянии уйти с другим типом вектора: http://www.boost.org/doc/libs/1_37_0/libs/numeric/ublas/doc/vector.htm

+0

Возможно, это путь. Но я получаю ошибку рассогласования размера с помощью ublas :: vector. Но спасибо, наверное, это сработает. – 2010-12-01 11:28:11

+1

Я пытаюсь получить помощь в сообществе boost :: ublas. Если мне удастся это сделать, я отправлю решение здесь. – 2010-12-02 12:35:49

-3

А как насчет documentation?

// The data for which we wish to calculate statistical properties: 
std::vector<double> data(/* stuff */); 

// The accumulator set which will calculate the properties for us:  
accumulator_set< double, features< tag::min, tag::mean > > acc; 

// Use std::for_each to accumulate the statistical properties: 
acc = std::for_each(data.begin(), data.end(), acc); 
+1

Я думаю, что он хочет вектор средств для кучи векторов, а не одно значение для одного вектора, но я могу ошибаться. – Eclipse 2010-11-30 18:21:43

Смежные вопросы