我正在解决一个线性系统,其中矩阵是块三对角线。设B是99×99三对角矩阵,主对角线上有4个,两个子对角线上有-1,让我成为99乘99的单位矩阵。我想存储大小为99 ^ 2乘99 ^ 2的块三对角矩阵A,主对角线为B,子对角线为-I。最有效的方法是什么?我想出了一个方法:
t1=ones(99,1);
t2=ones(98,1);
B=4*diag(t1)-diag(t2,-1)-diag(t2,1);
I=diag(t1);
Bp=repmat({B}, 99, 1);
M = blkdiag(Bp{:});
t3=ones(9702,1);
I=zeros(9801)-diag(t3,-99)-diag(t3,99);
A=M+I;
我不确定这是否是最有效的方法。还有其他任何可行的方法吗?
答案 0 :(得分:4)
使用spdiags的这个怎么样:
B_size = 99;
A_size = B_size^2;
v = ones(A_size,1);
D = [v*-1, v*-1, v*4, v*-1, v*-1];
A = spdiags(D, [-B_size, -1, 0, 1, B_size], A_size, A_size);
这是B_size = 4
的示例输出:
D =
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
-1 -1 4 -1 -1
每列代表稀疏矩阵中的对角线。调用[-B_size -1 0 1 B_size]
时的第二个参数spdiags
告诉它将每列放在哪个对角线上(负数低于主对角线,上面是正数)。列向量中的不需要的值(负对角线的底部值,正对角线的顶部值)将被忽略。
A
是一个稀疏矩阵,因此我会显示full(A)
,以便您可以看到它实际上是什么样的:
>> full(A)
ans =
4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0
-1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0 0
0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0 0
0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0 0
-1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0 0
0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0 0
0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0 0
0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0 0
0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0 0
0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0 0
0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1 0
0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0 -1
0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0 0
0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1 0
0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4 -1
0 0 0 0 0 0 0 0 0 0 0 -1 0 0 -1 4