2017-10-08 1 views
0

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.

Répondre

2

me semble que la bonne façon d'initialiser votre matrice est:

(...) 
std::vector<std::vector<double>> temp; 

for(int i = 0; i < size; ++i) 
{ 
    std::vector<double> k; 
    for(int j = 0; j < size; ++j) 
    { 
     ranNum = randNumber(); 
     k.emplace_back(ranNum); 
    } 
    temp.emplace_back(k); 
} 
(...) 

Explication:

avec ce constructeur:

std::vector<std::vector<double>> temp(size, std::vector<double>(size)); 

vous créez size copies de vecteur par défaut construit de size éléments (std::vector<double>(size)). En d'autres termes, vous avez une matrice de taille x taille. Donc, au lieu de pousser de nouvelles valeurs dans votre code, vous devriez le changer. Dans le code que j'ai proposé, il est simplement plus simple de remplir cette matrice lorsque vous la créez.

+0

Que fait 'emplace_back' vs' push_back'? – Sailanarmo

+3

Construire en place vos paramètres. Peut-être plus de performance – Amadeus

+1

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