Я ищу что-то вроде этого:
fmat A = randu<fmat>(4,5);
float **a = A.to_array(); // Return matrix as float**
Кто-нибудь знает, как это можно сделать в Armadillo
?
Я ищу что-то вроде этого:
fmat A = randu<fmat>(4,5);
float **a = A.to_array(); // Return matrix as float**
Кто-нибудь знает, как это можно сделать в Armadillo
?
Нет функции для возврата массива указателей. Вы можете получить доступ к базовому буферу с помощью 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 хранит данные в порядке столбцов.
memptr()
не рекомендуется, если вы не знаете, что делаете. Но я только подчеркивал, что хотя функции, которая делала бы именно то, что вы хотели, не было, был другой способ получить доступ к необработанной памяти.
- person rhashimoto; 08.06.2014
float**
) — одна из худших вещей, унаследованных C++ от C. Лучше не использовать такую функциональность в любом новом коде. Это небезопасно, и для правильного отслеживания требуется много стандартного кода. Вы избавите себя от многих головных болей, не используя его. Если вам нужно передавать данные, лучше вместо этого передавать ссылки наfmat
объекты. Например,void fn(const fmat& A)
- person mtall   schedule 04.06.2014float**
. - person Stefan Falk   schedule 08.06.2014