加法和减法不适用于犰狳稀疏矩阵
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_mat
和 sp_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.
我不明白为什么 +
和 -
操作在 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 classesMeanings:
'+' 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_mat
和 sp_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.