Eigen MatrixXd repousser en c++
Eigen est bien connu de la matrice de la Bibliothèque en c++. J'ai de la difficulté à trouver un construit en fonction, appuyez simplement sur un élément à la fin d'une matrice. Actuellement, je sais que cela peut être fait comme ceci:
Eigen::MatrixXd matrix(10, 3);
long int count = 0;
long int topCount = 10;
for (int i = 0; i < listLength; ++i) {
matrix(count, 0) = list.x;
matrix(count, 1) = list.y;
matrix(count, 2) = list.z;
count++;
if (count == topCount) {
topCount *= 2;
matrix.conservativeResize(topCount, 3);
}
}
matrix.conservativeResize(count, 3);
Et que cela fonctionne (certains de la syntaxe peut être). Mais c'est assez alambiqué pour une chose si simple à faire. Il y a déjà un dans la construction de la fonction?
OriginalL'auteur Fantastic Mr Fox | 2013-01-02
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas une telle fonction pour Propres des matrices. La raison pour cela est une telle fonction pourrait être très lente ou de l'utilisation excessive de la mémoire.
Pour un
push_back
fonction de ne pas être très cher, il faut augmenter la matrice de la capacité par un certain facteur quand il manque de l'espace comme vous l'avez fait. Cependant lorsque l'on traite avec des matrices, l'utilisation de la mémoire est souvent un sujet de préoccupation afin d'avoir une matrice de la capacité d'être plus grande que nécessaire pourrait être problématique.Si au contraire augmenté la taille par
rows()
oucols()
chaque fois que l'opération seraitO(n*m)
. Faire cela de remplir une matrice entière seraitO(n*n*m*m)
qui, même de taille moyenne matrices serait assez lent.En outre, dans l'algèbre linéaire de la matrice et vecteur tailles sont presque toujours constant et connu à l'avance. Souvent, quand resizeing une matrice de vous ne se soucient pas de la précédente valeurs dans la matrice. C'est pourquoi Eigen du
resize
fonction ne permet pas de retenir les valeurs anciennes, à la différence destd::vector
'sresize
.Le seul cas que je peux penser de l'endroit où vous ne le sauriez pas, la matrice de taille est à l'avance lors de la lecture à partir d'un fichier. Dans ce cas, je voudrais soit charger les données dans un conteneur standard tels que
std::vector
à l'aide depush_back
puis copiez-le dans un déjà de la taille de la matrice, ou si la mémoire est serré exécuter le fichier une fois pour obtenir la taille, puis une deuxième fois pour copier les valeurs."En outre, dans l'algèbre linéaire de la matrice et vecteur tailles sont presque toujours constant et connu à l'avance." Dans la plupart des algorithmes itératifs vous ne savez pas combien d'itérations seront nécessaires jusqu'à ce qu'un critère de convergence est satisfait.
Modulo les mises en garde ci-dessus, si j'ai vraiment besoin de cela, je voudrais allouer un largish de la matrice et d'exposer un bloc qui représente la portion utilisée de la matrice. Pour pousser, vous remplissez les valeurs de la de stockage de la matrice et de créer un nouveau élargi bloc qui couvre la nouvelle partie utilisée. Lorsque vous avez épuisé la taille de votre espace de stockage de la matrice, de réaffecter il double chaque dimension. C'est après amortissement constant, de même que std::vector. Une fois que pouvait conclure comme une classe personnalisée. (Je ne connais pas les limitations sur les blocs par rapport aux matrices. Je n'ai utilisé que quelques fois.)
OriginalL'auteur David Brown
Il n'y a pas une telle fonction, cependant, vous pouvez construire quelque chose comme ça de vous-même:
Si cela doit effectuer trop d'redimensionne bien, ça va être horriblement lent.
OriginalL'auteur Yuushi