如何声明特征矩阵,然后通过嵌套循环对其进行初始化
How to declare Eigen matrix and then initialize it through nested loop
我想按照标题上写的做,试过如下代码:
typedef std::vector<std::vector<std::vector<double>>> Tensor;
// should return a matrix of shape (batch_size, 1840)
Eigen::MatrixXd flatten(Tensor x)
{
int channels = x.size(); // always 10
int batch = x[0].size(); // varies
int columns = x[0][0].size(); // always 184
Eigen::Matrix<double, Eigen::Dynamic, 1840> matrix;
for (unsigned int b = 0; b < batch; b++)
{
for (unsigned int i = 0; i < columns; i++)
{
for (unsigned int c = 0; c < channels; c++)
{
matrix << x[c][b][i]; // I also tried this: matrix(b, i+c) = x[c][b][i];
}
}
}
return matrix;
}
但是代码要么以 abort() has been called
消息中止,要么给我一个 Access violation writing location 0x0000000000000000
完成我想做的事情的正确方法是什么?
你从来没有告诉矩阵它应该是什么大小。您必须在写入之前调整矩阵的大小。
Eigen::Matrix<double, Eigen::Dynamic, 1840> matrix;
matrix.resize(batch, 1840);
for (unsigned int b = 0; b < batch; b++)
...
您的代码的第二个问题是 operator<<
的行为与标准容器的 push_back
不同。它一次初始化整个(适当大小的)矩阵,而不是使用 NxMxL 调用。
与代码无关的性能问题是 Tensor x
是按值传递的,从而产生了副本。通过 (const) 引用代替:
Eigen::MatrixXd flatten(const Tensor& x)
{ ...
我想按照标题上写的做,试过如下代码:
typedef std::vector<std::vector<std::vector<double>>> Tensor;
// should return a matrix of shape (batch_size, 1840)
Eigen::MatrixXd flatten(Tensor x)
{
int channels = x.size(); // always 10
int batch = x[0].size(); // varies
int columns = x[0][0].size(); // always 184
Eigen::Matrix<double, Eigen::Dynamic, 1840> matrix;
for (unsigned int b = 0; b < batch; b++)
{
for (unsigned int i = 0; i < columns; i++)
{
for (unsigned int c = 0; c < channels; c++)
{
matrix << x[c][b][i]; // I also tried this: matrix(b, i+c) = x[c][b][i];
}
}
}
return matrix;
}
但是代码要么以 abort() has been called
消息中止,要么给我一个 Access violation writing location 0x0000000000000000
完成我想做的事情的正确方法是什么?
你从来没有告诉矩阵它应该是什么大小。您必须在写入之前调整矩阵的大小。
Eigen::Matrix<double, Eigen::Dynamic, 1840> matrix;
matrix.resize(batch, 1840);
for (unsigned int b = 0; b < batch; b++)
...
您的代码的第二个问题是 operator<<
的行为与标准容器的 push_back
不同。它一次初始化整个(适当大小的)矩阵,而不是使用 NxMxL 调用。
与代码无关的性能问题是 Tensor x
是按值传递的,从而产生了副本。通过 (const) 引用代替:
Eigen::MatrixXd flatten(const Tensor& x)
{ ...