2017-01-30 1 views
0

En raison de dépendances externes, je dois écrire certaines données dans un conteneur .Quand utiliser Eigen :: Vector vs std :: vector?

Cependant, il y a d'autres moments où je ne suis pas obligée d'utiliser en comme récipient, et je peux utiliser une norme std::vector<int>

Actuellement, j'ai Eigen et std vecteurs parsemés à travers mon code. La seule fois où je décide d'utiliser un std:vector est quand je vais faire des insertions à la volée, depuis Redimensionnement et plus fastidieux est réintroduire (et peut-être cher informatiquement) que d'utiliser push_back(<value>)

Je voudrais être sûr que j'utilise l'un ou l'autre au bon moment, au lieu de choisir au hasard. Quelles sont les bonnes instances pour utiliser Eigen::Vector au lieu de std::vector?

Répondre

0

Les classes dans Eigen représentent des objets mathématiques. Dans ce cas, un vecteur mathématique, avec toutes les opérations typiques sur les vecteurs, comme la multiplication avec une matrice ou un produit scalaire. Std :: vector est essentiellement un tableau (dynamique), stockant une liste de données dans un espace consécutif. Les opérations typiques consistent à ajouter des données ou à les trier. Lorsque vous décidez de ce que vous voulez utiliser, demandez-vous simplement s'il s'agit d'un vecteur mathématique. Vous pouvez étendre les deux pour tenir ce que l'autre est censé faire, en créant un produit scalaire sur std :: vector, mais pourquoi le feriez-vous? Eigen le fait déjà. En l'utilisant pour ce qu'il est prévu, il clarifie à tout le monde ce que vous représentez, en augmentant la lisibilité.

+0

La bibliothèque que j'utilise (libigl) ne suit pas cette prémisse. Je pense est destiné à rendre le cache plus convivial et la mémoire efficace. Existe-t-il des différences fondamentales dans la mémoire, la vitesse d'accès entre le vecteur Eigen et le vecteur std? (Je suis d'accord que la lisibilité est un grand plus) – Javier

+0

@Javier Il est sûr de supposer que les méthodes que les deux fournissent sont écrites efficacement, ce qui signifie que chacun est fort sur toutes les méthodes qu'il fournit. Si nous parlons d'accès, cela devrait être efficace dans les deux cas. Si vous travaillez avec des données fragmentées, Eigen est plus efficace en mémoire, car il a une classe de vecteurs clairsemée. std :: vector stockera les données denses, étant consécutives. – Aziuth

+0

Eigen implémente des opérations vectorisées sur ses structures de données. Donc, si vos données vont passer par des opérations mathématiques, Eigen est probablement ce que vous voulez. – daragua