Эффективное копирование / приведение больших матриц std:: vector<std:: vector <double >> и armadillo arma::mat
Есть ли эффективный механизм копирования между
std::vector<std::vector<double>> std_mat
arma::mat arma_mat
где arma::mat arma_mat относится к матричной / математической библиотеке броненосца.
Мой проект зависит от двух отдельных матриц / библиотек сбора данных, где матрица определена, как указано выше, соответственно. Однако на определенном этапе конвейера обработки мне нужно копировать один на другой, чтобы избежать взлома унаследованного кода. Мне интересно, есть ли какой-нибудь оператор приведения из одного в другой (поэтому нам не нужно копировать) или, если нет, эффективный механизм копирования (что-то похожее на концепцию vector.emplace_back). Прямо сейчас я использую двойной цикл for, но я считаю, что он может быть более эффективным.
1 ответ
Вы, вероятно, можете избежать копирования, немного изменив способ использования векторов / памяти.
Если вы посмотрите на документацию
mat(ptr_aux_mem, n_rows, n_cols, copy_aux_mem = true, strict = false)
Создайте матрицу, используя данные из записываемой вспомогательной (внешней) памяти, где ptr_aux_mem - указатель на память. По умолчанию матрица выделяет собственную память и копирует данные из вспомогательной памяти (для безопасности). Однако, если для copy_aux_mem задано значение false, матрица вместо этого будет напрямую использовать вспомогательную память (т.е. без копирования); это быстрее, но может быть опасно, если вы не знаете, что делаете!
Если вы знаете, что ваша матрица имеет фиксированный размер, вы можете построить mat
предоставляя кусок памяти. Будьте осторожны, что в документации сказано, что:
Элементы хранятся с упорядочением по главному столбцу (т.е. столбец за столбцом)