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&lt;T1,T2,spglue_plus&gt;)。

这意味着这个候选者只有在布尔表达式的计算结果为真时才有效,否则它也会从可能的候选者列表中被丢弃。如您所见,布尔表达式还包含部分

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

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

【讨论】:

以上是关于C++犰狳稀疏矩阵类型转换的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rcpp 通过引用传递犰狳稀疏矩阵

将犰狳中的矩阵从稀疏转换为密集(spmat 到 mat)

如何在犰狳中更新稀疏矩阵的值

犰狳中是不是有类似稀疏立方体的东西,或者使用稀疏矩阵作为立方体中的切片的某种方式?

犰狳中的稀疏 svd (C++)

如何使用 C++ 将 Eigen 稀疏矩阵转换为数组?