从MATLAB工作空间

时间:2016-10-05 09:08:44

标签: eigen eigen3

我正致力于通过Matlab的Ax = b函数使用特征求解器来求解线性代数方程mex。给定一个复杂的稀疏矩阵A和一个来自Matlab工作空间的稀疏矢量b,我想用特征稀疏矩阵格式映射矩阵A和矢量b。之后,我需要使用Eigen的线性方程求解器来解决它。最后,我需要将结果x传递给Matlab工作区。

然而,由于我不擅长C ++并且不熟悉Eigen。我陷入了第一步,即以特征接受格式构造复杂稀疏矩阵。

我发现Eigen中有以下功能,

Eigen::MappedSparseMatrix<double,RowMajor>  mat(rows, cols, nnz, row_ptr, col_index, values);

我可以使用mxGetPr,mxGetPi,mxGetIr,mxGetJc等这些mex函数来获取上述&#34; rows,cols,nnz,row_ptr,col_index,values&#34;的信息。但是,因为在我的情况下,矩阵A是一个复杂的稀疏矩阵,我不确定是否&#34; MappedSparseMatrix&#34;可以那样做。

如果可以的话,&#34; MappedSparseMatrix&#34;的格式如何?应该 ?以下是否正确?

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);

那么有人可以为此提供一些建议吗?

1 个答案:

答案 0 :(得分:0)

MatlLab将复杂条目存储在两个独立的缓冲区中:一个用于实际组件,另一个用于虚构组件,而Eigen需要它们交错:

value_ptr = [r0,i0,r1,i1,r2,i2,...]

以便与std::complex<>兼容。因此,在您的情况下,您必须创建一个临时缓冲区,其中包含以交错格式传递给MappedSparseMatrix的值,或者,如果使用Eigen 3.3,则传递给Map<SparseMatrix<double,RowMajor> >

此外,您必须调整索引的缓冲区,使它们从零开始。为此,在将它们传递给Eigen之前将col_ptr和row_ptr的所有条目递减1,然后将它们递增1。