C++犰狳稀疏矩阵类型转换
Posted
技术标签:
【中文标题】C++犰狳稀疏矩阵类型转换【英文标题】:C++ armadillo sparse matrix type conversion 【发布时间】:2016-01-25 07:25:27 【问题描述】:我想用operator+
添加两个任意(不同)类型的稀疏犰狳矩阵,例如
SpMat<double> M1(2,2);
SpMat<cx_double> M2(2,2);
// ..fill both matrices
cout<<M1 + M2<<endl;
编译时,编译器抱怨operator+
没有为这些类型定义。
当对 DENSE 矩阵执行相同操作时,犰狳会自动将双精度矩阵提升为复数矩阵,执行加法并打印一个复数结果矩阵。
在 include 目录中的 operator_plus.hpp
中有此运算符的相应模板,用于添加两个可能具有不同类型的稀疏对象(至少模板定义表明),但它似乎仅在两个操作数都为同一类型。上述代码的实际编译器消息如下
operator_plus.hpp:164:1: note: template<class T1, class T2> typename arma::enable_if2<((arma::is_arma_sparse_type<T1>::value && arma::is_arma_sparse_type<T2>::value) && arma::is_same_type<typename T1::elem_type, typename T2::elem_type>::value), arma::SpGlue<T1, T2, arma::spglue_plus> >::result arma::operator+(const T1&, const T2&)
operator_plus.hpp:164:1: note: template argument deduction/substitution failed:
operator_plus.hpp:164:1: error: no type named ‘result’ in ‘struct arma::enable_if2<false, arma::SpGlue<arma::SpMat<double>, arma::SpMat<std::complex<double> >, arma::spglue_plus> >’
有什么想法吗?有没有可能这个功能还没有实现? 谢谢!
【问题讨论】:
【参考方案1】:似乎尚未实现添加两个不同类型的稀疏矩阵(使用当前最新版本 6.400.3)。我认为下面也回答了this question。
犰狳使用SFINAE 技术从可能的重载候选列表中排除不适合的operator+
(以及许多其他函数/运算符)的函数模板,在评估时只留下所需的候选模板参数。
这里我们想要的候选是两个稀疏矩阵相加的那个。它具有以下签名
template<typename T1, typename T2>
inline arma_hot
typename enable_if2
<
(is_arma_sparse_type<T1>::value && is_arma_sparse_type<T2>::value && is_same_type<typename T1::elem_type, typename T2::elem_type>::value),
SpGlue<T1,T2,spglue_plus>
>::result
operator+(const T1& x,const T2& y)
enable_if2 是在限制器.hpp 中定义的模板结构,其工作方式与std::enable_if 非常相似:如果 enable_if 的第一个模板参数(在上面的声明中为长布尔表达式)计算为 true,则 enable_if 有一个成员与第二个模板参数的类型相同(在本例中为 SpGlue<T1,T2,spglue_plus>
)。
这意味着这个候选者只有在布尔表达式的计算结果为真时才有效,否则它也会从可能的候选者列表中被丢弃。如您所见,布尔表达式还包含部分
is_same_type<typename T1::elem_type, typename T2::elem_type>::value
如果T1
和T2
不相同,当然会评估为false,因此enable_if2 没有成员enable_if2::result
,并且该函数从候选列表中删除。
【讨论】:
以上是关于C++犰狳稀疏矩阵类型转换的主要内容,如果未能解决你的问题,请参考以下文章