gpt4 book ai didi

eigen - 在 Eigen 中混合标量类型

转载 作者:行者123 更新时间:2023-12-01 12:24:21 38 4
gpt4 key购买 nike

#include <iostream>

#include <Eigen/Core>

namespace Eigen {

// float op double -> double
template <typename BinaryOp>
struct ScalarBinaryOpTraits<float, double, BinaryOp> {
enum { Defined = 1 };
typedef double ReturnType;
};

// double op float -> double
template <typename BinaryOp>
struct ScalarBinaryOpTraits<double, float, BinaryOp> {
enum { Defined = 1 };
typedef double ReturnType;
};

}

int main() {
Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic> m1(2, 2);
m1 << 1, 2, 3, 4;

Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> m2(2, 2);
m2 << 1, 2, 3, 4;

std::cerr << m1 * m2 <<std::endl; // <- boom!!
}

我想知道为什么上面的代码不能编译。 Here是完整的错误信息。请注意,如果我将 m1m2 定义为具有固定大小,则它可以正常工作。

我正在使用 Eigen3.3.1。它在运行 OSX-10.12 和 Apple 的 clang-800.0.42.1 的 Mac 上进行了测试。

最佳答案

这是因为一般的矩阵-矩阵乘积是通过积极的手动向量化、流水线、多级缓存等高度优化的。这部分不支持混合 float 和 double 。您可以使用 m1.lazyProduct(m2) 绕过这个高度优化的实现,它对应于用于小型固定大小矩阵的实现,但这样做只有一个缺点:ALU 不支持混合 float 和 double,因此无论如何都必须将 float 值提升为 double,您将失去矢量化。最好将 float 显式转换为 double:

m1.cast<double>() * m2

关于eigen - 在 Eigen 中混合标量类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41494288/

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