稀疏矩阵乘法的复杂度和实现

时间:2018-07-26 07:04:50

标签: matlab matrix sparse-matrix

我有以下代码来实现稀疏矩阵:

close all
n=10;
p = 1/11;
term13 = -(1 / p^2);
term2 = (2 / p^2);
e=ones(n,1);
z=sparse(n,n);
for j=1:n
    vval(j) = barrier(j*p);
    z(j)=term2 + vval(j);
end
h = spdiags([term13*e z(j)*e term13*e], -1:1, n,n);
t=full(h)

barrier是一个函数,如果600的值为0.4<= j*p <=0.6,否则为零。 当然,我希望矩阵如下所示:

   242  -121     0     0     0     0     0     0     0     0
  -121   242  -121     0     0     0     0     0     0     0
     0  -121   242  -121     0     0     0     0     0     0
     0     0  -121   242  -121     0     0     0     0     0
     0     0     0  -121   842  -121     0     0     0     0
     0     0     0     0  -121   842  -121     0     0     0
     0     0     0     0     0  -121   242  -121     0     0
     0     0     0     0     0     0  -121   242  -121     0
     0     0     0     0     0     0     0  -121   242  -121
     0     0     0     0     0     0     0     0  -121   242

但令人惊讶的是,其形式为

   242  -121     0     0     0     0     0     0     0     0
  -121   242  -121     0     0     0     0     0     0     0
     0  -121   242  -121     0     0     0     0     0     0
     0     0  -121   242  -121     0     0     0     0     0
     0     0     0  -121   242  -121     0     0     0     0
     0     0     0     0  -121   242  -121     0     0     0
     0     0     0     0     0  -121   242  -121     0     0
     0     0     0     0     0     0  -121   242  -121     0
     0     0     0     0     0     0     0  -121   242  -121
     0     0     0     0     0     0     0     0  -121   242

确切地说,我期望h(5,5) = h(6,6) = 842,即242+600。 但需要barrier =0

为什么这个值不正确?

1 个答案:

答案 0 :(得分:0)

我不确定:

  • 为什么需要for循环,
  • 为什么要分配nxn稀疏矩阵z,然后将其与单个索引z(j)一起使用,
  • vval分配或用于此的地方
  • 以及为什么创建稀疏对角矩阵,仅在下一行调用full

但是,无论如何,您所问的问题是由线路

引起的
h = spdiags([term13*e z(j)*e term13*e], -1:1, n,n);

应为

h = spdiags([term13*e, z*e, term13*e], -1:1, n,n);

相反(注意用z代替z(j))。