我在使用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
。
我做错了什么?我该怎么做呢?任何帮助将不胜感激。
答案 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尺寸矩阵。
因此,您应该更改它,而不是在代码中推送新值。在我提出的代码中,在创建它时填充此矩阵更简单。