如何构造块对角矩阵

时间:2015-03-09 20:07:49

标签: c++ matlab eigen3

在Matlab中,此函数blkdiag构造块对角矩阵。例如,如果我有

a = [ 2,     2;
      2,     2]

然后blkdiag(a,a)将返回此输出

>> blkdiag(a,a)

ans =

     2     2     0     0
     2     2     0     0
     0     0     2     2
     0     0     2     2

blkdiag的特征库中是否有替代方案?大矩阵的大小各不相同,这意味着经典方法不起作用。我的意思是直接构造一个类似上述输出的矩阵。

2 个答案:

答案 0 :(得分:0)

你的问题已经解决了!只需分别在http://eigen.tuxfamily.org/dox/classEigen_1_1DenseBase.html#a6f5fc5fe9d3fb70e62d4a9b1795704a8http://eigen.tuxfamily.org/dox/classEigen_1_1DenseBase.html#a2b9618f3c9eb4d4c9813ae8f6a8e70c5中查看topleftcorner和bottomrightcorner的本征文档。

你所要做的就是为这些地方分配一个矩阵,或多或少是这样的:

//假设A是结果并且分配了正确的大小,并且a是您拥有的矩阵。

A.topLeftCorner(a.rows(),a.cols())=a;

右下角相同,除非你想要翻转矩阵(尝试方法.reverse().transpose()以获得所需的翻转效果)a然后再将其复制到其中。

您还可以尝试使用.block()函数来更好地处理矩阵。

答案 1 :(得分:0)

这样的简单功能
MatrixXd blkdiag(const MatrixXd& a, int count)
{
    MatrixXd bdm = MatrixXd::Zero(a.rows() * count, a.cols() * count);
    for (int i = 0; i < count; ++i)
    {
        bdm.block(i * a.rows(), i * a.cols(), a.rows(), a.cols()) = a;
    }

    return bdm;
}

完成这项工作。

如果参数子矩阵a可以是固定大小或动态大小或表达式,那么以下是更好的选择

template <typename Derived>
MatrixXd blkdiag(const MatrixBase<Derived>& a, int count)
{
    MatrixXd bdm = MatrixXd::Zero(a.rows() * count, a.cols() * count);
    for (int i = 0; i < count; ++i)
    {
        bdm.block(i * a.rows(), i * a.cols(), a.rows(), a.cols()) = a;
    }

    return bdm;
}