2017-05-30 28 views
1

我想在matlab中创建一个稀疏矩阵来计算二阶导数。目前,我在下面的方式来创建它:在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)); 

但这种方式是不可能的,因为diagones创造密集矩阵,这会溢出我的记忆中。如果二次和三元对角线的位置在事先已经知道,那么我可以通过以下方式重写一遍:

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对角线之间的距离?

回答

2

第二输入参数(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);