Кусочек квадрата вектора, кусочно произведение двух векторов в 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
так как массив не несет в себе копию, поэтому он достаточно эффективен.