2016-08-17 9 views
0

Существует ли эффективный механизм копирования междуЭффективного копирования/литье большой матрицы станда :: вектор <станд :: вектор <double>> и армадилл АРМА :: мат

  std::vector<std::vector<double>> std_mat 
      arma::mat arma_mat 

где АРМОЙ :: мат arma_m относится к броненосцу матричная/математическая библиотека.

http://arma.sourceforge.net/

Мой проект зависит от двух отдельных библиотек сбора матрицы/данных, где матрица определяется, как указано выше, соответственно. Однако на определенном этапе конвейера обработки мне нужно скопировать друг друга, чтобы не нарушать устаревший код. Мне интересно, есть ли какой-то оператор литья от одного к другому (так что нам не нужно копировать), или если нет, эффективный механизм копирования (что-то похожее на концепцию vector.emplace_back). Сейчас я использую цикл double for, но я считаю, что он может быть более эффективным.

ответ

2

Возможно, вы избежите копирования, слегка изменив способ использования ваших векторов/памяти.

Если вы посмотрите на documentation

mat(ptr_aux_mem, n_rows, n_cols, copy_aux_mem = true, strict = false)

Создать матрицу, используя данные из записи вспомогательной (внешней) памяти, где ptr_aux_mem является указателем на память. По умолчанию матрица выделяет свою собственную память и копирует данные из вспомогательной памяти (для обеспечения безопасности). Однако, если для параметра copy_aux_mem установлено значение false, вместоматрица будет использовать вспомогательную память (т. Е. Копирование ); это быстрее, но может быть опасно, если вы не знаете, что вы делаете !

Если вы знаете, что ваша матрица имеет фиксированный размер, вы можете построить mat, предоставив кусок памяти. Будьте осторожны, что документация говорит, что:

элементы хранятся с столбцам заказа (столбец за столбцом т.)

+0

являются майоров колонки смежными или в куче? Смешивание облегчит, я думаю. Спасибо за совет. Я рассмотрю подробную документацию. – Pal

+0

кажется смежным, лучше взгляните на документы: –