删除的数据结构,小于某个阈值

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是当前帧)。
这段代码似乎运行非常缓慢,当我有很多颗粒,当我明确的符合标准的行。
有没有更快的方法去除数据小于一个阈值的时间吗?
谢谢

接受的答案

1月
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);
或者在你的情况下收集指标去除和删除它们的第一步后,循环。
4评论
曼尼家族
曼尼家族 2019年7月16日
非常感谢你的帮助!我已经做了更改,它工作得很好!代码也加快了不少,去除假阳性(提高50% !)

登录置评。

答案(1)

Guillaume
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
Guillaume 2019年7月16日
哦,是的,当然,我错过了森林的树木。删除元素的数组遍历一个数组时从来就不是一个好主意。唯一可靠的方法是工作落后(但这创造了很多重新分配),或者创建一个新的数组non-removed元素。
简单是先有一个循环,创建一个逻辑数组表示要删除哪些元素,然后删除他们所有人之后,随着1月显示(一旦你删除错误)。
我想这样的代码:
toremove = arrayfun (@ (elem)元素个数(elem.T) < = 10 & &马克斯(elem.T) <我2,AllTraj.Passive);
AllTraj.Passive (toremove) = [];

登录置评。

类别

找到更多的在循环和条件语句帮助中心文件交换

标签

s manbetx 845


释放

R2019a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!