在 c++ 中为多维特征矩阵赋值

Assigning Values to multi dimensional Eigen matrix in c++?

本文关键字:特征 赋值 维特 c++      更新时间:2023-10-16

我有一个特征矩阵,向量作为标量类型,定义如下

Eigen::Matrix<Eigen::VectorXd, Eigen::Dynamic, Eigen::Dynamic> res = Eigen::Matrix<Eigen::VectorXd, Eigen::Dynamic, Eigen::Dynamic>::
        Constant(10,
            10,
            Eigen::VectorXd::Zero(3));

我可以按如下方式访问和分配值

res(0,0)(0) = 1;

我正在尝试为每个第三个索引分配一个矩阵,如下所示

res(all_rows,all_cols)(0) = matrix

以下是我的代码

int main()
{
    Eigen::Matrix<Eigen::VectorXd, Eigen::Dynamic, Eigen::Dynamic> res = Eigen::Matrix<Eigen::VectorXd, Eigen::Dynamic, Eigen::Dynamic>::
        Constant(10,
            10,
            Eigen::VectorXd::Zero(3));
    Eigen::MatrixXf x = Eigen::MatrixXf::Ones(10, 1)*2;
    Eigen::MatrixXf y = Eigen::MatrixXf::Ones(10, 1);
    Eigen::MatrixXf product = Eigen::MatrixXf::Zero(10, 10);
    MatrixXd m(2, 2);
    res(0, 0)(0) = 1;
    m(0, 0) = 3;
    m(1, 0) = 2.5;
    m(0, 1) = -1;
    m(1, 1) = m(1, 0) + m(0, 1);
    product = x*y.transpose();
    res.block(0,0,10,10)(0) = x*y.transpose();
}

但是当我尝试编译代码时,这一行给出了错误

res.block(0,0,10,10)(0) = x*y.transpose();

我收到以下错误。

Error   C2338   THIS_COEFFICIENT_ACCESSOR_TAKING_ONE_ACCESS_IS_ONLY_FOR_EXPRESSIONS_ALLOWING_LINEAR_ACCESS

有没有办法克服这个问题,或者我应该改变我的方法?

您正在尝试使用 Eigen::VectorXd 作为标量类型。因此,您应该确保已按照 https://eigen.tuxfamily.org/dox-devel/TopicCustomizing_CustomScalar.html 中所述扩展Eigen::NumTraits

看起来您正在尝试重新创建多通道阵列或图像。因此,上述方法不会让您获得很多收益。更好的主意是使用秩为 3 的Eigen::Tensor或大小(3,宽度*高度(的扁平矩阵。然后你会得到所有的特征性好处(矢量化标量操作,没有奇怪的访问模式,如(行,列((通道(等(

Eigen::Tensor<double, 3> rgb_image(height, width, 3);
Eigen::MatrixXd rgb_image(3, width*height); // Each column is a pixel color