gpt4 book ai didi

c++ - 如何声明 Eigen 矩阵,然后通过嵌套循环对其进行初始化

转载 作者:行者123 更新时间:2023-12-02 10:05:27 28 4
gpt4 key购买 nike

我想做标题中写的,我尝试了以下代码:

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)
{ ...

关于c++ - 如何声明 Eigen 矩阵,然后通过嵌套循环对其进行初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60398443/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com