Броненосец: получить необработанные данные из матрицы/вектора в виде массива

Я ищу что-то вроде этого:

fmat A     = randu<fmat>(4,5);
float **a  = A.to_array();     // Return matrix as float**

Кто-нибудь знает, как это можно сделать в Armadillo?


person Stefan Falk    schedule 03.06.2014    source источник
comment
Двойной указатель (например, float**) — одна из худших вещей, унаследованных C++ от C. Лучше не использовать такую ​​функциональность в любом новом коде. Это небезопасно, и для правильного отслеживания требуется много стандартного кода. Вы избавите себя от многих головных болей, не используя его. Если вам нужно передавать данные, лучше вместо этого передавать ссылки на fmat объекты. Например, void fn(const fmat& A)   -  person mtall    schedule 04.06.2014
comment
Привет @mtall, причина, по которой я использую это, заключается в том, что я хочу передать необработанную матрицу функции CUDA, которая ожидает float**.   -  person Stefan Falk    schedule 08.06.2014
comment
Если вам нужно умножение матриц на основе графического процессора, используйте Armadillo с nvBLAS вместо стандартного BLAS. Как правило, использование графического процессора для умножения матриц полезно только для размеров матриц более 5000x5000.   -  person mtall    schedule 10.06.2014


Ответы (1)


Нет функции для возврата массива указателей. Вы можете получить доступ к базовому буферу с помощью memptr() метода:

float *a = A.memptr();

Вы также можете получить указатель на любой столбец матрицы с помощью метода colptr(). Я не уверен, зачем вам может понадобиться массив указателей, но вы можете создать такой (нескомпилированный и непроверенный код):

std::vector<float *> av;
av.reserve(A.n_cols);
for (unsigned int i = 0; i < A.n_cols; ++i)
   av.push_back() = A.colptr(i);

float **a = &av[0]; // a remains valid while av is in scope

Обратите внимание, что Armadillo хранит данные в порядке столбцов.

person rhashimoto    schedule 03.06.2014
comment
Спасибо. Вы имеете в виду под can, что в какой-то момент это может быть небезопасно? :) - person Stefan Falk; 08.06.2014
comment
В документах указано, что использование memptr() не рекомендуется, если вы не знаете, что делаете. Но я только подчеркивал, что хотя функции, которая делала бы именно то, что вы хотели, не было, был другой способ получить доступ к необработанной памяти. - person rhashimoto; 08.06.2014
comment
Хорошо, понял. Благодарю вас! - person Stefan Falk; 08.06.2014