2016-12-06 2 views
1

Я хочу использовать Эйген сделать некоторые расчеты в некотором коде C-стиле, интерфейс функции имеет необработанный указатель, как показано ниже,ли Эйген :: карта действительно «вид» семантического

#include <iostream> 
#include <memory> 
#include <Eigen/Dense> 

using namespace Eigen; 
typedef Eigen::Matrix<double, -1, -1, Eigen::RowMajor> Mrow; 

    void compute_with_Eigen(double * p_data, int row, int col) 
    {  
    // Q1: is there any data copy here? 
    Eigen::MatrixXd Mc = Eigen::Map<Mrow>(p_data, row, col); 

    // do computations with Mc, for example 
    auto M_temp = Mc.inverse(); 
    Mc = M_temp; 

    // Q2: why is this assign-back necessary? 
    Eigen::Map<Mrow>(p_data, row, col) = Mc; 
    } 

int main() 
{ 

std::unique_ptr<double[]> p(new double[10]); 
for (int i = 0; i < 9; ++i) 
{ 
p[i]=i+1.0; 
std::cout<<p[i]<<std::endl; 
} 

compute_with_Eigen(p.get(),3,3); 

std::cout<<"after inverse\n"; 
for (int i = 0; i < 10; ++i) 
    std::cout<<p[i]<<std::endl; 
} 

У меня есть Question1 потому что принятый ответ в этом thread предполагает наличие некоторой копии, однако в принципе «вид» не должен копировать ничего.

меня question2, потому что иначе результат не как ожидалось, однако это не как «вид» (также см это answer), если я действительно должен назначить назад

ответ

2

Q1 объявления:

Eigen::MatrixXd Mc = Eigen::Map<Mrow>(p_data, row, col); 

Это копирует временный Map в динамической матрице Mc. Если вы хотите, чтобы избежать этой копии, вы можете написать:

Eigen::Map<Mrow> Mc(p_data, row, col); 

Q2 объявления: Вы можете избежать этой копии, если вы объявите Mc как карту (как описано выше). Как вы его написали, вы копируете значения из MatrixXd Mc во временный Map.

Btw, написание

auto M_temp = Mc.inverse(); 
    Mc = M_temp; 

почти эквивалентно непосредственно писать

Mc = Mc.inverse(); 

потому auto M_temp это на самом деле не Матрица, но шаблон Expression, который будет вычислять обратное, когда он будет назначен на фактическая матрица (или M_temp.eval()).

+0

спасибо! Но если Mc - это карта/представление, то в реальных вычислениях это строка-майор или col-major "matri Икс"? В моем коде я могу указать, что сама карта является строкой, а матрица Mc является столбцом-майором, что ясно для меня. – seam

+0

Если вы объявляете 'Eigen :: Map Mc (...)' с 'Mrow', как указано выше, то' Mc' является строчным. И пока вы не смешиваете матрицы строк и столбцов в выражении, все вычисления будут выполняться с большой строкой (могут быть исключения для некоторых разложений). – chtz

+0

Вам не следует использовать 'auto' с Eigen: https://eigen.tuxfamily.org/dox/TopicPitfalls.html Мой код скомпилирован, но вернул неверный результат, и авто был виновником этого времени. –

0

Короткий ответ, что построить карту объект обычно не копирует. Однако последующие вычисления могут создавать копии или временные или оба.

Смежные вопросы