Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MATLAB中高效地存储块三对角矩阵?_Matlab_Matrix - Fatal编程技术网

如何在MATLAB中高效地存储块三对角矩阵?

如何在MATLAB中高效地存储块三对角矩阵?,matlab,matrix,Matlab,Matrix,我在解一个线性系统,其中矩阵是块三对角的。设B为99×99三对角矩阵,主对角线上为4,两个子对角线上为-1,设I为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{:}); t

我在解一个线性系统,其中矩阵是块三对角的。设B为99×99三对角矩阵,主对角线上为4,两个子对角线上为-1,设I为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;
我不确定这是否是最有效的方法。有其他可能的方法吗?

这个方法如何使用:

以下是
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
每列表示稀疏矩阵中的对角线。调用
spdiags
中的第二个参数
[-B_size-1 0 1 B_size]
告诉它将每列放在哪个对角线上(负数在主对角线的下面,正数在上面)。忽略列向量中不需要的值(负对角线的底部值,正对角线的顶部值)

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
这个如何使用:

以下是
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
每列表示稀疏矩阵中的对角线。调用
spdiags
中的第二个参数
[-B_size-1 0 1 B_size]
告诉它将每列放在哪个对角线上(负数在主对角线的下面,正数在上面)。忽略列向量中不需要的值(负对角线的底部值,正对角线的顶部值)

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

将其存储为稀疏矩阵(如果您有足够新的版本)@Richard“在R2006a之前引入”-我认为没有足够新版本的危险不大。@Richard稀疏矩阵是在MATLAB大约7.0版(大约2004年)中引入的。这种旧版本的MATLAB目前无法在大多数操作系统上运行,因此可以肯定地说,任何当前MATLAB用户的版本都将超过7.0。将其存储为稀疏矩阵(如果您有足够新的版本)@Richard“在R2006a之前引入”-没有足够新版本的危险不大,我认为稀疏矩阵是在MATLAB大约7.0版(大约2004年)中引入的。这种旧版本的MATLAB目前无法在大多数操作系统上运行,因此可以肯定地说,任何当前的MATLAB用户都会有一个7.0以上的版本。非常喜欢这种方法。谢谢!我非常喜欢这种方法。谢谢!