J'ai des difficultés à créer une matrice en utilisant des vecteurs. Les lignes et les colonnes seront toutes des doubles aléatoires et j'essaie de les remplir.Comment créer une matrice de doubles aléatoires en utilisant des vecteurs?
J'ai essayé d'initialiser la taille du vecteur avant de le faire, mais je crois qu'il s'initialise correctement, cependant, quand j'essaie de pousser sur le les lignes et les colonnes, je reçois une sortie très étrange. Voici mon fichier d'en-tête:
#ifndef MATRIX_NORM_HPP
#define MATRIX_NORM_HPP
#include <vector>
class MatrixNorm
{
public:
void initProgram();
void printResults();
double randNumber();
private:
std::vector<std::vector<double>> M;
double mNorm1 = 0.0;
double mNormInf = 0.0;
};
#endif
Voici mon fichier RPC:
#include "matrixNorm.hpp"
#include <iostream>
#include <random>
void initProgram()
{
double ranNum = 0.0;
int size = 0;
std::cout << "Please enter a size of an n by n Matrix: ";
std::cin >> size;
std::vector<std::vector<double>> temp(size, std::vector<double>(size));
for(int i = 0; i < size; ++i)
{
for(int j = 0; j < size; ++j)
{
ranNum = randNumber();
temp[i].push_back(ranNum);
temp[j].push_back(ranNum);
}
}
M = temp;
printResults();
}
void MatrixNorm::printResults()
{
for(auto &&e: M)
{
for(auto && f: e)
{
std::cout << f << " ";
}
std::cout << std::endl;
}
}
double MatrixNorm::randNumber()
{
double ranDouble = 0.0;
std::random_device rd;
std::default_random_engine generator(rd());
std::uniform_real_distribution<double> unif(-1000.0,1000.0);
ranDouble = unif(generator);
return ranDouble;
}
La sortie que je reçois quand je lance le programme de main.cpp est:
Please enter a size of an n by n Matrix: 3
0 0 0 792.208 792.208 -361.248 -776.871 742.521 116.732
0 0 0 -361.248 742.521 411.965 411.965 909.313 -50.0048
0 0 0 -776.871 909.313 116.732 -50.0048 79.6189 79.6189
Comme vous peut voir, il semble obtenir la taille de la colonne correctement, mais il n'obtient pas la taille de la ligne correctement, et si vous regardez de très près. Certains des nombres sont des doublons, je voudrais savoir comment le formater plus clairement mais si vous commencez en haut à gauche vous voyez 792.208 792.208
puis descendez une rangée et vous voyez 411.965 411.965
et le dernier finit à 79.6189 79.6189
en bas à droite.
Qu'est-ce que je fais mal? Comment est-ce que je fais cela correctement? Toute aide serait appréciée.
Que fait 'emplace_back' vs' push_back'? – Sailanarmo
Construire en place vos paramètres. Peut-être plus de performance – Amadeus
me semble la bonne façon aussi (+1) mais je pense que vous devriez expliquer pourquoi construire le vecteur 'temp' des vecteurs comme' temp (size, std :: vector (size)); '(et puis utilisez 'push_back()') est incorrect. –
max66