2017-10-08 148 views
0

我無法使用矢量創建矩陣。行和列將全部是隨機雙打,我試圖填充它。如何使用向量創建隨機雙精度矩陣?

我試圖初始化手的大小,我相信它初始化正確,但是,當我嘗試推入到行和列我得到非常奇怪的輸出。這裏是我的頭文件:

#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 

這裏是我的CPP文件:

#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; 
} 

當我從main.cpp中運行該程序,我收到的輸出是:

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 

正如你可以看到,它似乎正確地獲得了列的大小,但它沒有正確地獲得行大小,並且看起來非常緊密。有些數字是重複的,我希望我知道如何更清楚地格式化它,但是如果從左上角開始,您會看到792.208 792.208,然後連續下去,然後看到411.965 411.965,最後在右下角的79.6189 79.6189處結束。

我在做什麼錯?我如何正確地做到這一點?任何幫助,將不勝感激。

回答

2

在我看來,到初始化矩陣正確的做法是:

(...) 
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); 
} 
(...) 

說明:

與此構造:

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

要創建默認載體size拷貝構造的size元素(std::vector<double>(size))。換句話說,你有一個大小爲x的矩陣。

所以,你應該改變它,而不是在你的代碼中推新的值。在我提出的代碼中,創建它時只需填充此矩陣就簡單了。

+0

'emplace_back' vs'push_back'是什麼? – Sailanarmo

+3

構建您的參數。也許更多的性能 – Amadeus

+1

對我來說似乎也是正確的方式(+1),但我認爲你應該解釋爲什麼將temp的向量構建爲temp(size,std :: vector (size));'(然後使用'push_back()')是錯誤的。 – max66