gpt4 book ai didi

c++ - 如何构造分块对角矩阵

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:50:59 26 4
gpt4 key购买 nike

在 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 的 Eigen 库中是否有替代方案?大矩阵的大小各不相同,这意味着经典方法将行不通。我的意思是像前面提到的输出那样直接构造一个矩阵。

最佳答案

像一个简单的函数

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

关于c++ - 如何构造分块对角矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28950857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com