如何从Matlab中的数据集中删除数据点

时间:2015-01-07 16:21:58

标签: matlab vector curve-fitting data-manipulation data-fitting

在Matlab中,我有一个1x204双倍的向量。它表示一段时间内的生物信号,并且在那段时间内信号变化 - 有时它会达到峰值并上升,有时它仍然相对较小,接近基线值0.我需要将此数据的倒数绘制出来(在x轴上)针对另一组数据(在y轴上)以进行一些统计分析。

问题在于,由于这些点接近于0,例如我所拥有的最小点是= -0.00497,1 / 0.00497产生的值为-201并变成“异常值”,而其余数据非常不同且值不大。所以我试图从数据集中删除接近0的非常小的值,这样它就不会影响1 /值。

我知道我可以使用cftool从绘图中删除这些点,但是如何删除那些点的矢量?有没有办法实际删除积分?从cftool并删除原始的那些点,我能够生成代码并找出它们的确切点,但我不知道如何创建一个删除了这些点的向量。

有人可以帮忙吗?

我确实尝试使用以下for循环让它删除值,'total_BOLD_time_course'是我的信号,'1 / total_BOLD_time_course'是我要绘制的内容,但问题在于我的if语句total_BOLD_time_course (i)= 1,这不完全正确 - 所以通过这样做,这些点仍然存在于向量中但现在取值1.但我只是希望它们从向量中消失。

for i = 1:204 
  if total_BOLD_time_course(i) < 0 && total_BOLD_time_course(i) < -0.01
   total_BOLD_time_course(i) = 1;

  else if total_BOLD_time_course(i) > 0 && total_BOLD_time_course(i) < 0.01
     total_BOLD_time_course(i) = 1 ;
  end
 end
end

3 个答案:

答案 0 :(得分:1)

要从数组中删除点,请使用语法

total_BOLD_time_course( abs(total_BOLD_time_course<0.01) ) = nan

这使他们变得空白&#39;在图上,并被进一步的计算忽略,但没有破坏数据点的时间序列。

如果实际上破坏时间点不是问题,那么

total_BOLD_time_course( abs(total_BOLD_time_course<0.01) ) = []

然后会有更少的数据点,并且他们不会映射到您拥有的任何其他time_course。但优势在于它会关闭&#34;图中的差距。

- PS

请注意,在您的代码中,短语

x<0 && x<-0.01

是多余的,因为如果任何数字小于-0.01,它会自动小于0.我相信第一个应该是x>0,然后你的代码就可以了。

答案 1 :(得分:1)

VHarisop所示,您可以设置异常值的阈值并将其排除。但是,根据您的情节,确保剩余数据不会水平分流以填补空白可能很重要。要将1./y绘制为x的函数,您可以plot(x, 1./y),然后使用ylim设置y限制以从视图中排除异常值,或使用NaN:< / p>

e = 0.01
y( abs(y) < e ) = nan;
plot( x, 1./y )

对于定量(非可视)统计分析,要么根据建议完全从y中删除这些值,请记住这会留下较短的向量 - 或使用统计函数知道如何将NaN视为缺少数据(nanmeannanstd等)。

答案 2 :(得分:0)

是的,你可以。您可能希望定义阈值,如e = 0.01,并切断绝对值低于e的所有向量元素。 例如:

# assuming v is your initial vector
e = 0.01
new_vector = v(abs(v) > e);

或者,您可以使用“曲线拟合工具箱”中的excludedata工具,因为您知道要排除的矢量元素的索引。