查看单个帖子
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 如何减少Matlab“查找”功能的内存需求?

我在Matlab中有一行代码,内容为:

output = find(input); 其中列向量“输出”包含元素非零的列向量“ input”中的所有索引。例如,如果:

input = [1 3 4 0 0 2 0]; 然后结果为output = find(input);将会:

output = 1 2 3 6 对应于非零数组“ input”的第一个索引(“ 1”),第二个(“ 3”),第三个(“ 4”)和第六个(“ 2”)索引。

由于我的“输入”数组非常大,因此这行代码会消耗我的所有本地RAM以及虚拟内存的很大一部分,从而导致系统减慢爬行速度。

有谁知道减少这种操作的内存需求的好方法(或任何方法)?我曾考虑过将“查找”代码放入循环中,但是由于数组“输出”的大小(以及该数组的索引)取决于“查找”操作的结果,因此我看不到如何这样做。摆脱想法。

在此先感谢您的任何意见/建议。 -gkk



回答:

如果您有足够的RAM来容纳相同大小的input数组,则可以替换该调用以find

output = 1:length(input); output = output(input~=0); 如果input元素少于2 ^ 32-1个,则可以将其初始化为uint32 ,从而进一步节省内存。

更好的方法可能是将input数组转换为sparse ,如果input包含大量零,则可以节省内存,然后在其上使用find ,即

input = sparse(input); output = find(input); 编辑

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

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{:});

更多&回答...
poster 当前离线   回复时引用此帖