我在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执行此计算的最有效方法是什么?我能比下面的第二种方法更好吗?
我的方法
对我而言,最自然的方法是计算每一列的范数:
DynamicVector<double, rowVector> result(A.columns());
for (size_t i = 0; i < result.size(); ++i)
result2[i] = norm(column(A, i));
有趣的是,这似乎使我的输入大小更快,但仍然感觉不正确:
DynamicVector<double, rowVector> result = sqrt(sum<columnwise>(A % A));
我正在使用GCC 8.3 -O3 -std=c++2a -fopenmp -mmmx -mavx -mavx2 -mfma
进行编译。