Я хочу использовать Эйген сделать некоторые расчеты в некотором коде 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), если я действительно должен назначить назад
спасибо! Но если Mc - это карта/представление, то в реальных вычислениях это строка-майор или col-major "matri Икс"? В моем коде я могу указать, что сама карта является строкой, а матрица Mc является столбцом-майором, что ясно для меня. – seam
Если вы объявляете 'Eigen :: Map Mc (...)' с 'Mrow', как указано выше, то' Mc' является строчным. И пока вы не смешиваете матрицы строк и столбцов в выражении, все вычисления будут выполняться с большой строкой (могут быть исключения для некоторых разложений). –
chtz
Вам не следует использовать 'auto' с Eigen: https://eigen.tuxfamily.org/dox/TopicPitfalls.html Мой код скомпилирован, но вернул неверный результат, и авто был виновником этого времени. –