繁体   English   中英

如何构造块对角矩阵

[英]how to construct block diagonal matrix

在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

Eigen库中是否有blkdiag的替代方法? 大矩阵的大小各不相同,这意味着经典方法将行不通。 我的意思是直接构造一个类似于上述输出的矩阵。

您的问题已经解决! 只需分别在http://eigen.tuxfamily.org/dox/classEigen_1_1DenseBase.html#a6f5fc5fe9d3fb70e62d4a9b1795704a8http://eigen.tuxfamily.org/dox/classEigen_14c448844a86489c4a86489a46b3e4b3e4b3e4b3e4b3e4b8e4b8e4b3e8b4e8b8e8b8e8b8e8b8e8b8c8b4e8b4c8b4e8b3d8c8e81b3d3c效果网

您所要做的就是为这些位置分配一个矩阵,大致像这样:

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

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

同样的右下角,除非你想翻转矩阵(尝试方法.reverse().transpose()以获得所需的翻页效果), a复制它那里。

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

一个简单的功能,如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM