我想用$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
有什么想法吗?这个功能有可能还没有实现吗? 谢谢!
答案 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
当T1
和T2
不相同时,其当然评估为false,因此enable_if2没有成员enable_if2::result
,并且该函数将从候选列表中删除。