加法和减法不适用于犰狳稀疏矩阵

时间:2015-12-22 16:54:50

标签: c++ armadillo

我不明白为什么+-操作在*/正常工作时无法处理Armadillo稀疏矩阵。 (根据文档,+-也应该有效link)。

#include <iostream>
#include <stdlib.h>
#include <math.h>
#include<armadillo>  

using namespace std;
using namespace arma;

int main(int argc, char** argv) {
    sp_mat A(5,6);
    A(0,0) = 1;
    A(1,0) = 2;
    cout << 2 + A << endl;
    return 0;
}

请参阅以下错误。

In file included from /usr/include/c++/4.8/bits/stl_algobase.h:67:0,
             from /usr/include/c++/4.8/bits/char_traits.h:39,
             from /usr/include/c++/4.8/ios:40,
             from /usr/include/c++/4.8/ostream:38,
             from /usr/include/c++/4.8/iostream:39,
             from demo.cpp:1:
   /usr/include/c++/4.8/bits/stl_iterator.h:327:5: note:            template<class _Iterator> typename std::reverse_iterator<_Iterator>::difference_type std::operator-(const std::reverse_iterator<_Iterator>&, const std::reverse_iterator<_Iterator>&)
     operator-(const reverse_iterator<_Iterator>& __x,
     ^
/usr/include/c++/4.8/bits/stl_iterator.h:327:5: note:   template argument deduction/substitution failed:
demo.cpp:28:9: note:   mismatched types ‘const std::reverse_iterator<_Iterator>’ and ‘int’
 cout<<2-A<<endl;

3 个答案:

答案 0 :(得分:4)

向矩阵添加标量相当于将标量添加到矩阵中的每个元素。在稀疏矩阵中,大多数元素都是零,并且没有显式存储,这大大减少了内存使用。

因此,建议在稀疏矩阵中添加标量,因为它实际上会将稀疏矩阵转换为密集矩阵,首先破坏了稀疏矩阵的目的(减少了内存使用)。

鉴于上述观察,看起来Armadillo开发人员似乎没有通过简单地定义向稀疏矩阵添加标量来防止此问题发生。向密集矩阵添加标量有效perfectly fine

答案 1 :(得分:1)

它根本不受支持(但是?)。自从博士说这个以来,仍然有希望 此版本中对稀疏矩阵的支持是初步的

同时,您可以通过子矩阵视图来使用就地加法和减法,例如,

using namespace arma;
Mat<double> m(5, 6, fill::ones);
SpMat<double> spm(m);
spm(span::all, span::all) += 2;

答案 2 :(得分:0)

它在API的文档上说正确的&#39; +&#39;和&#39; - &#39;准备好了。我认为你应该阅读文档,弄清楚你想要做什么,然后再问这个问题。

http://arma.sourceforge.net/docs.html#SpMat

  

运算符:+ - * /%==!=&lt; =&gt; =&lt; &GT;
  mat,vec,rowvec和cube类的重载运算符

     

意思:

     

&#39; +&#39;增加两个物体
  &#39; - &#39;减去一个物体与另一个物体或物体的否定
  &#39; /&#39;通过另一个对象或标量逐个分割对象   &#39; *&#39;两个对象的矩阵乘法;不适用于多维数据集类,除非将多维数据集乘以标量

根据您的错误,很明显他们没有为sp_mat和标量定义运算符,他们将其定义为sp_mat和{{1 }}

我不是假装自己是这个话题的主人;我刚看了API。你应该看看标题。