在具有可变元素距离的matlab中创建稀疏带矩阵
Create sparse band matrix in matlab with variable distance of elements
我想在 matlab 中创建一个稀疏矩阵来计算二阶导数。目前我通过以下方式创建它:
r_num = 1000;
r_square_num = r_num*r_num;
A = sparse(-30*diag(ones(r_square_num,1),0)+16*diag(ones(r_square_num-r_num,1),r_num)+16*diag(ones(r_square_num-r_num,1),-r_num)-diag(ones(r_square_num-2*r_num,1),-2*r_num)-diag(ones(r_square_num-2*r_num,1),2*r_num));
但是由于 diag
和 ones
创建密集矩阵,这种方式是不可能的,这会溢出我的记忆。如果事先已经知道二级和三级对角线的位置,那么我可以用以下方式重写它:
A = spdiags([-1*ones_vec 16*ones_vec -30*ones_vec 16*ones_vec -1*ones_vec], -2:2, r_square_num, r_square_num);
但是如果对角线之间的距离取决于 r_num
,我该怎么做呢?
第二个输入参数 (d
) 可以是任何向量,例如[-1:1]
、[-2,0,2]
或 [-5,3]
。因此,以下应该有效:
A = spdiags([-1*ones_vec 16*ones_vec -30*ones_vec 16*ones_vec -1*ones_vec], (-2:2)*r_num, r_square_num, r_square_num);
我想在 matlab 中创建一个稀疏矩阵来计算二阶导数。目前我通过以下方式创建它:
r_num = 1000;
r_square_num = r_num*r_num;
A = sparse(-30*diag(ones(r_square_num,1),0)+16*diag(ones(r_square_num-r_num,1),r_num)+16*diag(ones(r_square_num-r_num,1),-r_num)-diag(ones(r_square_num-2*r_num,1),-2*r_num)-diag(ones(r_square_num-2*r_num,1),2*r_num));
但是由于 diag
和 ones
创建密集矩阵,这种方式是不可能的,这会溢出我的记忆。如果事先已经知道二级和三级对角线的位置,那么我可以用以下方式重写它:
A = spdiags([-1*ones_vec 16*ones_vec -30*ones_vec 16*ones_vec -1*ones_vec], -2:2, r_square_num, r_square_num);
但是如果对角线之间的距离取决于 r_num
,我该怎么做呢?
第二个输入参数 (d
) 可以是任何向量,例如[-1:1]
、[-2,0,2]
或 [-5,3]
。因此,以下应该有效:
A = spdiags([-1*ones_vec 16*ones_vec -30*ones_vec 16*ones_vec -1*ones_vec], (-2:2)*r_num, r_square_num, r_square_num);