Применить функцию к разделу вектора броненосца - PullRequest
0 голосов
/ 28 мая 2019

Я хотел бы вычислить некоторые сводные функции (например, среднее) для секции столбца матрицы броненосца. Ключ не для создания временной копии данных.

Работает со всеми столбцами, используя 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 () - нет.

...