使用Blaze最快的按列进行L2范数计算

时间:2019-03-26 02:23:37

标签: c++ performance matrix

我在Blaze中有一个密集的DynamicMatrix,大小约为3000 x 300,为此,我必须计算每列的L2 norm

例如:

#include <blaze/Blaze.h>
using namespace blaze;

DynamicMatrix<double,columnMajor> A {{1, 2, 3}, 
                                     {4, 5, 6}, 
                                     {7, 8, 9}};

// desired output: ( 8.12404 9.64365 11.225 )

但是Blaze似乎没有“最明显”的方法来执行此操作,因为至少在我发现的范围内,无法在轴上指定规范函数。用Blaze执行此计算的最有效方法是什么?我能比下面的第二种方法更好吗?


我的方法

  1. 对我而言,最自然的方法是计算每一列的范数:

    DynamicVector<double, rowVector> result(A.columns());
    for (size_t i = 0; i < result.size(); ++i)
        result2[i] = norm(column(A, i));
    
  2. 有趣的是,这似乎使我的输入大小更快,但仍然感觉不正确:

    DynamicVector<double, rowVector> result = sqrt(sum<columnwise>(A % A));
    

我正在使用GCC 8.3 -O3 -std=c++2a -fopenmp -mmmx -mavx -mavx2 -mfma进行编译。

0 个答案:

没有答案