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

Posted

技术标签:

【中文标题】在 C++ 中为多维特征矩阵赋值?【英文标题】:Assigning Values to multi dimensional Eigen matrix in c++? 【发布时间】:2017-03-21 15:05:32 【问题描述】:

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

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

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

【问题讨论】:

您将外积 x*y^T 矩阵分配给 10x10 块的第一个元素,即 Eigen::VectorXd。看起来您正在寻找张量类型。 如果你使用 Eigen::VectorXd 作为标量,你必须定义几个标量操作。更好的选择是使用等级为 3 的 Eigen::Tensor,或使用通常标量(在您的情况下为双倍)的扁平矩阵(3,宽度 * 高度) 【参考方案1】:

您正在尝试使用Eigen::VectorXd 作为标量类型。所以你应该确保你已经扩展了Eigen::NumTraits,正如https://eigen.tuxfamily.org/dox-devel/TopicCustomizing_CustomScalar.html中所解释的那样

您似乎正在尝试重新创建多通道数组或图像。所以你不会通过上述方法获得很多。更好的主意是使用等级为 3 的 Eigen::Tensor 或大小为 (3, width*height) 的扁平矩阵。然后您将获得所有 Eigen 优势(矢量化标量操作,没有奇怪的访问模式,如 (row, col)(channel) 等)

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

【讨论】:

非常感谢您的建议

以上是关于在 C++ 中为多维特征矩阵赋值?的主要内容,如果未能解决你的问题,请参考以下文章

在犰狳 C++ 中为复杂特征值分解找到不同的值

pytorch学习笔记:多维特征的分类问题

KMeans 聚类多维特征

具有行主矩阵特征 C++ 的平方欧几里得距离

从共现矩阵中提取纹理特征

c++大特征分解速度