有效地填充稀疏矩阵matlab

时间:2015-11-20 00:44:55

标签: matlab sparse-matrix

我正在处理一个非常大的稀疏矩阵:

  U = sparse(a,b)   % a and b are very large

另一方面,存在具有'a'行的单元Ind。在每一行中,存在“变量”数量的元素,例如:

  Ind{1} = [1 3 5 19 1000 1340]
  Ind{2} = [9 100 1500 1600 8000 b]
    ...
  Ind{a} = [3 5 6 90 1000 4300 5712 9480]

可以看出,Ind {i}中的最大索引号可以是'b'。对于这些中的每一个,索引向量也存在像'c'这样的内容矩阵:

 c = [2 3 1 6 3 5 1 3 4 1 2 ... 5]   

这是一个问题,对于Ind {i}中的每个元素,我想用c(Ind {i})填充'row = i'和'col = Ind {i}',即

  for i = 1 : a
      U(i,Ind{i}) = c(Ind{i}) ;
  end

问题是'a'非常大并且循环需要很长时间才能计算出来。有什么想避免循环?

1 个答案:

答案 0 :(得分:2)

我不确定是否有办法避免循环,但我确实得到了2到20倍的速度提升(我a范围从3到5,000 {{1固定在10,000)通过构建三个大向量(两个用于行和列索引,一个用于值)并在循环之后构建稀疏矩阵:

b

这是strides = cellfun(@numel,Ind); n = sum(strides); I(n,1) = 0; J(n,1) = 0; S(n,1) = 0; bot = 1; for k = 1:a top = bot + strides(k) - 1 ; mask = bot:top ; % I(mask) = k ; J(mask) = Ind{k} ; S(mask) = c(Ind{k}) ; % bot = top + 1; end U = sparse(I,J,S,a,b); 的推荐用法,因为对稀疏矩阵的赋值比常规数组更昂贵。