我正在尝试在大型稀疏矩阵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 ';']);
知道发生了什么以及如何避免发生这种情况?
答案 0 :(得分:3)
我对该错误不熟悉(可能是因为我从未使用过如此大的矩阵)。该错误可能与double
变量只能exactly represent integers至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);