2010-07-19 9 views
2

J'utilise le conteneur vectoriel pour stocker un tableau de doubles. Y a-t-il un moyen rapide de multiplier chaque élément de mon vecteur par un scalaire sans utiliser de boucle.Effectuer une opération vectorielle

Par exemple:

vector<double> Array(10,1); 

initialisera un tableau de 10 doubles avec valeur initiale 1. Pour multiplier ce tableau de 0,5 Je voudrais écrire:

for(unsigned int i=0; i<Array.size(); i++) 
    Array[i] = 0.5*Array[i]; 

Y at-il une autre façon il? Je l'ai utilisé valarray qui surchargent le « * » opérateur de sorte que:

 Array = 0.5 * Array; 

est valide, mais je préfère ne pas utiliser valarray car il semble que le conteneur vectoriel est une approche standard plus pour manipuler des tableaux.

Merci!

Répondre

10

Vous pouvez le faire:

std::transform(Array.begin(), Array.end(), Array.begin(), 
       std::bind2nd(std::multiplies<double>(), 0.5)); 

En réponse à obtenir la somme des éléments:

double sum = std::accumulate(Array.begin(), Array.end(), 0.0); 

Et en réponse à obtenir sqrt « ing chaque élément:

std::transform(Array.begin(), Array.end(), Array.begin(), 
       static_cast<double (*)(double)>(std::sqrt)); 

Cette distribution est de sélectionner la surcharge correcte.

+0

Merci, je suppose qu'il y a une fonction pour obtenir la somme des éléments dans un vecteur? – Wawel100

+1

@ Wawel100: Oui, je l'ai ajouté.Si vous avez trouvé une réponse à votre problème, cliquez sur la coche correspondante. – GManNickG

+0

Merci! Juste une dernière question: comment utiliser transform pour obtenir la racine sqrt de chaque élément? – Wawel100

0

comme je sais qu'il n'y en a pas.

s'il y en a un, il encapsule probablement cette boucle pour vous. donc je ne pense pas que la performance changerait.

1

Vous pouvez utiliser std :: transform:

std::transform(Array.begin(), Array.end(), Array.begin(), std::bind1st(std::multiplies<double>(), 0.5))); 
+0

ne serait-ce pas une boucle cachée par stl? – sum1stolemyname

+2

Bien sûr. Que pensez-vous de Valarray? –

1

Le vecteur STL lui-même ne permet pas de mise à l'échelle en une seule par éléments opération.

Vous pourriez envelopper votre vecteur avec un décorateur qui applique un facteur d'échelle. L'application d'un nouveau facteur serait O (1) quelle que soit la taille du vecteur. Cela ne vient pas gratuitement car les inconvénients sont une complexité accrue et un accès un peu plus grand par élément.

0

Pensez à utiliser un std::valarray car c'est un choix plus approprié.

Il existe une raison pour laquelle la bibliothèque standard fournit une grande variété de conteneurs. Il permet au développeur d'utiliser "chevaux pour les cours".

Le std::vector est le conteneur le plus simple et en tant que tel est le meilleur choix pour de nombreux cas. Cependant, pour des cas spécifiques, la fonctionnalité ajoutée d'un autre type de conteneur peut faire de ce type un meilleur choix. Cela peut être un tel cas, où la manipulation numérique des membres du groupe est mieux traitée par le std::valarray.

+1

Eh bien, il a dit dans la question qu'il préférait ne pas. :) – GManNickG

+0

J'ai développé la réponse pour répondre aux critiques valables faites dans les commentaires. –

Questions connexes