本征能支持不一致的输入和输出类型吗?

时间:2019-06-06 11:56:57

标签: eigen3

例如,我想使用Eigen进行矩阵乘法。但是输入矩阵的类型为int16_t,输出类型为int32_t。因此会导致编译器错误。

  

显示最近的问题   /Eigen/src/Core/AssignEvaluator.h:834:3:由于要求'Eigen :: internal :: has_ReturnType :: Scalar,assign_op>> :: value'“ YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_BASE_CAST_C

下面是测试代码:

#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;
}

1 个答案:

答案 0 :(得分:1)

两个int16矩阵的乘积将再次为int16。您可以将结果投射到int32

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

但是,您实际上可能想要的是将原始因素转换为int32。此外,您可以告诉Eigen eC不会以eAeB作为别名:

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

请注意,转换尚未向量化(尚未),因此您可能会获得次优的代码。不过,您的编译器可能足够聪明,可以部分自动对产品进行矢量化处理。