Броненосец - как извлечь строки?

Я использую библиотеку Armadillo C++ для матриц.

Я хотел бы скопировать некоторые строки во внешний массив (мне нужно скопировать их на GPU). Есть ли быстрый способ сделать это?

Если я использую .rows , это дает мне подвид без доступа к указателям данных, поэтому я должен перебирать значения и копировать их одно за другим. Это очень медленно.

Есть ли другой вариант?

Спасибо.


person Ran    schedule 04.02.2014    source источник


Ответы (3)


Armadillo хранит данные столбец за столбцом (для совместимости с LAPACK), поэтому извлечение столбцов через .colptr() является предпочтительным подходом. Вы можете реорганизовать свой код, чтобы ваши данные хранились столбец за столбцом, а не строка за строкой. Одним из способов грубой силы для достижения этого является транспонирование матрицы.

person mtall    schedule 04.02.2014

Возможный способ скопировать некоторые строки во внешний массив — использовать функцию .rows и назначить результирующее подпредставление в виде матрицы. Затем вы можете легко получить доступ к необработанным данным этой матрицы. Вы также можете транспонировать эту матрицу, если вам нужны данные по строкам.

person alibaba    schedule 31.07.2014

Самый быстрый способ получить данные матрицы в формате массива — использовать метод memptr(). Он возвращает указатель на массив в стиле C, содержащий матричные данные. Итак, если у вас есть Mat<double> размера n на n, этот метод дает вам указатель на массив double длины n*n.

int n=10;
Mat<double> M(n,n,fill::rand);
double* arr = M.memptr();

если вы затем перейдете через arr, вы получите элементы в порядке столбцов, как указал mtall.

И наоборот, вы можете очень эффективно использовать уже существующий массив данных для инициализации матрицы или даже просто использовать объект матрицы в качестве интерфейса для выполнения некоторых преобразований линейной алгебры в вашем массиве (например, произведение матрицы-вектора). Для этого загляните в расширенный конструктор ковриков.

Это особенно полезно для итерационных методов, таких как Lanczos/Arnoldi или методы, связанные с сопряженным градиентом, и у вас есть реализация тех, которые работают с массивами в стиле C. Затем вы можете просто привязать эти массивы к объектам arma без копирования для выполнения преобразований.

person Darkdragon84    schedule 28.01.2016