Если я правильно понимаю, вот некоторый код (см. Части между строками %%%%%%%%%%%
. Ниже приведены результаты синхронизации, которые мне кажутся разумными, несмотря на цикл 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