2014-02-04 2 views
4

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

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

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

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

Спасибо.

ответ

5

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

2

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

2

Самый быстрый способ получить данные матрицы в формате массива - использовать метод 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 указал.

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

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

Смежные вопросы