从MatrixXf转换为ArrayXf时的特征断言错误

问题描述 投票:0回答:3

我编写了一个简单的程序,将标量添加到随机矩阵。

#include <Eigen/Dense>

int main() {
    Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
    Eigen::ArrayXf arr = mat.array() + 1;
}

该程序编译无任何错误。但是,执行此行时:

Eigen::ArrayXf arr = mat.array() + 1;

我收到以下错误:

Assertion failed: (other.rows() == 1 || other.cols() == 1), function resizeLike, file /usr/local/Cellar/eigen/3.3.7/include/eigen3/Eigen/src/Core/PlainObjectBase.h, line 374.

我阅读了官方文档(https://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html),但我不明白自己在做什么错。

c++ eigen eigen3
3个回答
0
投票

自从我对Eigen进行任何操作以来已经有一段时间了,但是我相信您不能像这样混合使用数组和矩阵。

但是,您似乎正在生成一个带有随机数的100x100矩阵,但我不确定为什么它会跳闸。目前我还没有Eigen,但是将其更改为使用固定大小的数组似乎可以在Godbolt上进行。

// Type your code here, or load an example.
#include <iostream>
#include <Eigen/Dense>

int main() 
{
    Eigen::Matrix<float, 100, 100> mat = Eigen::Matrix<float, 100, 100>::Random();
    Eigen::Array<float, 100, 100> arr = mat.array() + 1;

    std::cout << "Mat 0,0: " << mat(0,0) << "\nArr 0,0: " << arr(0,0) << "\n";
    std::cout << "Mat 2,0: " << mat(2,0) << "\nArr 2,0: " << arr(2,0);

    return 0;
}
ASM generation compiler returned: 0

Execution build compiler returned: 0

Program returned: 0

Mat 0,0: 0.680375
Arr 0,0: 1.68038
Mat 2,0: 0.566198
Arr 2,0: 1.5662

https://godbolt.org/z/9xu5oW


0
投票

解决了。显然,我必须将相加的结果存储在MatrixXf中,而不是ArrayXf中。

#include <Eigen/Dense>

int main() {
    Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
    Eigen::MatrixXf arr = mat.array() + 1;
}

0
投票

Array(又名MatrixXf)对应的Matrix<float, Dynamic, Dynamic>对象将是ArrayXXf(又名Array<float, Dynamic, Dynamic>)。 ArrayXfArray<float, Dynamic, 1>的typedef,类似于VectorXf(又名Matrix<float, Dynamic, 1>)。

以下内容应可正常工作:

#include <Eigen/Core>

int main() {
    Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
    Eigen::ArrayXXf arr = mat.array() + 1;
}
© www.soinside.com 2019 - 2024. All rights reserved.