从 MatrixXf 转换为 ArrayXf 时的特征断言错误
Eigen Assertion Error when Converting from MatrixXf to ArrayXf
我写了一个简单的程序,将标量添加到随机矩阵。
#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),我不明白我做错了什么。
我已经有一段时间没有用 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
解决了。显然,我必须将加法的结果存储在 MatrixXf 中,而不是 ArrayXf 中。
#include <Eigen/Dense>
int main() {
Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
Eigen::MatrixXf arr = mat.array() + 1;
}
MatrixXf
(又名 Matrix<float, Dynamic, Dynamic>
)对应的 Array
对象是 ArrayXXf
(又名 Array<float, Dynamic, Dynamic>
)。 ArrayXf
是 Array<float, Dynamic, 1>
的类型定义,类似于 VectorXf
(又名 Matrix<float, Dynamic, 1>
)。
以下应按预期工作:
#include <Eigen/Core>
int main() {
Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
Eigen::ArrayXXf arr = mat.array() + 1;
}
我写了一个简单的程序,将标量添加到随机矩阵。
#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),我不明白我做错了什么。
我已经有一段时间没有用 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
解决了。显然,我必须将加法的结果存储在 MatrixXf 中,而不是 ArrayXf 中。
#include <Eigen/Dense>
int main() {
Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
Eigen::MatrixXf arr = mat.array() + 1;
}
MatrixXf
(又名 Matrix<float, Dynamic, Dynamic>
)对应的 Array
对象是 ArrayXXf
(又名 Array<float, Dynamic, Dynamic>
)。 ArrayXf
是 Array<float, Dynamic, 1>
的类型定义,类似于 VectorXf
(又名 Matrix<float, Dynamic, 1>
)。
以下应按预期工作:
#include <Eigen/Core>
int main() {
Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
Eigen::ArrayXXf arr = mat.array() + 1;
}