使用 Eigen 映射复杂矩阵
Mapping a complex matrix with Eigen
我有以下矩阵:
int N = 3;
complex<double>* complexvector = new complex<double>[N];
for(int i=0; i<N; i++)
{
complexvector[i]=complex<double>(i+1,i+1);
}
complex<double>** complexMatrix = new complex<double>*[N];
for(int i=0; i<N; i++)
{
complexMatrix[i] = new complex<double>[N];// allocate an array to each pointer
}
complexMatrix[0][0] = complex<double>(1,1);
complexMatrix[0][1] = complex<double>(2,2);
complexMatrix[0][2] = complex<double>(3,3);
complexMatrix[1][0] = complex<double>(4,4);
complexMatrix[1][1] = complex<double>(5,5);
complexMatrix[1][2] = complex<double>(6,6);
complexMatrix[2][0] = complex<double>(7,7);
complexMatrix[2][1] = complex<double>(8,8);
complexMatrix[2][2] = complex<double>(9,9);
complex<double>* returnvector = new complex<double>[N];
returnvector = preformcholesky(complexMatrix, complexvector, N);
我在这里做 Cholesky:
complex<double>* preformcholesky(complex<double>** matrix, complex<double>* vector,
int size)
{
std::cout << "start cholesky" << std::endl;
Map<MatrixXcd, RowMajor> mat(*matrix,size,size);
Map<VectorXcd> vec(vector,size);
printMatrix(matrix,size);
std::cout << "mat" << mat << std::endl;
std::cout << "vec" << vec << std::endl;
//mat.llt();
VectorXcd x = mat.llt().solve(vec);
std::cout << "coeff" << x << std::endl;
return x.data();
}
麻烦的是打印出来的时候"mat",是这样的:
mat (1,1) (0,3.21143e-322) (6,6)
(2,2) (4,4) (0,3.21143e-322)
(3,3) (5,5) (7,7)
那些 (0,3.21143e-322) 来自哪里?如果我打印 "matrix" 就可以了,所以我认为地图出错了。如果您需要更多代码,请告诉我。我是 Eigen 的新手,所以可能是一些基本错误。我正在使用 C++ 和 Linux.
该代码有几处错误。例如,performcholesky
的 return 值是指向局部变量的指针,在 performcholesky
已 returned 之后,该变量不再存在,并且您覆盖指向已分配的指针内存与这个悬挂指针,泄漏内存。为什么不直接与 Eigen::MatrixXcd
合作?稍后你会为自己省去调试所有痛苦的世界。
无论如何,您 运行 这次遇到的问题是 Eigen::Map
构造函数需要一个平面数组,而不是指向指针的指针。它是这样使用的:
// It would also work with naked new, but naked new leads to pain, fear, anger,
// and suffering. Also to long hours of debugging.
std::vector<std::complex<double> > data(N * N);
for(int i = 0; i < N * N; ++i) {
data[i] = std::complex<double>(i, i);
}
Eigen::Map<Eigen::MatrixXcd, Eigen::RowMajor> mat(&data[0], N, N);
一个有趣的问题是,为什么您没有传递给构造函数的两个数组在映射中显示出来,如果有些偏移的话。答案是:纯属偶然,new
给了你三个内存块,它们在堆上紧挨着彼此。这也解释了您在地图中看到的 st运行ge 人工制品;这些是相应分配块的堆实现的簿记数据,重新解释为 double
s。本质上,complexmatrix[0]
周围的内存是这样的:
the area that Eigen::Map uses
+-----------------------------------------------------------------+
|(1,1)|(2,2)|(3,3)|bookkeeping|(4,4)|(5,5)|(6,6)|bookkeeping|(7,7)|(8,8)|(9,9)|
+-----------------+ +-----------------+ +-----------------+
^-complexmatrix[0] ^-complexmatrix[1] ^-complexmatrix[2]
当然,这不是您可以依赖的行为。代码也可以显示任何 运行dom 数据,或者如果块 new
给你以不同的方式 ar运行ged 则出现段错误崩溃。
我有以下矩阵:
int N = 3;
complex<double>* complexvector = new complex<double>[N];
for(int i=0; i<N; i++)
{
complexvector[i]=complex<double>(i+1,i+1);
}
complex<double>** complexMatrix = new complex<double>*[N];
for(int i=0; i<N; i++)
{
complexMatrix[i] = new complex<double>[N];// allocate an array to each pointer
}
complexMatrix[0][0] = complex<double>(1,1);
complexMatrix[0][1] = complex<double>(2,2);
complexMatrix[0][2] = complex<double>(3,3);
complexMatrix[1][0] = complex<double>(4,4);
complexMatrix[1][1] = complex<double>(5,5);
complexMatrix[1][2] = complex<double>(6,6);
complexMatrix[2][0] = complex<double>(7,7);
complexMatrix[2][1] = complex<double>(8,8);
complexMatrix[2][2] = complex<double>(9,9);
complex<double>* returnvector = new complex<double>[N];
returnvector = preformcholesky(complexMatrix, complexvector, N);
我在这里做 Cholesky:
complex<double>* preformcholesky(complex<double>** matrix, complex<double>* vector,
int size)
{
std::cout << "start cholesky" << std::endl;
Map<MatrixXcd, RowMajor> mat(*matrix,size,size);
Map<VectorXcd> vec(vector,size);
printMatrix(matrix,size);
std::cout << "mat" << mat << std::endl;
std::cout << "vec" << vec << std::endl;
//mat.llt();
VectorXcd x = mat.llt().solve(vec);
std::cout << "coeff" << x << std::endl;
return x.data();
}
麻烦的是打印出来的时候"mat",是这样的:
mat (1,1) (0,3.21143e-322) (6,6)
(2,2) (4,4) (0,3.21143e-322)
(3,3) (5,5) (7,7)
那些 (0,3.21143e-322) 来自哪里?如果我打印 "matrix" 就可以了,所以我认为地图出错了。如果您需要更多代码,请告诉我。我是 Eigen 的新手,所以可能是一些基本错误。我正在使用 C++ 和 Linux.
该代码有几处错误。例如,performcholesky
的 return 值是指向局部变量的指针,在 performcholesky
已 returned 之后,该变量不再存在,并且您覆盖指向已分配的指针内存与这个悬挂指针,泄漏内存。为什么不直接与 Eigen::MatrixXcd
合作?稍后你会为自己省去调试所有痛苦的世界。
无论如何,您 运行 这次遇到的问题是 Eigen::Map
构造函数需要一个平面数组,而不是指向指针的指针。它是这样使用的:
// It would also work with naked new, but naked new leads to pain, fear, anger,
// and suffering. Also to long hours of debugging.
std::vector<std::complex<double> > data(N * N);
for(int i = 0; i < N * N; ++i) {
data[i] = std::complex<double>(i, i);
}
Eigen::Map<Eigen::MatrixXcd, Eigen::RowMajor> mat(&data[0], N, N);
一个有趣的问题是,为什么您没有传递给构造函数的两个数组在映射中显示出来,如果有些偏移的话。答案是:纯属偶然,new
给了你三个内存块,它们在堆上紧挨着彼此。这也解释了您在地图中看到的 st运行ge 人工制品;这些是相应分配块的堆实现的簿记数据,重新解释为 double
s。本质上,complexmatrix[0]
周围的内存是这样的:
the area that Eigen::Map uses
+-----------------------------------------------------------------+
|(1,1)|(2,2)|(3,3)|bookkeeping|(4,4)|(5,5)|(6,6)|bookkeeping|(7,7)|(8,8)|(9,9)|
+-----------------+ +-----------------+ +-----------------+
^-complexmatrix[0] ^-complexmatrix[1] ^-complexmatrix[2]
当然,这不是您可以依赖的行为。代码也可以显示任何 运行dom 数据,或者如果块 new
给你以不同的方式 ar运行ged 则出现段错误崩溃。