2011-08-26 80 views
2

如何在boost :: numeric :: ublas矩陣上應用1級blas? 例如,我想計算所有條目的最大條目或總和。 在矩陣中使用norm_1或norm_inf不會產生編譯器錯誤,但返回(對我來說)任意結果。 我使用升壓1.42在矩陣中應用Boost UBLAS blas-1

回答

3

norm_inf上的矩陣計算由在下層向量空間中的無窮範數的矩陣範數induced。這恰好是矩陣的最大絕對行總和。

如果你看一下漢納斯的例子,矩陣的最後一行(I = 99,J = 0 ... 99)包含:

9900, 9901, 9902, ... , 9999 

如果你總結這些條目,你得到994950,這正是norm_inf產生的結果。

+0

很高興知道。這是記錄在哪裏?我沒有找到它。 你知道如何計算所有條目的最大值嗎?使用你的帖子可以完成一個重塑,但這似乎有點奇怪。 –

+0

@Andreas:假設矩陣在內存中是連續佈局的(很可能,但我不知道uBLAS是否能保證這一點 - 其他人將不得不考慮這一點),我們可能會構建一個矢量對象由相同的存儲支持,並調用'norm_inf'。醜陋,但我想它會奏效。 –

+0

不,我找不到任何實際的文檔,但它是有道理的,並匹配行爲。實際上,粗略的搜索根本沒有發現很多關於uBLAS的文檔。 –

1

一個最小的例子是這樣的:

#include<iostream> 
    #include<boost/numeric/ublas/matrix.hpp> 
    using namespace boost::numeric::ublas; 
    int main(){ 
      int l = 100; 
      matrix<double> m(l,l); 
      for (int i = 0; i < l; ++i) { 
        for (int j = 0; j < l; ++j) { 
          m(i,j)=i*l+j; 
        } 
      } 
      std::cout << norm_inf(m)<<std::endl; 
      return 0; 
    } 

它應該給99,但單產994950.

這是一個班輪,至少解決了給定的任務:

float infnorm = accumulate(m.data().begin(),m.data().end(),0,std::max<double>); 
+0

我不認爲單線實際工作;提問者想要最大*絕對*條目。 –