我有一个大的稀疏矩阵A
,我想创建一个AX的3X3块对角线的稀疏矩阵。我该怎么做?请记住,A
非常大且稀疏,因此任何使用迭代的方法都会很慢,并且任何使用创建完整(而非稀疏)矩阵的方法的方法都会占用太多内存。 / p>
答案 0 :(得分:1)
如果我理解正确,这里有一些代码(请参阅%%%%%%%%%%%
行之间的部分。下面是时序结果,尽管有for
循环,这对我来说似乎是合理的。唯一的诀窍是使用spalloc函数,您可能需要根据应用进行调整。
for N= [(3:3:12) (15:600:9000)]
bigsparse = sprand(N,N,0.1);
tic;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
origSize = size(bigsparse);
diagSize = 3;
numDiags = size(bigsparse,1)/diagSize;
assert(numDiags == floor(numDiags))
bigsparse_diagonals = spalloc(origSize(1), origSize(2), ceil(prod(origSize)*0.1));
for ix=(1:numDiags)-1
ixsCurrent = ix*diagSize+[1:diagSize];
bigsparse_diagonals(ixsCurrent,ixsCurrent) = ...
bigsparse(ixsCurrent,ixsCurrent);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
fprintf(1,'%5d size --> %6.5f seconds \n', N, toc)
end
计时结果(注意,生成随机测试矩阵实际上比重新格式化要花费更长时间):
3 size --> 0.00135 seconds 6 size --> 0.00014 seconds 9 size --> 0.00013 seconds 12 size --> 0.00014 seconds 15 size --> 0.00015 seconds 615 size --> 0.00392 seconds 1215 size --> 0.00874 seconds 1815 size --> 0.01537 seconds 2415 size --> 0.02570 seconds 3015 size --> 0.03595 seconds 3615 size --> 0.05007 seconds 4215 size --> 0.06420 seconds 4815 size --> 0.08690 seconds 5415 size --> 0.10077 seconds 6015 size --> 0.13322 seconds 6615 size --> 0.14923 seconds 7215 size --> 0.17562 seconds 7815 size --> 0.37371 seconds 8415 size --> 0.23060 seconds