使用 STL 向量创建矩阵
Posted
技术标签:
【中文标题】使用 STL 向量创建矩阵【英文标题】:Creating a matrix using STL vector 【发布时间】:2016-03-09 17:28:27 【问题描述】:我想用“向量”创建一个矩阵:
vector < vector <int> > Mat;
问题是,当我运行这段代码时:
int i ,j;
for(i = 1 ; i <= 5 ; ++i)
for(j = 1 ; j <= 5 ; ++j)
Mat[i][j] = 0;
我会得到一个非常讨厌的错误。我该如何解决?
我不想像这样读取矩阵:
for(i = 1 ; i <= 5 ; ++i)
for(j = 1 ; j <= 5 ; ++j)
M[i].push_back(0);
【问题讨论】:
【参考方案1】:当您以这种方式创建向量时,它们的维度为 0。您必须使用合适的大小来初始化它们:
vector < vector <int> > Mat(6, std::vector<int>(6));
顺便说一句,在第二个向量初始化中添加一个 0 将确保它会被 0 填充:
vector < vector <int> > Mat(6, std::vector<int>(6, 0));
【讨论】:
【参考方案2】:当你创建一个向量时,它一开始是空的,除非你告诉它大小应该是多少。如果向量为空,则不能使用[]
,因为它不进行任何范围检查,也不会增长向量。这让您有两个选择,使用push_back()
或在创建向量时为其提供大小。例如我们可以使用
const int matrix_size = 5;
auto mat = std::vector<std::vector<int>>(matrix_size, std::vector<int>(matrix_size));
// ^# of rows^ ^# of cols^
还要记住索引在 C++ 中是 0。这意味着对于具有 5 个元素的向量,有效索引为 [0, 4]
。我们可以使用ranged based for loop 来填充向量,而不用担心向量的索引
for(auto& row : mat)
for(auto& col : row)
std::cin >> col;
这将填充来自cin
的向量中的每个元素。
【讨论】:
谢谢你的回答,现在我明白了。 @epanicafrate 没问题【参考方案3】:vector < vector <int> > Mat;
这会创建一个空的 Mat;
vector < vector <int> > Mat (5);
将使用 5 个“内部”向量创建它。问题还没有解决,还需要调整内部向量的大小。
您可以通过以下方式做到这一点:(还有很多其他更好的方法)
for(int i =0;i<5;i++)
Mat[i].resize(5); // resizing the interior matrices
【讨论】:
【参考方案4】:使用 std::array 可能会更好。
std::array< std::array<int, 6>, 6> matirx;
for(auto& row: matrix)
for(auto& col: row)
col = 0;
【讨论】:
在我看来更好的是接受任意数量的维度的通用类型。无论您使用的是典型的 4x4 还是不太典型的 3x4,它的工作原理都是一样的。您甚至可以将其设置为对两个不同维度的矩阵进行矩阵数学运算。【参考方案5】:正如其他答案所提到的,您需要使用带有初始元素数量的std::vector
构造函数,以避免稍后将元素push_back
'ing 到向量中。然而,如果你想用 zeros 初始化你的矩阵,你不需要指定默认的初始化值,因为从 C++11 开始,vector(size_type count)
的形式保证将非类类型的元素清零比如int
:
vector < vector<int> > Mat( 6, vector<int>(6) );
这将创建一个带零的 6x6 int 矩阵。
【讨论】:
以上是关于使用 STL 向量创建矩阵的主要内容,如果未能解决你的问题,请参考以下文章
matlab对矩阵/向量的常用操作(拼接矩阵向量逆序改变矩阵形状求行阶梯形矩阵提取矩阵的一部分等)