Учитывая, что Eigen позволяет распараллеливать вычисления с помощью MKL, OpenMP или AVX, часто считается лучшей практикой избегать итераций, когда это возможно, поскольку их невозможно полностью оптимизировать на уровне библиотеки. Мне было интересно, можно ли каким-то образом использовать .rowwise() вместо перебора строк в следующем фрагменте кода, вычисляющего функцию принятия решения для обученной SVM с ядром RBF для трюка ядра:
Учитывая, что Eigen позволяет распараллеливать вычисления с помощью MKL, OpenMP или AVX, часто считается лучшей практикой избегать итераций, когда это возможно, поскольку их невозможно полностью оптимизировать на уровне библиотеки. Мне было интересно, можно ли каким-то образом использовать .rowwise() вместо перебора строк в следующем фрагменте кода, вычисляющего функцию принятия решения для обученной SVM с ядром RBF для трюка ядра: [code]#include #include
Eigen::VectorXd decision_function(const Eigen::MatrixXd& Train, const Eigen::MatrixXd& Test, const Eigen::VectorXd& lambdas, double gamma, double b) { Eigen::VectorXd result = Eigen::VectorXd::Zero(Test.rows()); for (int i = 0; i < Test.rows(); ++i) { Eigen::VectorXd v = (-gamma * ((Train).rowwise() + (-Test).row(i)).rowwise() .squaredNorm()) .array() .exp(); result(i) = v.transpose() * lambdas; } return result.array() + b; }