征:如何初始化一个稀疏矩阵与一些子稀疏矩阵
问题描述:
在本征,我们可以初始化与其他一些矩阵或矢量这样的矩阵或向量:征:如何初始化一个稀疏矩阵与一些子稀疏矩阵
MatrixXf matA(2, 2);
matA << 1, 2, 3, 4;
MatrixXf matB(4, 4);
matB << matA, matA/10, matA/10, matA;
std::cout << matB << std::endl;
什么我想要实现:
SparseMatrix<double> matA(2, 2);
matA.coeffRef(0, 0) = 1;
matA.coeffRef(1, 1) = 1;
SparseMatrix<double> matB(4, 4);
matB << matA, matA/10, matA/10, matA;
std::cout << matB << std::endl;
然后我得到一个矩阵是这样的:
1 0 0.1 0
0 1 0 0.1
0.1 0 1 0
0 0.1 0 0.1
,但它并不适用于稀疏矩阵工作, 本征有内置初始化器吗?或者我需要自己写,如果是的话?怎么样?
答
由于存储格式,您不能拥有这样的初始化程序。从手动Sparse matrix manipulations > Block operations:
然而,由于性能的原因,写入到子稀疏矩阵是有限得多,并且目前仅邻接套列的列优先(相应的(相应的行。)。行 - 主)SparseMatrix是可写的。而且,这些信息必须在编译时知道,而忽略了block(...)和corner *(...)等方法。
您唯一的选择是将所有内容都转换为密集矩阵,使用逗号初始值设定项并将其转换为稀疏矩阵。
#include <iostream>
#include <Eigen/Sparse>
using namespace Eigen;
typedef SparseMatrix<double> SparseMatrixXd;
int main()
{
SparseMatrixXd matA(2, 2);
matA.coeffRef(0, 0) = 1;
matA.coeffRef(1, 1) = 1;
SparseMatrixXd matB(4, 4);
MatrixXd matC(4,4);
matC <<
MatrixXd(matA),
MatrixXd(matA)/10,
MatrixXd(matA)/10,
MatrixXd(matA);
matB = matC.sparseView();
std::cout << matB << std::endl;
}
或者,您可以使用不支持的Kronecker产品模块作为此确切示例。
#include <iostream>
#include <Eigen/Sparse>
#include <unsupported/Eigen/KroneckerProduct>
using namespace Eigen;
typedef SparseMatrix<double> SparseMatrixXd;
int main()
{
SparseMatrixXd matA(2, 2);
matA.coeffRef(0, 0) = 1;
matA.coeffRef(1, 1) = 1;
SparseMatrixXd matB(4, 4);
matB =
kroneckerProduct((MatrixXd(2,2) << 1,0,0,1).finished(), matA) +
kroneckerProduct((MatrixXd(2,2) << 0,1,1,0).finished(), matA/10);
std::cout << matB << std::endl;
}
为了记录,我填写了一项功能请求:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1420。这绝对是一个有用的功能。 – ggael