【发布时间】:2016-10-05 09:08:44
【问题描述】:
我正在通过 Matlab 的 mex 函数使用 Eigen 求解器求解线性代数方程 Ax = b。给定一个来自 Matlab 工作区的复杂稀疏矩阵 A 和一个稀疏向量 b,我想以 Eigen 稀疏矩阵格式映射矩阵 A 和向量 b。之后,我需要使用 Eigen 的线性方程求解器来求解它。最后,我需要将结果 x 传输到 Matlab 工作区。
但是,由于我不擅长 C++,也不熟悉 Eigen。我被困在第一步,即以 Eigen 接受的格式构建复杂的稀疏矩阵。
我发现Eigen中有以下功能,
Eigen::MappedSparseMatrix<double,RowMajor> mat(rows, cols, nnz, row_ptr, col_index, values);
我可以使用 mxGetPr、mxGetPi、mxGetIr、mxGetJc 等这些 mex 函数来获取上述“rows、cols、nnz、row_ptr、col_index、values”的信息。但是,由于在我的例子中,矩阵 A 是一个复杂的稀疏矩阵,我不确定“MappedSparseMatrix”是否可以做到这一点。
如果可以,“MappedSparseMatrix”的格式应该是怎样的?以下是正确的吗?
Eigen::MappedSparseMatrix<std::complex<double>> mat(rows, cols, nnz, row_ptr, col_index, values_complex);
如果是这样,我应该如何构造 values_complex ? 我之前发现过relevant topic。我可以使用下面的代码得到一个复杂的密集矩阵。
MatrixXcd mat(m,n);
mat.real() = Map<MatrixXd>(realData,m,n);
mat.imag() = Map<MatrixXd>(imagData,m,n);
但是,由于我的矩阵 A 是一个稀疏矩阵,如果我将 mat 定义为如下所示的复杂稀疏矩阵,它似乎会产生错误:
SparseMatrix<std::complex<double> > mat;
mat.real() = Map<SparseMatrix>(rows, cols, nnz, row_ptr, col_index, realData);
mat.imag() = Map<SparseMatrix>(rows, cols, nnz, row_ptr, col_index, imagData);
那么有人可以为此提供一些建议吗?
【问题讨论】: