2011-10-13 100 views
4

我正在尝试使用blkdiagspdiags构建正方形band matrices,但无法弄清楚如何。我发现spdiags的文档有点令人困惑,我不确定我可以通过简单调用blkdiag来构建这些矩阵。学习在MATLAB中创建带矩阵

我想从两个参数建立的正方形带矩阵:

  • 所述带的宽度
  • 矩阵大小

例如:

band_width = 2; 
matrix size = 9; 

结果:

[1 1 1 0 0 0 0 0 0] 
[1 1 1 1 0 0 0 0 0] 
[1 1 1 1 1 0 0 0 0] 
[0 1 1 1 1 1 0 0 0] 
[0 0 1 1 1 1 1 0 0] 
[0 0 0 1 1 1 1 1 0] 
[0 0 0 0 1 1 1 1 1] 
[0 0 0 0 0 1 1 1 1] 
[0 0 0 0 0 1 1 1 1] 
[0 0 0 0 0 0 1 1 1] 
+0

这是你的意图产生1和0的矩阵在你的榜样,或者是你将要填充不同的值对角线? – gnovice

+0

谢谢@gnovice。如例子中的1和0,但带宽和矩阵大小可以变化。 –

回答

6

一个棘手的线的方式来创建这样的矩阵是与卷积:

M = sign(conv2(eye(matrix_size),ones(band_width+1),'same')); 

identity matrix创建给定尺寸的,然后convolved in 2-Dsquare matrix of ones,然后通过取转化成零和一sign

以上对于制作相对较小的非稀疏矩阵来说很好。对于较大的矩阵,卷积可能会变得昂贵,您可能想要将结果表示为sparse matrix。这里是你如何使用SPDIAGS一般的方式做到这一点:

M = spdiags(ones(matrix_size,2*band_width+1),... 
      -band_width:band_width,matrix_size,matrix_size); 
+1

这是一个很棒的伎俩!实际上我发现这个解决方案非常优雅 –