Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 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 当前离线   回复时引用此帖
 

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 23:31


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.