我在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{:});
更多&回答...