删除的数据结构,小于某个阈值
6视图(30天)
显示旧的评论
我运行一个代码来找到微粒子的位置和轨迹。我得到一个很大的噪音粒子浓度相当密集。误报率显著减慢我的代码,所以我想摆脱他们每个循环,所以我做了下面的代码:
c = 1;
而c < =长度(AllTraj.Passive)
如果((长度(AllTraj.Passive (c) .T) < = 10) & &…
(max (AllTraj.Passive (c) .T) <(我2)))
AllTraj.Passive (c) = [];
其他的
c = c + 1;
结束
c
结束
AllTraj.Passiverepresents a struct with my connected particle trajectories each with time (T), X and Y values.
我想摆脱任何粒子(行)的轨迹长度10或更少,如果他们不再被跟踪在当前帧(我2是当前帧)。
这段代码似乎运行非常缓慢,当我有很多颗粒,当我明确的符合标准的行。
有没有更快的方法去除数据小于一个阈值的时间吗?
谢谢
0评论
接受的答案
1月
2019年7月16日
编辑:1月
2019年7月16日
数组的迭代增长和萎缩是非常昂贵的。好:
nTraj =元素个数(AllTraj.Passive);
删除= false (1、nTraj);
为c = 1: nTraj
tmp = AllTraj.Passive .T (c);
%(编辑删除- >删除(c)):
拆卸(c) =(元素个数(tmp) < = 10) & & (max (tmp) <(我2));
结束
AllTraj.Passive(删除)= [];
记住:创建一个数组,例如:
x = [];
为k = 1:1e6
x (k) =兰德;
结束
Matlab必须储备
总和(1:1e6) * 8
字节的RAM和副本几乎相同数量的内存。这是4 tb,虽然最终数组只有8 MB。当然,这是缓慢的。
解决方案是一个预先分配:
x = 0 (1,1 e6);
或者在你的情况下收集指标去除和删除它们的第一步后,循环。
答案(1)
Guillaume
2019年7月16日
这段代码似乎运行非常缓慢
你的代码并做任何事情,因为发布
如果
条件是不正确或错误(如果
如果
条件是正确的)。它不可能是您实际使用的代码。
如果你的循环有一个已知的迭代次数你应该使用
为
不
而
。这样你不能打乱迭代器变量。如果你让我们看看会发生什么
如果
测试是真的:
%去除不必要的括号的表达式更容易阅读
%检查字段T不到10元素和最大的不到的东西。
%,我是一个可怕的变量名。
如果长度(AllTraj.Passive (c) .T) < = 10 & &马克斯(AllTraj.Passive (c) .T) <(我2)
你如果测试的唯一的事是真的是取代中存储的结构
被动(c)
一个空数组。然后到达的代码
其他的
。自
如果
是真的,中的代码
其他的
不执行,
c
是
不增加
。然后到达的代码
结束
的
而
循环。
自
c
没有增加,
c
仍然是一样的以前的迭代。所以,我们知道
AllTraj.Passive (c)
是
[]
。因此
AllTraj.Passive .T (c)
现在是一个错误。没有字段
T
,不再被动(c)是一个结构。
一个
为
循环会避免错误:
为c = 1:元素个数(AllTraj.Passive)
如果元素个数(AllTraj.Passive (c) .T) < = 10 & &马克斯(AllTraj.Passive (c) .T) <(我2)
AllTraj.Passive (c) = [];
结束
结束
不幸的是,你没有办法让这个快没有完全改变你的方式存储数据。
2的评论
Guillaume
2019年7月16日
哦,是的,当然,我错过了森林的树木。删除元素的数组遍历一个数组时从来就不是一个好主意。唯一可靠的方法是工作落后(但这创造了很多重新分配),或者创建一个新的数组non-removed元素。
简单是先有一个循环,创建一个逻辑数组表示要删除哪些元素,然后删除他们所有人之后,随着1月显示(一旦你删除错误)。
我想这样的代码:
toremove = arrayfun (@ (elem)元素个数(elem.T) < = 10 & &马克斯(elem.T) <我2,AllTraj.Passive);
AllTraj.Passive (toremove) = [];