[英]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#a6f5fc5fe9d3fb70e62d4a9b1795704a8和http://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.