脉冲式核磁数据中计算基线高度:在大量点中找到基线高度,C#实现

本文介绍了如何在脉冲式核磁数据中寻找基线高度,通过C#实现了一种基于二分法的高效算法。该方法首先找到数据的最大值和最小值,然后逐步缩小高度差,选择点数较多的区域作为基线。虽然可能存在基线不平整导致的问题,但总体时间复杂度为O(N * logM)。作者分享了具体的实现代码,并展示了运行结果。
摘要由CSDN通过智能技术生成

做化学好多年,一直想为Researchers做点贡献。一直梦想着写个核磁软件,无奈无从下手。最近看到http://blog.sina.com.cn/s/blog_1349667240102wzrk.html上说起核磁文件的格式,我才有了开始写核磁软件的可能。写了两天了,能实现显示、积分的功能了。现在要寻找谱图的基线。

在这里插入图片描述
核磁数据中1r中储存了65536个Y轴数据。其中X轴的数据是在-4~16之间均匀分布的。把所有这些数据画在一张图上就得到了上述核磁的原始谱图。怎样才能得到这个基线的高度呢。基线高度肯定不是谱图中最低的点的高度,也可能不是最高点的高度。 (屏幕左上角是坐标原点,Y值越大,越是在下面)。

可以确定的一点是基线,或者基线附近的点是最多的,真正产生峰的点是比较少的。所以,我们可以根据高度进行二分:我们先把所有原始数据放到listPoint中。
1、找到listPoint数据中的Y的最大值和最小值。
2、根据Y的最大值和最小值,把Y值分成高度相等的2个区域,
3、遍历listPoint数据中的Y值,把数据放到指定的区域中。清空listPoint中的数据。
4、找到数据比较多的区域,并把这个区域中的点放到listPoint中。
5、重复1,2,3,4,直到数据比较多的区域中的最大值和最小值相等。基线高度就是这个区域中的最大值 (最大值、最小值、平均值都相等)。
每次遍历的时间复杂度为O(N)。如果谱图中任意两个点之间的高度的最大差为M,用二分的方法缩减高度差的值,一共需要O(logM)次,所以整个过程的时间复杂度为O(N * logM)。这个寻找基线的方法的效率比较高,其实我也想不到其它方法找基线了 。这个方法可能是有缺陷的:如果基线很不平整,这个方法就可能有问题。例如样品中有一些亚铁离子等顺磁性的物质,核磁结果就很难看,其中一个表现就是基线很不平整。。。,另外,我们的假设是基线附近的点最多。但是如果基线附近的点不是最多,是不是也会出现异常?
值得注意的一点:二分过程中,随着Y变化,每次需要遍历的元素个数也是在不断减小的,但是遍历时间复杂度不变。从下图可以看到,每进行一次二分,总归有一些点被丢弃,而且每次丢弃的点的个数是不断增加的。

在这里插入图片描述
下面是实现代码:

public static int getBaseLineY()
{
   
    int pointNum = R.listPoint.Count; //点的个数
    List<Point> listPoint = new List<Point>();
    listPoint.AddRange(R.listPoint); //避免用R.listPoint

    int minY = 9999999;
    int maxY = 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值