加法和减法不适用于Armadillo稀疏矩阵
Addition and subtraction not working with Armadillo sparse matrices
我不明白为什么+
和-
运算不能在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_mat
和sp_mat
定义了运算符。
我并不是假装是这个话题的大师;我刚读了API。你可能应该看看标题。
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 使用一个参数的模板函数时出错(适用于 2)
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 为什么这适用于 G++ 而不是 CLANG?
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 适用于 Linux 的 c++ 上的代理脚本
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 模板函数仅适用于VS
- 如何在cmake中包含适用于g++或viceversa的库
- 适用于win32、linux、mac的POSIX C包装器
- WinDBG适用于从Visual Studio 2015保存的转储,但不适用于任务管理器。显示异常代码"not found"
- 从uint8_t到NPY_UINT16 PyArray_SimpleNewFromData.适用于Linux,但不适用于