Я хотел бы создать разреженную матрицу размера n × n. Как обычно, i, j — индексы строк и столбцов, s — значения. Команда
S=sparse(i,j,s,n,n);
работает нормально, но использует много памяти при создании S. Согласно документации MATLAB использует nzmax=length(s) по умолчанию. Чтобы сэкономить память, я хочу указать nzmax для S, который я могу вычислить заранее. В целях тестирования (я уже создал S с помощью приведенной выше команды) я вычисляю
nonzeros=nzmax(S);
и позвони
S=sparse(i,j,s,n,n,nonzeros);
Обратите внимание, что в моем примере ненулевые значения намного меньше длины (длин). Кроме того, nnz(S)=nzmax(S). Затем я получаю сообщение об ошибке
Ошибка при использовании разреженного: индекс превышает размеры матрицы.
Может кто-нибудь объяснить мне это поведение, пожалуйста? Какое возможное решение/обходной путь?
Позвольте мне добавить фрагмент кода в качестве примера
i=randi(10,1000,1);
j=randi(10,1000,1);
s=rand(1000,1);
ell=size((unique([i j],'rows')),1);
S=sparse(i,j,s,10,10,ell);
Error using sparse: Index exceeds matrix dimensions.
S=sparse(i,j,s,10,10);
nnz(S)
ans = 100
ell
ell = 100
nzmax(S)
ans = 100
spalloc
. - person Stewie Griffin   schedule 04.11.2014