Итак, после этого я могу создать проблему только с созданием объекта A_arma
. Объект здесь получает нечетное значение, указывающее, что отображение памяти было плохим. Я думаю об этом, потому что он копируется в функцию вместо справочного обновления. Первоначальный ответ показал манипуляцию в рамках функции с ограничением, которая позволяла повторно использовать ссылку и память.
В частности, из документов armadillo
на расширенные ctors :
Создать матрицу, используя данные из записываемой вспомогательной (внешней) памяти, где ptr_aux_mem равноуказатель на память. По умолчанию матрица выделяет собственную память и копирует данные из вспомогательной памяти (для безопасности). Однако, если для copy_aux_mem задано значение false, матрица вместо этого будет напрямую использовать вспомогательную память (т.е. без копирования);это быстрее, но может быть опасно, если вы не знаете, что делаете!
Последняя часть - мой акцент.
Итак, здесь, под прохождениемКопировать парадигму, объект должен быть полностью скопирован против обновления ссылки, если вы пишете общую функцию приведения.
arma::mat matrixxd_to_armamat(Eigen::MatrixXd eigen_A) {
arma::mat arma_B = arma::mat(eigen_A.data(), eigen_A.rows(), eigen_A.cols(),
true, // changed from false to true.
false);
return arma_B;
}
Теперь, если у вас все в порядке со ссылкой на исходный объект Eigen
через ссылку, тогда это должно работать:
arma::mat matrixxd_to_armamat2(Eigen::MatrixXd& eigen_A) {
arma::mat arma_B = arma::mat(eigen_A.data(), eigen_A.rows(), eigen_A.cols(),
false, false);
return arma_B;
}
Запуск обоих выходов:
tester()
# 1 -1
# 2 -2
# 1.0000 -1.0000
# 2.0000 -2.0000
#
# 1.0000 -1.0000
# 2.0000 -2.0000
#
# [,1] [,2]
#[1,] 1 -1
#[2,] 2 -2