例如,我想使用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;
}
答案 0 :(得分:1)
两个int16
矩阵的乘积将再次为int16
。您可以将结果投射到int32
:
eC = (eA * eB).cast<int32_t>();
但是,您实际上可能想要的是将原始因素转换为int32
。此外,您可以告诉Eigen eC
不会以eA
或eB
作为别名:
eC.noalias() = eA.cast<int32_t>() * eB.cast<int32_t>();
请注意,转换尚未向量化(尚未),因此您可能会获得次优的代码。不过,您的编译器可能足够聪明,可以部分自动对产品进行矢量化处理。