Y a-t-il un moyen de calculer la moyenne et l'écart-type pour un vecteur contenant des échantillons en utilisant Boost ?
Ou dois-je créer un accumulateur et y faire passer le vecteur ?
Y a-t-il un moyen de calculer la moyenne et l'écart-type pour un vecteur contenant des échantillons en utilisant Boost ?
Ou dois-je créer un accumulateur et y faire passer le vecteur ?
Ma réponse est similaire à celle de Josh Greifer mais généralisée à la covariance d'échantillon. La variance d'échantillon est simplement la covariance d'échantillon mais avec les deux entrées identiques. Cela inclut la corrélation de Bessel.
template typename Iter::value_type cov(const Iter &x, const Iter &y)
{
double sum_x = std::accumulate(std::begin(x), std::end(x), 0.0);
double sum_y = std::accumulate(std::begin(y), std::end(y), 0.0);
double mx = sum_x / x.size();
double my = sum_y / y.size();
double accum = 0.0;
for (auto i = 0; i < x.size(); i++)
{
accum += (x.at(i) - mx) * (y.at(i) - my);
}
return accum / (x.size() - 1);
}
2x plus rapide que les versions précédentes mentionnées - principalement parce que les boucles transform() et inner_product() sont combinées. Désolé pour mes raccourcis/typedefs/macro : Flo = flottant. CR const ref. VFlo - vecteur. Testé dans VS2010
#define fe(EL, CONTAINER) for each (auto EL in CONTAINER) //VS2010
Flo stdDev(VFlo CR crVec) {
SZ n = crVec.size(); if (n < 2) return 0.0f;
Flo fSqSum = 0.0f, fSum = 0.0f;
fe(f, crVec) fSqSum += f * f; // EDIT: was Cit(VFlo, crVec) {
fe(f, crVec) fSum += f;
Flo fSumSq = fSum * fSum;
Flo fSumSqDivN = fSumSq / n;
Flo fSubSqSum = fSqSum - fSumSqDivN;
Flo fPreSqrt = fSubSqSum / (n - 1);
return sqrt(fPreSqrt);
}
Le boucle Cit() peut-elle être écrite comme for( float f : crVec ) { fSqSum += f * f; fSum += f; }
?
Oui en C ++11. Essayer d'utiliser des macros qui le rendent indépendant de la version. Code mis à jour. PS. Pour la lisibilité, je préfère généralement 1 action par ligne de code. Le compilateur devrait voir que ce sont des itérations constantes et les fusionne s'il "pense" qu'il est plus rapide d'itérer une fois. Faire cela par petits pas (sans utiliser std:: inner_product () par exemple), un peu comme en assembleur, explique au nouveau lecteur ce que cela signifie. Le binaire sera plus petit en conséquence (dans certains cas).
"Essayer d'utiliser des macros qui le rendent indépendant de la version" - pourtant, vous vous limitez à la construction non standard "for each" de Visual C++ (stackoverflow.com/questions/197375/…)
Créez votre propre conteneur :
template
class statList : public std::list
{
public:
statList() : std::list::list() {}
~statList() {}
T mean() {
return accumulate(begin(),end(),0.0)/size();
}
T stddev() {
T diff_sum = 0;
T m = mean();
for(iterator it= begin(); it != end(); ++it)
diff_sum += ((*it - m)*(*it -m));
return diff_sum/size();
}
};
Il a certaines limitations, mais il fonctionne parfaitement lorsque vous savez ce que vous faites.
Pour répondre à la question: car il n'y a absolument aucun besoin. Créer votre propre conteneur n'a absolument aucun avantage par rapport à l'écriture d'une fonction libre.
Je ne sais même pas par où commencer avec cela. Vous utilisez une liste comme structure de données sous-jacente, vous ne mettez même pas en cache les valeurs, ce qui serait l'une des rares raisons auxquelles je pourrais penser d'utiliser une structure de type conteneur. Surtout si les valeurs changent rarement et que la moyenne/l'écart type sont souvent nécessaires.
//signifie écart en c++
/Un écart qui est une différence entre une valeur observée et la vraie valeur d'une quantité d'intérêt (comme une moyenne de population) est une erreur et un écart qui est la différence entre la valeur observée et une estimation de la vraie valeur (une telle estimation peut être une moyenne d'échantillon) est un résidu. Ces concepts sont applicables aux données aux niveaux de mesure intervalle et ratio./
#include
#include
using namespace std;
/* exécutez ce programme en utilisant la console pauser ou ajoutez votre propre getch, system("pause") ou boucle d'entrée */
int main(int argc, char** argv)
{
int i,cnt;
cout<<"s'il vous plaît entrer le compte:\t";
cin>>cnt;
float *num=new float [cnt];
float *s=new float [cnt];
float sum=0,ave,M,M_D;
for(i=0;i>num[i];
sum+=num[i];
}
ave=sum/cnt;
for(i=0;i
`
}
`
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Pour une solution en une seule passe, consultez stackoverflow.com/questions/7616511/…