Matlab中的扩展块对角矩阵

4
我知道在Matlab中生成块对角矩阵的命令是 blkdiag,它可以生成这样的矩阵:

enter image description here

现在我需要生成相同的分块对角矩阵,但是还需要在上对角线上添加矩阵元素B_1, B_2,..., B_{n-1},其他位置都是零:

enter image description here

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

附言:我使用diag命令,它使用diag(A,k)返回第k个对角线。我需要写入矩阵的内容,对于k>0和块矩阵,而不仅仅是元素。

2个回答

7
在文件交换中有一个可以完成此操作的提交: (块)三对角矩阵
您提供该函数三个 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

这似乎是我正在寻找的! - titus.andronicus

3

这可以是一种基于krontriltriu的方法-

%// 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}]

对于 2 x 2 大小的矩阵,使用 k = 1 进行样本运行 -

>> A{:}
ans =
    0.3467    0.7966
    0.6228    0.7459
ans =
    0.1255    0.0252
    0.8224    0.4144
ans =
    0.7314    0.3673
    0.7814    0.7449
ans =
    0.8923    0.1296
    0.2426    0.2251
>> B{:}
ans =
    0.3500    0.9275
    0.2871    0.0513
ans =
    0.5927    0.8384
    0.1629    0.1676
ans =
    0.5022    0.3554
    0.9993    0.0471
>> out
out =
    0.3467    0.7966    0.3500    0.9275         0         0         0         0
    0.6228    0.7459    0.2871    0.0513         0         0         0         0
         0         0    0.1255    0.0252    0.5927    0.8384         0         0
         0         0    0.8224    0.4144    0.1629    0.1676         0         0
         0         0         0         0    0.7314    0.3673    0.5022    0.3554
         0         0         0         0    0.7814    0.7449    0.9993    0.0471
         0         0         0         0         0         0    0.8923    0.1296
         0         0         0         0         0         0    0.2426    0.2251

第k个对角线上的元素可以使用diag(elements,k)进行设置。但问题是关于分块对角矩阵,即A1、A2等本身就是矩阵。 - hbaderts
@Divarak,是的,我指的是块矩阵,而不是元素!无论如何,谢谢 :) - titus.andronicus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接