Matlab: извлечь блок диагоналей большой разреженной матрицы - PullRequest
0 голосов
/ 11 марта 2012

У меня есть большая разреженная матрица A, и я хотел бы создать разреженную матрицу из 3X3 блочных диагоналей A. Как бы я это сделал? имейте в виду, что A очень большой и разреженный, поэтому любые методы, использующие итерацию, будут медленными, а любые методы, использующие некоторые методы, которые создают полные (в отличие от разреженных) матрицы, будут занимать слишком много памяти.

1 Ответ

1 голос
/ 11 марта 2012

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