سؤال

أردت أن زيادة استخدام بطاريات لحساب الإحصائيات متغير وهذا هو متجه.هناك طريقة بسيطة للقيام بذلك.لا اعتقد انه من الممكن استخدام أغبى شيء:

  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

ما أردته هو أن يكون هناك تراكم من شأنها أن حساب المتجهات وهو يعني من مكونات العديد من النواقل.هل هناك طريقة سهلة ؟

تحرير:

أنا لا أعرف إذا كنت بدقة واضحة.أنا لا أريد هذا:

 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);

وأريد يعني(acc) أن يكون ناقل نفسها ، والتي دخول [أنا] من شأنه أن يكون وسيلة من الإدخالات [أنا] المتراكمة ناقلات.

هناك تلميح عن هذا في مستندات من دفعة, ولكن لا شيء صريح.أنا بت غبية.:P

هل كانت مفيدة؟

المحلول

لقد بحثت في سؤالك قليلا و يبدو لي أن دفعة.بطاريات تقدم بالفعل الدعم std::vector.هنا هو ما يمكن أن تجد في قسم من دليل المستخدم :

مثال آخر حيث الرقمية مشغلي Sub-مكتبة مفيد هو عندما اكتب لا يعرف مشغل الزائدة المطلوبة لاستخدامه بعض الحسابات الإحصائية. فعلى سبيل المثال ، std::vector<> لا تفرط في أي العوامل الحسابية, بعد قد يكون من المفيد استخدام std::vector<> كما عينة أو variate نوع.على الرقمية مشغلي الفرعية مكتبة يعرف يلزم المشغل الزائدة في على 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;.

هناك واحد فقط التفاصيل اليسرى :تنفيذ كسر في وقت التشغيل لأن الأولي المتراكمة القيمة الافتراضية-التي شيدت ، وتأكيد سوف تحدث عند محاولة إضافة متجه من حجم n فارغة ناقلات.لهذا يبدو أنك يجب تهيئة المجمع مع (حيث n هو عدد العناصر في ناقلات) :

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);
}

وأعتقد أن هذا هو ما تريد ؟

نصائح أخرى

أنا لم يكن لديك اقامة في محاولة الآن ، ولكن إذا كان كل دفعة::بطاريات تحتاج بشكل صحيح تعريف الحسابية, ثم كنت قد تكون قادرة على الابتعاد مع مختلف نوع ناقل: http://www.boost.org/doc/libs/1_37_0/libs/numeric/ublas/doc/vector.htm

و ماذا عن الوثائق?

// 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 );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top