MATLAB错误:矩阵太大,无法返回线性索引

MATLAB错误:矩阵太大,无法返回线性索引,matlab,Matlab,我试图在大型稀疏矩阵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

我试图在大型稀疏矩阵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 ';']);

你知道发生了什么事以及我如何避免它吗?

我不熟悉这个错误(可能是因为我从未使用过如此大的矩阵)。该错误可能与以下事实有关:
double
变量最多只能
2^53
。矩阵的元素数没有超过该限制,但已接近该限制


也许您可以通过获取行和列索引,然后从这些索引中手动计算线性索引来避开这个问题,直到
2^53

[ii,jj] = find(K);
inds = ii + (jj-1)*size(K,1);
如果需要,您可以使用
uint64
线性索引而不是
double
,将限制提高到
2^64

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

我从未发现这个错误,可能是因为我从未使用过如此大的矩阵。该错误可能与以下事实有关:
double
变量只能精确表示小于等于
2^53-1
的整数。矩阵中的元素数没有超过该限制,但已经很接近了。也许您可以通过获取行和列索引,然后手动计算线性索引来避开这个问题(最多
2^53-1
):
[ii,jj]=find(K);inds=ii+(jj-1)*大小(K,1)
@LuisMendo这确实是我的解决方案。谢谢也许你可以把你的建议作为答案,这样我就可以接受了?很高兴它奏效了。我重新表述了一下,并添加了一个答案,即有一个内置函数来进行转换:sub2ind@Philip当然我养成了手动操作的习惯,因为它稍微快一点:-)