2011-08-26 66 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

我不认为单线实际工作;提问者想要最大*绝对*条目。 –