Matlab内置函数blkdiag,但需要把对角线的每个块都手动写在函数里,比如
a=ones(1,5);
b=blkdiag(a,a,a);
得到b为
1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1
但是,当需要的块非常多时,比如对角线一共要有1000个块,就没办法手动一个一个输入在括号里了。网上没找到办法,自己尝试用cell写了一个,实测成功。核心思想就是cell对角线放a,非对角线放0向量,最后cell2mat转化为矩阵。
以对角线3个为例(1000个只需将n=3改为n=1000即可),代码如下
n=3;%对角线有几个块
m=5;%每个分块有几个1
c=cell(n,n);
for i=1:n
for j=1:n
if i==j
c(i,j)={ones(1,m)};
else
c(i,j)={zeros(1,m)};
end
end
end
c=cell2mat(c);
计算结果
1 1 1 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1