我在Matlab中有一行代码是这样写的:
output = find(input);其中列向量"output“包含列向量"input”中元素为非零的所有索引。例如,如果:
input = [1 3 4 0 0 2 0];那么,output = find(input);的结果将是:
output =
1
2
3
6对应于非零的数组"input“的第一个("1")、第二个("3")、第三个("4")和第六个("2")索引。
由于我的“输入”数组非常大,这行代码消耗了我所有的本地RAM和大量的虚拟内存,导致系统变慢到爬行。
有谁知道减少这种操作的内存需求的好方法(或任何方法)?我考虑过将"find“代码放入循环中,但由于数组"output”的大小(以及此数组的索引)取决于"find“操作的结果,因此我不明白如何做到这一点。我没主意了。
提前感谢您的任何意见/建议。-gkk
发布于 2010-11-11 12:56:57
如果您有足够的内存来容纳与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{:});发布于 2010-11-11 12:57:45
如果非零值多于零,也许可以使用补码,即:output=find(input==0)而不是等同于output=find(input~=0)的默认值
此外,您还可以使用逻辑索引,比较:
>> output1 = find(input);
>> output2 = (input~=0);
>> whos output*
Name Size Bytes Class Attributes
output1 1x4 32 double
output2 1x7 7 logical 注意它是如何被存储为"booleans“的向量,每个是一个字节(vs 8个字节的”双精度“)
https://stackoverflow.com/questions/4151440
复制相似问题