Matlab中的扩展块对角矩阵
我知道,要在Matlab中生成块对角矩阵,命令Matlab中的扩展块对角矩阵,matlab,matrix,diagonal,Matlab,Matrix,Diagonal,我知道,要在Matlab中生成块对角矩阵,命令blkdiag会生成这样一个矩阵: 现在,我面临着生成相同的块对角矩阵,但也有矩阵元素B_1,B_2,…,B_{n-1}在上对角线上,其他地方为零: 我想这可以用循环硬编码,但我想找到一个更优雅的解决方案。关于如何实施这样的事情,有什么想法吗? p.S.I命令,使用diag(A,k)返回kth对角线。我需要一些东西来写入矩阵,对于k>0,对于块矩阵,不仅仅是元素。这可能是一种基于,&的方法- %// Take all A1, A2, A3,
blkdiag
会生成这样一个矩阵:
现在,我面临着生成相同的块对角矩阵,但也有矩阵元素B_1
,B_2
,…,B_{n-1}
在上对角线上,其他地方为零:
- 我想这可以用循环硬编码,但我想找到一个更优雅的解决方案。关于如何实施这样的事情,有什么想法吗?
p.S.I命令,使用
diag(A,k)
返回k
th对角线。我需要一些东西来写入矩阵,对于k
>0,对于块矩阵,不仅仅是元素。这可能是一种基于,&的方法-
%// 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运行2x2
矩阵的样本-
>> 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
文件交换上有一个提交可以执行此操作:
如果为函数提供三个三维阵列,则三维阵列的每一层表示主、次或超对角线的块。(这意味着块必须具有相同的大小。)结果将是一个稀疏矩阵,因此它在内存方面应该相当有效
一个示例用法是:
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
可以使用diag(Elements,k)
设置第k对角线上的元素。但问题是关于块对角矩阵,即A1,A2。。是矩阵本身。@Divarak,是的,我指的是块矩阵,不是元素!无论如何,谢谢:)这似乎就是我要找的!