Я хотел бы вычислить некоторые сводные функции (например, среднее) для секции столбца матрицы броненосца. Ключ не для создания временной копии данных.
Работает со всеми столбцами, используя unsafe_col
:
arma::mat x;
double d = mean(x.unsafe_col(0));
Чтобы получить сечение вектора, я мог бы использовать:
x.col(0).subvec(0,100);
Однако, это создает копию векторных данных, которых я хочу избежать.
Каков наиболее эффективный способ применения функций, предоставляемых броненосцем, к секциям векторов столбцов? Производительность абсолютно критична в этих приложениях.
Один из способов, который я нашел, состоял в том, чтобы создать вектор с указателями на основную память, используя так называемый « продвинутый конструктор » в документации броненосца, но сначала заставив указатели удвоиться для начала столбца и добавление смещений для начала и конца только для создания более короткого вектора выглядит довольно странно ...
ОБНОВЛЕНИЕ: Вот пример поведения:
#include <armadillo>
#include <iostream>
arma::mat m( {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}});
const arma::vec view1() {
return m.unsafe_col(0).subvec(0,2);
}
const arma::vec view2() {
double *start = &m[0,0];
const int n = 3;
return arma::vec(start, 3, false, false);
}
int main() {
std::cout << &m(0,0) << " " << &m(1,0) << " " << &m(0,1) << std::endl;
auto v1(view1());
auto v2(view2());
std::cout << &v1(0) << std::endl;
std::cout << &v2(0) << std::endl;
return 0;
}
, который возвращает, например:
0x56419b070170 0x56419b070178 0x56419b070190
0x7ffcb36f7510
0x56419b070170
Итак, view1 () создал копию, а view2 () - нет.