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

Addition and subtraction not working with Armadillo sparse matrices

我不明白为什么 +- 操作在 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;

它在他们的 API 文档中正确地说明了“+”和“-”的作用。我认为您应该阅读文档,弄清楚您要做什么,然后问那个问题。

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

operators: + - * / % == != <= >= < >
Overloaded operators for mat, vec, rowvec and cube classes

Meanings:

'+' Addition of two objects
'-' Subtraction of one object from another or negation of an object
'/' Element-wise division of an object by another object or a scalar
'*' Matrix multiplication of two objects; not applicable to the cube class unless multiplying a cube by a scalar

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

我不是假装自己是这个话题的专家;我刚刚阅读了 API。你应该看看 headers.

它根本不受支持(还没有?)。仍然有希望,因为医生说 此版本对稀疏矩阵的支持是初步的

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

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

将标量添加到矩阵等同于将标量添加到矩阵中的每个元素。在稀疏矩阵中,大部分元素都是零,并且没有显式存储,这显着减少了内存使用。

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

鉴于上述观察,犰狳开发人员似乎通过简单地不定义向 sparse 矩阵添加标量来阻止此问题的发生。将标量添加到 dense 矩阵有效 perfectly fine.