2015-12-22 67 views
0

我不明白爲什麼+-操作不適用於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; 
+0

將值賦給臨時對我來說似乎是相當多餘的。但也許你可以讓我清醒。 – Downvoter

+0

在提供的文檔中,operator +僅與2個稀疏矩陣一起使用。將2添加到矩陣中並不合理...... –

+0

@cad。那麼爲什麼'cout << 2 * A'有效? – chandresh

回答

3

添加一個標量的矩陣是相當於增加了標量每矩陣中的元素。在一個稀疏矩陣中,大多數元素都是零,並且沒有顯式存儲,這大大減少了內存使用量。

所以,增加一個標量到稀疏矩陣不明智,如在作用它會變成一個稀疏矩陣劃分成緻密矩陣,其失敗具有在稀疏矩陣的目的第一名(減少內存使用)。

鑑於上述觀察,看起來像犰狳開發人員通過簡單地不定義向稀疏矩陣添加標量來防止發生此問題。加入標量密集矩陣工程perfectly fine

0

它說他們的API正確的文件爲他們的API什麼'+'和' - '被設置做。我想你應該閱讀文檔,找出你想做什麼,然後提出這個問題。

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

符:+ - * /%== = < => = <>
重載運營商墊,VEC,rowvec和立方體類

含義:

'+'添加兩個物體
' - '從一個物體減去另一個物體或否定物體
'/'通過另一個對象或標量對象進行元素劃分
'*'兩個對象的矩陣乘法;並不適用於立方體類,除非標

根據你的錯誤是很明顯的,他們並沒有定義爲sp_mat和標量操作立方體倍增,他們將它定義爲sp_matsp_mat

我並不是假裝成這個話題的主人;我只是讀了API。你應該看看頭文件。

1

它根本不支持(還?)。自從文檔說 支持稀疏矩陣在這個版本是初步仍然有希望。

在此同時,您可以利用就地加法和減法,通過一個小矩陣視圖,例如,

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

我比我自己更喜歡這個答案,所以我刪除了我的。 – johnwbyrd