首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何减少Matlab 'find‘函数的内存需求?

如何减少Matlab 'find‘函数的内存需求?
EN

Stack Overflow用户
提问于 2010-11-11 12:49:10
回答 2查看 461关注 0票数 1

我在Matlab中有一行代码是这样写的:

代码语言:javascript
复制
  output = find(input);

其中列向量"output“包含列向量"input”中元素为非零的所有索引。例如,如果:

代码语言:javascript
复制
 input = [1 3 4 0 0 2 0];

那么,output = find(input);的结果将是:

代码语言:javascript
复制
 output = 
     1
     2
     3
     6

对应于非零的数组"input“的第一个("1")、第二个("3")、第三个("4")和第六个("2")索引。

由于我的“输入”数组非常大,这行代码消耗了我所有的本地RAM和大量的虚拟内存,导致系统变慢到爬行。

有谁知道减少这种操作的内存需求的好方法(或任何方法)?我考虑过将"find“代码放入循环中,但由于数组"output”的大小(以及此数组的索引)取决于"find“操作的结果,因此我不明白如何做到这一点。我没主意了。

提前感谢您的任何意见/建议。-gkk

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-11 12:56:57

如果您有足够的内存来容纳与input大小相同的数组,则可以将对find的调用替换为

代码语言:javascript
复制
output = 1:length(input);
output = output(input~=0);

如果input的元素少于2^32-1,则可以将其初始化为uint32,从而进一步节省内存。

一种更好的方法可能是将您的input数组转换为sparse,如果input包含许多零,则这将节省内存,然后对其使用find

代码语言:javascript
复制
input = sparse(input);
output = find(input);

编辑

要分段执行find操作,我将执行以下操作:

代码语言:javascript
复制
nIn = length(input);
blockLength = 100000;
nBlocks = ceil(nIn/blockLength); %# work in chunks of 100k entries
out = cell(nBlocks,1);
for i=1:nBlocks
   out{i} = (i-1)*blockLength+1:i*blockLength; %# assign as your favorite integer format here
   out{i} = out{i}(input(out{i})~=0);
end
out = cat(1,out{:});
票数 2
EN

Stack Overflow用户

发布于 2010-11-11 12:57:45

如果非零值多于零,也许可以使用补码,即:output=find(input==0)而不是等同于output=find(input~=0)的默认值

此外,您还可以使用逻辑索引,比较:

代码语言:javascript
复制
>> output1 = find(input);
>> output2 = (input~=0);
>> whos output*
  Name         Size            Bytes  Class      Attributes

  output1      1x4                32  double               
  output2      1x7                 7  logical    

注意它是如何被存储为"booleans“的向量,每个是一个字节(vs 8个字节的”双精度“)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4151440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档