征:如何初始化一个稀疏矩阵与一些子稀疏矩阵

问题描述:

在本征,我们可以初始化与其他一些矩阵或矢量这样的矩阵或向量:征:如何初始化一个稀疏矩阵与一些子稀疏矩阵

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 

,但它并不适用于稀疏矩阵工作, 本征有内置初始化器吗?或者我需要自己写,如果是的话?怎么样?

+0

为了记录,我填写了一项功能请求:http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1420。这绝对是一个有用的功能。 – ggael

由于存储格式,您不能拥有这样的初始化程序。从手动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; 
}