Matlab 逻辑稀疏矩阵的高效生成

Matlab 逻辑稀疏矩阵的高效生成,matlab,sparse-matrix,Matlab,Sparse Matrix,我的目标是创建一个矩形网格,并为每个点指定“是/否”值。我想要一个相当大的网格,所以我决定将其存储为稀疏矩阵。我的方法考虑的是nxn网格,只有r点的比率为真(因此Nact=r*N^2点): 作为替代方案,但我有两个问题:true点是N而不是NAct,如果iAct和jAct的两对元素重合,就会出现错误。我最终使用了sprand N = 200; Grid(N,N) = false; %// preallocate grid Grid = sparse(Grid); %// add to make

我的目标是创建一个矩形网格,并为每个点指定“是/否”值。我想要一个相当大的网格,所以我决定将其存储为稀疏矩阵。我的方法考虑的是
nxn
网格,只有
r
点的比率为真(因此
Nact=r*N^2
点):


作为替代方案,但我有两个问题:
true
点是
N
而不是
NAct
,如果
iAct
jAct
的两对元素重合,就会出现错误。

我最终使用了
sprand

N = 200;
Grid(N,N) = false; %// preallocate grid
Grid = sparse(Grid); %// add to make sparse
r = 213;
TruePoints = randi(N^2,r,1); %// get random indices of points to be true
Grid(TruePoints) = true;
Grid = logical(Grid); %// switch to logical
N = 200;
r = 0.25;
NAct = r*N^2;
ss = sprand(N,N,r);
ssL = logical(ss);

我终于使用了
sprand

N = 200;
r = 0.25;
NAct = r*N^2;
ss = sprand(N,N,r);
ssL = logical(ss);

在大多数情况下,稀疏矩阵与逻辑矩阵相比,在空间上没有优势。使用阈值
0.25
逻辑
200x200
阵列需要40000字节,而稀疏阵列需要92139字节。只有很少非零项的矩阵比逻辑矩阵占用更少的空间。请阅读我的文章,了解稀疏矩阵的存储效率,尤其是最后一段。要点是,
sparse
只有在系统中有70%或更多的零项时才有用。特别是,可能的重复项将为您提供获得确切的
NAct
不同随机元素所需的代码。@Theo给定
[X,Y]
从用户664303的答案返回结果,
sssL=sparse(X,Y,true,…)
。与大多数情况下的逻辑矩阵相比,稀疏矩阵在空间方面没有优势。使用阈值
0.25
逻辑
200x200
阵列需要40000字节,而稀疏阵列需要92139字节。只有很少非零项的矩阵比逻辑矩阵占用更少的空间。请阅读我的文章,了解稀疏矩阵的存储效率,尤其是最后一段。要点是,
sparse
只有在系统中有70%或更多的零项时才有用。特别是,可能的重复项将为您提供获得确切的
NAct
不同随机元素所需的代码。@Theo给定
[X,Y]
从用户664303的答案返回结果,
sssL=sparse(X,Y,true,…)
。如果我没弄错的话,这将生成一个完整的矩阵。我已经对完整矩阵使用了类似于
Grid=rand(N)
的方法,但我需要一个稀疏矩阵。@若要轻松解决此问题,请参阅更新。显然存在
稀疏逻辑
矩阵。matlab中只存在双矩阵和逻辑稀疏矩阵。太棒了。这就是你想要的答案,不是吗?是的,尽管我找到了另一个解决方案,看起来稍微快一点。无论如何,我希望避免将临时完整矩阵转换为稀疏矩阵。我还编辑了你的答案,因为
r
是真实点数的比率,而不是它们的数目。如果我没弄错的话,这会生成一个完整的矩阵。我已经对完整矩阵使用了类似于
Grid=rand(N)
的方法,但我需要一个稀疏矩阵。@若要轻松解决此问题,请参阅更新。显然存在
稀疏逻辑
矩阵。matlab中只存在双矩阵和逻辑稀疏矩阵。太棒了。这就是你想要的答案,不是吗?是的,尽管我找到了另一个解决方案,看起来稍微快一点。无论如何,我希望避免将临时完整矩阵转换为稀疏矩阵。我还编辑了你的答案,因为
r
是真实分数的比率,而不是分数。非常好!这似乎是最直接的方法。非常好!这似乎是最直接的方法。
N = 200;
r = 0.25;
NAct = r*N^2;
ss = sprand(N,N,r);
ssL = logical(ss);