Matlab中的扩展块对角矩阵

时间:2015-02-19 08:08:48

标签: matlab matrix diagonal

我知道要在Matlab中生成块对角矩阵,命令blkdiag会生成这样一个矩阵:

enter image description here

现在我面临生成相同的块对角矩阵,但在上对角线上也有矩阵元素B_1B_2,...,B_{n-1},其他地方为0:

enter image description here

  • 我想这可以用循环硬编码,但我想找到一个更优雅的解决方案。关于如何实现这样的事情的任何想法?

P.S。我diag命令,使用diag(A,k)返回k对角线。我需要在矩阵中写入内容,k> 0,对于块矩阵,不仅需要元素。

2 个答案:

答案 0 :(得分:7)

文件交换上有一个提交可以执行此操作: (Block) tri-diagonal matrices

您为该功能提供了三个3D阵列,3D阵列的每一层代表一个主要,次要或超对角线的块。 (这意味着块必须具有相同的大小。)结果将是一个稀疏矩阵,因此它在内存方面应该相当有效。

示例用法是:

As = bsxfun(@times,ones(3),permute(1:3,[3,1,2]));
Bs = bsxfun(@times,ones(3),permute(10:11,[3,1,2]));
M = blktridiag(As, zeros(size(Bs)), Bs);

full(M)给你的地方:

 1     1     1    10    10    10     0     0     0
 1     1     1    10    10    10     0     0     0
 1     1     1    10    10    10     0     0     0
 0     0     0     2     2     2    11    11    11
 0     0     0     2     2     2    11    11    11
 0     0     0     2     2     2    11    11    11
 0     0     0     0     0     0     3     3     3
 0     0     0     0     0     0     3     3     3
 0     0     0     0     0     0     3     3     3

答案 1 :(得分:3)

这可能是一种基于 kron tril & triu -

%// Take all A1, A2, A3, etc in a cell array for easy access and same for B
A = {A1,A2,A3,A4}
B = {B1,B2,B3}

%// Setup output array with the A blocks at main diagonal
out = blkdiag(A{:})

%// logical array with 1s at places where kth diagonal elements are to be put
idx = kron(triu(true(numel(A)),k) & tril(true(numel(A)),k),ones(size(A{1})))>0

%// Put kth diagonal blocks using the logical mask
out(idx) = [B{1:numel(A)-k}]

针对k = 1尺寸矩阵的<{1}}运行示例 -

2 x 2