在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
的特征库中是否有替代方案?大矩阵的大小各不相同,这意味着经典方法不起作用。我的意思是直接构造一个类似上述输出的矩阵。
答案 0 :(得分:0)
你的问题已经解决了!只需分别在http://eigen.tuxfamily.org/dox/classEigen_1_1DenseBase.html#a6f5fc5fe9d3fb70e62d4a9b1795704a8和http://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;
}