Ошибка MATLAB: матрица слишком велика для возврата линейных индексов - PullRequest
0 голосов
/ 29 декабря 2018

Я пытаюсь найти все ненулевые элементы в большой разреженной матрице K (19683000x19683000).Я использовал find, чтобы сначала вернуть линейные индексы.

val = K(K~=0);
inds = find(K~=0);
[j, i] = ind2sub(size(K), inds);
% [j, i] = find(K~=0);
i = full(i);
j = full(j);

Это дало некоторую ошибку:

Error using find
Matrix is too large to return linear indices.
Use [i,j] = find(S) for sparse matrix.
Error in (line 82)
inds = find(K~=0);
Error in run (line 64)
evalin('caller', [script ';']);

Любая идея, что происходит и как я могу избежать этого?

1 Ответ

0 голосов
/ 03 января 2019

Я не знаком с этой ошибкой (возможно, потому, что я никогда не использовал такие большие матрицы).Ошибка, вероятно, связана с тем фактом, что double переменные могут точно представлять целые числа до 2^53.Количество элементов вашей матрицы не превышает этот предел, но оно близко.

Возможно, вы можете обойти проблему, вплоть до 2^53, получив индексы строк и столбцов, а затем вычислив линейный индексиз них вручную:

[ii,jj] = find(K);
inds = ii + (jj-1)*size(K,1);

При необходимости вы можете увеличить предел до 2^64, используя линейный индекс uint64 вместо double:

[ii,jj] = find(K);
inds = uint64(ii) + (uint64(jj)-1)*size(K,1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...