eigen能支持不一致的输入输出类型吗?

Can eigen supports inconsistent input and output types?

比如我想用Eigen做矩阵乘法。但是输入矩阵的类型是int16_t,输出的类型是int32_t。所以它会导致编译器错误。

Showing Recent Issues /Eigen/src/Core/AssignEvaluator.h:834:3: Static_assert failed due to requirement 'Eigen::internal::has_ReturnType::Scalar, assign_op > >::value' "YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY"

下面是测试代码:

#include <iostream>

typedef Eigen::Matrix<int16_t, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatX16;
typedef Eigen::Matrix<int32_t, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatX32;


#define MAP_MATRIX(name, ptr, M, N) Eigen::Map<MatX32> name(ptr, M, N)
#define MAP_CONST_MATRIX(name, ptr, M, N) Eigen::Map<const MatX16> name(ptr, M, N)

int main(int argc, const char * argv[]) {

int M, N, K;
M = 10; N = 10; K = 10;
// eigen  int16xint16 = int32
int16_t lhs[100] = {1};
int16_t rhs[100] = {2};
int32_t res[100] = {0};

MAP_CONST_MATRIX(eA, lhs, M, K);
MAP_CONST_MATRIX(eB, rhs, K, N);
MAP_MATRIX(eC, res, M, N);

eC = eA * eB;


return 0;
}

两个 int16 矩阵的乘积将再次成为 int16。您可以将结果转换为 int32:

eC = (eA * eB).cast<int32_t>();

然而,您可能真正想要的是将原始因子转换为 int32。此外,您可以告诉 Eigen eC 不会与 eAeB:

别名
eC.noalias() = eA.cast<int32_t>() * eB.cast<int32_t>();

请注意,转换尚未矢量化(尚未),因此您可能会得到 sub-optimal 代码。不过,您的编译器 可能 足够聪明,可以部分 auto-vectorize 产品。