有效地填充稀疏矩阵matlab
filling sparse matrices efficiently matlab
我正在处理一个非常大的稀疏矩阵:
U = sparse(a,b) % a and b are very large
手头上存在具有 'a' 行的单元格 Ind。在每一行中,存在 'variate' 个元素,例如:
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' 非常大,循环需要很长时间才能计算出来。任何避免循环的想法?
我不确定是否有办法避免循环,但我确实得到了 2 到 20 倍的速度提升(我将 a
从 3 到 5,000 设置为 b
固定为 10,000)通过构建三个大向量(两个用于行和列索引,一个用于值)并在循环后构建稀疏矩阵:
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);
这是 sparse
的推荐用法,因为对稀疏矩阵的赋值比常规数组的成本更高。
我正在处理一个非常大的稀疏矩阵:
U = sparse(a,b) % a and b are very large
手头上存在具有 'a' 行的单元格 Ind。在每一行中,存在 'variate' 个元素,例如:
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' 非常大,循环需要很长时间才能计算出来。任何避免循环的想法?
我不确定是否有办法避免循环,但我确实得到了 2 到 20 倍的速度提升(我将 a
从 3 到 5,000 设置为 b
固定为 10,000)通过构建三个大向量(两个用于行和列索引,一个用于值)并在循环后构建稀疏矩阵:
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);
这是 sparse
的推荐用法,因为对稀疏矩阵的赋值比常规数组的成本更高。