新答案:
根据您的排序幅度图,您的diff(sort(V))
算法可能会运行良好。您只需为排序值之间的差异“太大”选择一个阈值。然后使用向量中超过该阈值的第一个点diff(sort(V))
来获取用于 的阈值V
。例如:
diffThreshold = 2e5;
sortedVector = sort(V);
index = find(diff(sortedVector) > diffThreshold,1,'first');
signalThreshold = sortedVector(index);
如果您有兴趣使用它,另一种选择是使用HISTC对您的数据进行分箱。您最终会得到一组低振幅和高振幅的人口稠密的箱子,中间是人口稀少的箱子。然后,需要决定将哪些 bin 计为低幅度组的一部分(例如第一组至少包含 X 个计数的 bin)。例如:
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);
旧答案(为后代):
找到“合理的最大元素”完全取决于您对合理的定义。您可以通过多种方式将点定义为异常值,例如简单地选择一组阈值并忽略您定义为“合理”之外的所有内容。假设您的数据具有正态分布,您可以使用简单的数据驱动阈值方法来V
使用函数MEAN和STD从向量中删除异常值:
nDevs = 2; % The number of standard deviations to use as a threshold
index = abs(V-mean(V)) <= nDevs*std(V); % Index of "reasonable" values
maxValue = max(V(index)); % Maximum of "reasonable" values