هل من الممكن استخدام دفعة بطاريات مع النواقل ؟
-
29-09-2019 - |
سؤال
أردت أن زيادة استخدام بطاريات لحساب الإحصائيات متغير وهذا هو متجه.هناك طريقة بسيطة للقيام بذلك.لا اعتقد انه من الممكن استخدام أغبى شيء:
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 );