如何使用向量创建随机双打矩阵?

时间:2017-10-08 23:59:05

标签: c++ c++11 matrix vector

我在使用Vectors创建Matrix时遇到问题。行和列都是随机双打,我试图填写它。

我已经尝试过预先初始化向量的大小,我相信它正确初始化,然而,当我尝试按下行和列时,我得到非常奇怪的输出。这是我的头文件:

#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

我做错了什么?我该怎么做呢?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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尺寸矩阵。

因此,您应该更改它,而不是在代码中推送新值。在我提出的代码中,在创建它时填充此矩阵更简单。