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

Addition and subtraction not working with Armadillo sparse matrices

本文关键字:Armadillo 适用于 不适用      更新时间:2023-10-16

我不明白为什么+-运算不能在Armadillo稀疏矩阵上工作,而*/却能正常工作。(根据文档,+-应该也可以链接)。

#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;

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

因此,将标量添加到稀疏矩阵是不明智的,因为实际上它会将矩阵变成阵,这首先违背了使用稀疏矩阵的目的(减少内存使用)。

鉴于上述观察结果,Armadillo的开发人员似乎通过简单地不定义向稀疏矩阵添加标量来防止这个问题的发生。将标量添加到稠密矩阵中效果非常好。

它根本不受支持(现在?)。医生这么说了,还是有希望的此版本中对稀疏矩阵的支持是初步的

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

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

它在API的文档上直接说明了"+"answers"-"的设置。我认为你应该阅读文档,弄清楚你想做什么,然后问这个问题。

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

运算符:+-*/%==!=<=><>
mat、vec、rowvec和cube类的重载运算符

含义:

'+'添加两个对象
'-'从另一个对象中减去一个对象或否定一个对象
'/'将一个对象按元素划分为另一个对象或标量
'*'两个对象的矩阵乘积;不适用于多维数据集类,除非将多维数据集乘以标量

根据您的错误,很明显,他们没有为sp_mat和标量定义运算符,而是为sp_matsp_mat定义了运算符。

我并不是假装是这个话题的大师;我刚读了API。你可能应该看看标题。