Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
|
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
考虑一个充满噪声元素的向量V。找到合理的最大元素的最快(或任何一种)方法是什么?
例如 V = [1 2 3 4 100 1000] rmax = 4; 我当时正在考虑对元素进行排序,并找到第二个差异{即diff(diff(diff(unique(V)))}}。 编辑:对不起,延迟。 我无法发布任何代表数据,因为它包含6.15e5元素。但这是排序元素的图。 ![]() 只看图,分段线性函数可能起作用。 无论如何,关于我以前关于使用微分的猜想,这是diff(sort(V)); ![]() 我希望现在更加清楚。 编辑:只是要清楚,所需的“最大”值将是排序的元素图中的步骤之前的值。 回答: 新答案: 根据您的排序幅度图,您的diff(sort(V))算法可能会很好地工作。您只需要为构成“太大”的排序值之间的差异选择一个阈值。然后,使用diff(sort(V))向量中超过该阈值的第一点来获取要用于V的阈值。例如: diffThreshold = 2e5; sortedVector = sort(V); index = find(diff(sortedVector) > diffThreshold,1,'first'); signalThreshold = sortedVector(index); 如果您有兴趣使用它,另一种选择是使用HISTC对数据进行装箱 。您最终将获得高振幅的低和高幅度的垃圾箱组,介于它们之间的是稀疏的垃圾箱。然后就可以确定要算作低振幅组的一部分的仓(例如,至少包含X个计数的仓的第一组)。例如: binEdges = min(V):1e7:max(V); % Create vector of bin edges n = histc(V,binEdges); % Bin amplitude data binThreshold = 100; % Pick threshold for number of elements in bin index = find(n < binThreshold,1,'first'); % Find first bin whose count is low signalThreshold = binEdges(index); 旧答案(供后代使用): 找到“合理的最大元素”完全取决于您对合理的定义。您可以通过多种方式将一个点定义为离群值 ,例如仅选择一组阈值并忽略定义为“合理”的所有内容。假设您的数据具有正态分布,则可以使用简单的数据驱动阈值方法使用MEAN和STD函数从向量V去除异常值: nDevs = 2; % The number of standard deviations to use as a threshold index = abs(V-mean(V)) |
![]() |
![]() |