C++ Armadillo:来自 vector<vector<double>> 的 mat 初始化破坏了数据
C++ Armadillo: mat initialization from vector<vector<double>> destroys data
我正在尝试将数据从向量的向量初始化为犰狳垫。
找到这个解释如何操作的网站:
http://www.kaiyin.co.vu/2014/07/initialize-armadillo-matrix-with-std.html
在打印了向量的向量和生成的垫子之后,我得出的结论是犰狳将我的数据变成了垃圾。
我的函数的主要部分:
vector<vector<double>> C_mat(num_of_functions,vector<double>(num_of_points));
for(int j=0; j< num_of_functions; ++j)
{
for( int i=0;i<num_of_points; ++i)
{
C_mat[j][i]=(functions[j](points[i].x()));// shouldn't bother you, this works.
}
}
mat C(&(C_mat.front()).front(),num_of_points, num_of_functions);
cout << C << endl << endl;
for(int i=0; i< num_of_functions;++i)
{
print_vec(C_mat[i]);
}
print_ve(vector) 是我写的一个打印向量的函数。
输出:
1.0000e+00 0e+00 1.9965e+01
1.0000e+00 4.7924e-322 1.2822e+00
1.0000e+00 1.1683e+01 0e+00
1.0000e+00 1.6936e+01 4.7924e-322
1.0000e+00 2.3361e-01 1.0237e+02
1.0000e+00 1.6445e+01 2.1512e+02
1.0000e+00 7.4271e+00 4.0931e-02
1.0000e+00 1.4162e+01 2.0284e+02
1.0000e+00 1.1670e+01 4.1371e+01
1.0000e+00 2.3633e+00 1.5042e+02
打印矢量:
1
1个
1个
1个
1个
1个
1个
1个
1个
1
打印矢量:
11.6828
16.9359
0.233613
16.4455
7.42708
14.1619
11.6701
2.36329
19.9653
1.28223
打印矢量:
102.366
215.119
0.0409313
202.84
41.3711
150.421
102.143
4.18885
298.959
1.23308
更新:
我尝试通过从一维向量中创建我自己的二维向量来更改关于第一条评论的代码。现在犰狳不会破坏数据但会对其进行加扰:
vector<double> C_mat(num_of_functions*num_of_points);
for( int i=0;i<num_of_points; ++i)
{
for(int j=0; j< num_of_functions; ++j)
{
C_mat[i*num_of_functions+j]= functions[j](points[i].x());
}
}
mat C(&C_mat.front(),num_of_points, num_of_functions);
输出:
1.0000e+00 1.1170e+01 1.6853e+01
4.5538e+00 9.3574e+01 1.0000e+00
1.5553e+01 1.0000e+00 1.6292e+01
1.0000e+00 8.7956e-01 1.9907e+02
6.0653e+00 5.8021e-01 1.0000e+00
2.7591e+01 1.0000e+00 1.0787e+01
1.0000e+00 1.8169e+01 8.7269e+01
1.3849e+01 2.4758e+02 1.0000e+00
1.4385e+02 1.0000e+00 1.7998e+01
1.0000e+00 4.7403e+00 2.4295e+02
1 4.5538 15.5528
1 6.06532 27.5911
1 13.8494 143.854
1 11.1698 93.574
1 0.879557 0.580215
1 18.1687 247.577
1 4.74031 16.8529
1 16.2919 199.069
1 10.787 87.2695
1 17.998 242.945
std::vector
相当于一个数据指针和一个长度(以及一些不相关的东西)。指针指向一堆内存,存储实际元素的地方。第 0 个元素存储在地址 pointer
,第 N 个元素存储在 pointer+N
。这就是为什么 Armadillo mat 构造函数可以获取第一个元素的地址和长度并构造一个矩阵。
创建向量时,您会得到 num_of_functions
个内部向量,每个向量都有自己的数据指针。这意味着数据没有存储在连续的内存中。
要为 std::vector
初始化二维矩阵,您应该创建大小为 num_of_functions*num_of_points
的矩阵并将值存储在列优先顺序中。
我正在尝试将数据从向量的向量初始化为犰狳垫。
找到这个解释如何操作的网站:
http://www.kaiyin.co.vu/2014/07/initialize-armadillo-matrix-with-std.html
在打印了向量的向量和生成的垫子之后,我得出的结论是犰狳将我的数据变成了垃圾。
我的函数的主要部分:
vector<vector<double>> C_mat(num_of_functions,vector<double>(num_of_points));
for(int j=0; j< num_of_functions; ++j)
{
for( int i=0;i<num_of_points; ++i)
{
C_mat[j][i]=(functions[j](points[i].x()));// shouldn't bother you, this works.
}
}
mat C(&(C_mat.front()).front(),num_of_points, num_of_functions);
cout << C << endl << endl;
for(int i=0; i< num_of_functions;++i)
{
print_vec(C_mat[i]);
}
print_ve(vector) 是我写的一个打印向量的函数。
输出:
1.0000e+00 0e+00 1.9965e+01
1.0000e+00 4.7924e-322 1.2822e+00
1.0000e+00 1.1683e+01 0e+00
1.0000e+00 1.6936e+01 4.7924e-322
1.0000e+00 2.3361e-01 1.0237e+02
1.0000e+00 1.6445e+01 2.1512e+02
1.0000e+00 7.4271e+00 4.0931e-02
1.0000e+00 1.4162e+01 2.0284e+02
1.0000e+00 1.1670e+01 4.1371e+01
1.0000e+00 2.3633e+00 1.5042e+02
打印矢量:
1 1个 1个 1个 1个 1个 1个 1个 1个 1
打印矢量:
11.6828 16.9359 0.233613 16.4455 7.42708 14.1619 11.6701 2.36329 19.9653 1.28223
打印矢量:
102.366 215.119 0.0409313 202.84 41.3711 150.421 102.143 4.18885 298.959 1.23308
更新:
我尝试通过从一维向量中创建我自己的二维向量来更改关于第一条评论的代码。现在犰狳不会破坏数据但会对其进行加扰:
vector<double> C_mat(num_of_functions*num_of_points);
for( int i=0;i<num_of_points; ++i)
{
for(int j=0; j< num_of_functions; ++j)
{
C_mat[i*num_of_functions+j]= functions[j](points[i].x());
}
}
mat C(&C_mat.front(),num_of_points, num_of_functions);
输出:
1.0000e+00 1.1170e+01 1.6853e+01
4.5538e+00 9.3574e+01 1.0000e+00
1.5553e+01 1.0000e+00 1.6292e+01
1.0000e+00 8.7956e-01 1.9907e+02
6.0653e+00 5.8021e-01 1.0000e+00
2.7591e+01 1.0000e+00 1.0787e+01
1.0000e+00 1.8169e+01 8.7269e+01
1.3849e+01 2.4758e+02 1.0000e+00
1.4385e+02 1.0000e+00 1.7998e+01
1.0000e+00 4.7403e+00 2.4295e+02
1 4.5538 15.5528
1 6.06532 27.5911
1 13.8494 143.854
1 11.1698 93.574
1 0.879557 0.580215
1 18.1687 247.577
1 4.74031 16.8529
1 16.2919 199.069
1 10.787 87.2695
1 17.998 242.945
std::vector
相当于一个数据指针和一个长度(以及一些不相关的东西)。指针指向一堆内存,存储实际元素的地方。第 0 个元素存储在地址 pointer
,第 N 个元素存储在 pointer+N
。这就是为什么 Armadillo mat 构造函数可以获取第一个元素的地址和长度并构造一个矩阵。
创建向量时,您会得到 num_of_functions
个内部向量,每个向量都有自己的数据指针。这意味着数据没有存储在连续的内存中。
要为 std::vector
初始化二维矩阵,您应该创建大小为 num_of_functions*num_of_points
的矩阵并将值存储在列优先顺序中。