Кусочек квадрата вектора, кусочно произведение двух векторов в C++ Eigen

Конечно, v, a являются Eigen::VectorXd векторы с n размерами, я хотел бы сделать следующие кусочные операции:

  • Кусочное умножение v от aвектор (a[1]*v[1], ..., a[n]*v[n]), а также
  • Кусочный квадрат vвектор (v[1]*v[1], ..., v[n]*v[n]),

Есть ли Eigen предоставить методы для вышеперечисленных операций, или мне нужно реализовать их вручную? Есть конечно очень просто, но я бы хотел, чтобы они бегали как можно быстрее.

2 ответа

Решение

Ну, если вы запустили первый, второй - это особый случай, когда a=v,

Самый простой способ сделать первую операцию - создать диагональную матрицу из a и делает нормальный продукт.

Взглянув на документы, вы можете использовать a.asDiagonal(),

Что касается эффективности, возможно, это не то, что вам нужно, если вы хотите, чтобы это было "как можно быстрее". В этом случае вы должны сравнить это с циклом и векторной конструкцией, чтобы увидеть, есть ли для вас какое-либо практическое отличие.

Для работы с поэлементными операциями, такими как ваш вопрос, Eigen предоставляет Array учебный класс. Таким образом, для выполнения операций, о которых вы спрашивали, вы бы написали точечный продукт как:

c = a.array() * v.array(); // Long version
c = a.cwiseProduct(v);     // Short(er) version

а для квадрата у вас есть:

s = v.array().square();    // Probably what you want to use
s = v.array().abs2();      // Two operations: abs() then square()
s = v.cwiseAbs2();         // Same as above

Используя VectorXd так как массив не несет в себе копию, поэтому он достаточно эффективен.

Другие вопросы по тегам