8
votes

Fonction pour calculer la moyenne d'un tableau double [] à l'aide de l'accumulation

Ce doit être la fonction la plus courante pour ce que tout le monde a un extrait de code quelque part, mais j'ai effectivement dépensé au moins 1,5 heure la recherche de la recherche sur les autres sites C ++ et n'a pas trouvé de solution.

Je voudrais Calculer la moyenne d'un double tableau [] à l'aide d'une fonction . Je voudrais transmettre la matrice à la fonction comme une référence . Il y a des millions d'exemples où la moyenne est calculée dans une boucle principale (), mais ce que je cherche est une fonction ce que je peux mettre dans un fichier externe et l'utiliser à tout moment plus tard.

jusqu'à présent , voici ma dernière version, ce qui donne une erreur de compilation: xxx

L'erreur de compile est:

Erreur C3861: 'Accumuler': identifiant non trouvé

Pouvez-vous me dire comment corriger cette fonction? Que signifie cette erreur compilée?

Si j'utilise std :: accumuler (sur le déjà défini à l'aide de namepace std ), alors je reçois l'erreur suivante: < PRE> XXX

Pourquoi "accumuler" n'est-il pas membre de "STD"?

ps: je sais que je peux faire 'somme + = matrice [i]' Way et ne pas utiliser s'accumuler, mais je voudrais comprendre ce qui se passe ici et comment puis-je faire mon exemple de travail .


5 commentaires

Je ne suis pas sûr, mais je me demandais simplement, avez-vous ajouté le fichier nécessaire?


Soyez prudent: accumulez (tableau, matrice + comptage, 0,0); Notez le 0.0 - Vous accumulez des entiers dans votre extrait de code.


Donc, si je commence par 0,0 ça marche bien? Dois-je passer sur le compte, ou je peux le calculer de taille de taille?


Vous ne pouvez pas utiliser tailleOf (tableau) car la taille de la matrice n'est pas connue. Voir @xanatos Répondez ci-dessous pour une meilleure manière dans ce cas.


Par la façon dont il est bon d'utiliser STD :: accumuler ici. Si votre tableau est très gros, il peut être trivialement parellélisé avec, pour_example, __gnu_parallel :: accumuler.


4 Réponses :


27
votes

essayer d'ajouter xxx pré>

Il apportera la fonction "std :: accumulant" que vous recherchez. P>

aller plus loin, vous allez avoir Un problème pour connaître le nombre d'éléments dans votre tableau. En effet, un tableau ne peut pas être transmis à une fonction dans l'espoir que la fonction sera capable de connaître la taille de la matrice. Il se décomposera à un pointeur. Par conséquent, votre calcul code> code> sera faux. Si vous souhaitez pouvoir passer une matrice spécifiée de taille réelle, vous devez utiliser une fonction modélisée. P>

template <int N>
double mean_array( double ( & array )[N] )
{
    return std::accumulate( array, array + N, 0.0) / (double)(N);
}


3 commentaires

Je ne sais pas si cette fonction modélise peut être appelée dans un procédé de l'objectif-c (wrapper). @ Didier-Trosset: Pouvez-vous élaborer comment le modèle aide avec le compte? Si je dois appeler la fonction C ++ de l'objectif-C où j'ai déjà le compte, seriez-vous d'accord pour dire que la modélisation ne serait plus nécessaire depuis que le compte est passé comme deuxième argument de cette fonction?


@Kushalashok correct. Soit vous passez un pointeur et un nombre à une fonction non modèles; Ou vous n'acceptez que un tableau à une fonction modélisée (qui devinera le compte).


merci de confirmer. J'ai passé le pointeur et comptez et je n'ai pas pu trouver de fuites de mémoire lors de la course à pied des instruments



0
votes
double mean_array( double *array, size_t count )
{
    double sum = 0.0;
    double *pastLast = array + count;

    while (array < pastLast)
    {
        sum += *array;
        array++;
    }

    return sum / count;
}

4 commentaires

Mais je ne comprends pas, ne travaille-t-il pas avec int compte = Tailleof (matrice) / Tailleof (tableau [0]); ?


Quelle partie de si vous passez une matrice à une fonction, vous "perdez" sa taille, vous devez donc la transmettre en tant que paramètre n'est pas clair? Taillef (tableau) est == Taillef (double *) à ce point. La taille de la matrice est perdue si vous le transmettez à une fonction. Si vous ne me faites pas confiance, essayez de le déboguer.


@zsero: Lorsque vous passez un tableau en tant que paramètre de fonction, il se désintègre à un pointeur. Ce n'est plus un type de tableau et "perd" la taille. En règle générale, vous passeriez également la taille en tant que paramètre séparé comme des exemples de Xanatos.


Ok, maintenant c'est clair. Je ne savais pas que ça se désigne à un pointeur. Merci pour le code et l'explication.



2
votes

utiliser std :: accumuler code> Vous devez inclure l'en-tête approprié. Ajoutez les éléments suivants à votre fichier source.

#include <numeric>


1 commentaires

Ok, il semble que ce soit celui que j'avais manqué. J'ai beaucoup d'inclure, j'ai raté celui-là.



3
votes

Ce n'est pas tout à fait la question que vous avez posée, mais il existe un bogue facile à faire dans votre échantillon de code. La valeur initiale dans accumule code> est modélisée et dans votre code son modèle à des entiers. Si vous le transmettez un ensemble de doubles, ceux-ci seront lancés vers des entiers et vous obtiendrez les mauvaises réponses. Après avoir fait cette erreur, je me suis fait une garantie rapide comme suit:

double mean_array( double *array, size_t count )
{
    double sum = accumulate_checked(array,array+count,0.0)
    return sum / count;
}


0 commentaires