C ++犰狳稀疏矩阵类型转换

时间:2016-01-25 07:25:28

标签: c++ sparse-matrix armadillo

我想用$result=array_unique( $res, SORT_REGULAR );添加两个任意(不同)类型的稀疏犰狳矩阵,例如

operator+

编译时,编译器会抱怨没有为这些类型定义SpMat<double> M1(2,2); SpMat<cx_double> M2(2,2); // ..fill both matrices cout<<M1 + M2<<endl;

当使用DENSE矩阵进行相同操作时,犰狳会自动将双矩阵推广到复杂矩阵,执行加法并打印复杂的结果矩阵。

在include {dir}中的operator+中有一个相应的模板,用于添加两个稀疏对象,可能是不同类型的(至少模板定义表明这一点),但它似乎只适用于两个操作数属于同一类型。上述代码的实际编译器消息如下

operator_plus.hpp

有什么想法吗?这个功能有可能还没有实现吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

似乎尚未实现添加两个不同类型的稀疏矩阵(使用当前最新版本6.400.3)。我估计下面的内容也会回答this question

Armadillo使用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是在restrictors.hpp中定义的模板结构,其工作方式与std::enable_if非常相似:如果enable_if的第一个模板参数(在上面的声明中,long boolean expression)的计算结果为true,则enable_if具有与第二个模板参数相同类型的成员(在本例中为SpGlue<T1,T2,spglue_plus>)。

这意味着此候选项仅在布尔表达式求值为true时才有效,否则也会从可能的候选列表中丢弃。如您所见,布尔表达式还包含部分

is_same_type<typename T1::elem_type, typename T2::elem_type>::value

T1T2不相同时,其当然评估为false,因此enable_if2没有成员enable_if2::result,并且该函数将从候选列表中删除。