У меня есть плотный DynamicMatrix
в Blaze размером примерно 3000
x 300
, для которого я должен вычислить L2-норму каждого столбца.
Для меньшего примера:
#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
.