我正在为我的项目在std::vector
和 Eigen 之间编写一个简单的界面。对于简单的矩阵 - 矩阵乘法码:
template<typename MatrixElementType1, typename MatrixElementType2>
inline auto _matmat( const vector<MatrixElementType1>& Mat1,
const vector<MatrixElementType2>& Mat2,
const size_t M, const size_t N, const size_t K)
{
using MatrixType1 = Matrix<MatrixElementType1, Dynamic, Dynamic>;
using MatrixType2 = Matrix<MatrixElementType2, Dynamic, Dynamic>;
Map<const MatrixType1> m1(Mat1.data(), M, N);
Map<const MatrixType2> m2(Mat2.data(), N, K);
auto rst = m1 * m2;
return vector<???>(rst.data(), rst.data() + rst.size());
}
问题是我应该使用什么??? ..我知道decltype(rst(0,0))
有效,但有更优雅的方式吗?似乎decltype(rst)::value_type
不适用于 Eigen Matrix ..
答案 0 :(得分:1)
首先,由于m1*m2
返回表达式而不是产品的结果,因此如果使用auto,则需要显式计算它:
auto rst = (m1 * m2).eval();
然后,您可以使用decltype(rst)::Scalar
获取标量类型。一个更好的策略可能是声明一个适当类型和大小的std :: vector,并映射它:
typedef decltype(m1*m2)::Scalar ResScalar;
vector<ResScalar> res(M,K);
Matrix<ResScalar,Dynamic,Dynamic>::Map(res.data(),M,K).noalias() = m1*m2;
return res;