我知道要在Matlab中生成块对角矩阵,命令blkdiag
会生成这样一个矩阵:
现在我面临生成相同的块对角矩阵,但在上对角线上也有矩阵元素B_1
,B_2
,...,B_{n-1}
,其他地方为0:
P.S。我diag
命令,使用diag(A,k)
返回k
对角线。我需要在矩阵中写入内容,k
> 0,对于块矩阵,不仅需要元素。
答案 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