如何应用matlab逻辑过滤器来选择常量数据集

时间:2015-08-15 09:45:54

标签: matlab filter

我需要使用逻辑过滤器来选择长数据集中的某个句点,但我想忽略过滤数据的初始周期。例如,我们有两个列向量('A'和'B'),如下所示。

A =

10
 5
 6
 6
10
 2
 3
 2
 1
 3
 2
 3
 3
 7
 9
 8
 6
 8
 8
12

B =

10
 5
 6
 6
 2
 2
 3
 2
 1
 3
 2
 3
 3
 7
 9
 8
 6
 8
 8
12

现在我可以根据列'B'创建一个过滤器,以选择'A'列中的某个句点

 logicalFilter = B<=3 & B>1;

A(logicalFilter)

ans =

10
 2
 3
 2
 3
 2
 3
 3

现在我需要忽略让我们说“A(logicalFilter)”中的前五个数据点并取剩余的平均值。 怎么做?

第二个选项是我不会忽略第一个修复数据点,而只选择“A(logicalFilter)”中的一个句点,其中数字是常量来计算平均值。怎么可能?

因为有人建议进一步扩展我的问题,在连续数据集中取不同块的平均值。我们再次有两列('A'和'B')如下。 A =

10
 5
 6
 6
10
 2
 3
 2
 1
 3
 2
 3
 3
 7
 9
 8
 6
 8
 8
12

B =

10
 5
 6
 6
 2
 2
 3
 2
 1
 3
 2
 3
 3
 7
 2
 2
 3
 3
 8
12

logicalFilter = B<=3 & B>1

logicalFilter =

 0
 0
 0
 0
 1
 1
 1
 1
 0
 1
 1
 1
 1
 0
 1
 1
 1
 1
 0
 0

现在我需要分别对'logicalFilter'= 1的不同块的'logicalFilter'= 1取平均值'A'并忽略前两个点(例如)'logicalFilter'= 1来计算平均值

1 个答案:

答案 0 :(得分:2)

通过分配临时变量,您可以在过滤后跳过第一个N数据点:

N = 5; %number of points to skip after filtering

logicalFilter = B<=3 & B>1;
Atmp = A(logicalFilter);
avg = mean(Atmp(N+1:end));

根据方差选择要动态平均的点要复杂得多,而且我不确定是否有一种优雅的方法,你需要考虑一个合适的算法。例如,通过考虑点对点变化的注释中的示例将如下所示:

%relative point-to-point difference to keep
q=0.05;

logicalFilter = B<=3 & B>1;
Atmp = A(logicalFilter);

varianceFilter = abs(diff(Atmp))./Atmp(1:end-1)<0.05;
avg = mean(Atmp(varianceFilter));

这会将Atmp(1:end-1)中与以下数据点相差不多的点数平均值超过相对误差q=0.05

但请注意,对于您的示例数据,您将只获得1点,这与下一个点相同,直到5%的误差,因为您有整数,并且只有相邻的相同整数才有资格获得过滤器。

<强>更新: 另一种方法对计算要求更高,但它似乎是一种正确的方法。您应该找到Atmp中的数据弱分散的第一个索引,即它们的标准偏差很小。当然,这假定在给定点之后你的偏差确实很小,否则你将遍历整个向量并保持最后一点。这就是我的意思:

%relative standard deviation to keep
q=0.05;

logicalFilter = B<=3 & B>1;
Atmp = A(logicalFilter);

%worst case scenario
avg = Atmp(end);
for i=1:length(Atmp)-1
   if std(Atmp(i:end))<q
      avg = mean(Atmp(i:end));
      break;
   end
end

这会找到i标准偏差小于Atmp(i:end)的最小q,计算此数据集的平均值,然后完全停止工作。

关于您的修改

更新2

  

现在我需要分别对'logicalFilter'= 1的不同块的'logicalFilter'= 1取平均值'A'并忽略前两个点(例如)'logicalFilter'= 1来计算平均值

我们可以调整答案to a similar question at MATLAB Answers

aboveThreshold = logicalFilter;  %where above threshold
%aboveThreshold is a logical array, where 1 when above threshold, 0, below.
%we thus want to calculate the difference between rising and falling edges
aboveThreshold = [false; aboveThreshold; false];  %pad with 0's at ends
edges = diff(aboveThreshold);
startPos = find(edges==1);     %rising/falling edges
endPos = find(edges==-1)-1;

%at this point startPos and endPos contain the indices of each 'island'

%if you want to throw away islands shorter than 2 (inclusive):
needInds = endPos-startPos>1;
startPos = startPos(needInds);
endPos = endPos(needInds);

%now loop over each island and compute the mean
meanVec = zeros(length(startPos),1);
for i=1:length(startPos)
   Atmp = A(startPos(i):endPos(i));
   meanVec(i) = mean(Atmp(3:end));
end

现在meanVec是一个包含每个数据“孤岛”的平均值的向量,每个岛上扔掉前两个点(相应的最多2个元素的岛被扔掉)。