C# 用大量样本绘制信号

C# 用大量样本绘制信号,c#,.net,drawing,C#,.net,Drawing,我需要显示一组信号。每个信号由数百万个样本定义。仅处理样本集合(用于根据位图大小将样本转换为点)就需要花费大量时间(尤其是在滚动期间) 所以我实施了某种降采样。我只是略过了一些要点:根据信号特征,每2分、每3分、每50分一次。它极大地提高了速度,但显著地扭曲了信号形式 有更聪明的方法吗?您需要更好的采样算法,也可以使用c#的并行处理功能。请参阅您需要一个更好的采样算法,也可以使用c#的并行处理功能。请参阅我们在最近的一个应用程序中遇到了类似的问题。我们的可视化(一个简单的线图)在缩小到看不到数据

我需要显示一组信号。每个信号由数百万个样本定义。仅处理样本集合(用于根据位图大小将样本转换为点)就需要花费大量时间(尤其是在滚动期间)

所以我实施了某种降采样。我只是略过了一些要点:根据信号特征,每2分、每3分、每50分一次。它极大地提高了速度,但显著地扭曲了信号形式


有更聪明的方法吗?

您需要更好的采样算法,也可以使用c#的并行处理功能。请参阅

您需要一个更好的采样算法,也可以使用c#的并行处理功能。请参阅

我们在最近的一个应用程序中遇到了类似的问题。我们的可视化(一个简单的线图)在缩小到看不到数据的全部范围时变得太混乱(大约7天的样本,每6秒多多少少采集一次样本),因此向下采样实际上是可行的。如果我们不这样做,缩小就没有多大意义,因为你所看到的只是屏幕上一大团模糊的线条

这完全取决于如何实现向下采样。有两种(简单的)方法:在获取样本时向下采样或在显示时向下采样。 在这两种情况下,真正能极大提高性能的是正确选择数据源

假设您有700万个样本,您的查看窗口只对最后100万个点感兴趣。如果您的实现依赖于IEnumerable,这意味着IEnumerable必须在实际启动之前移动600万次。但是,如果您使用的是针对随机读取进行优化的内容(脑海中会出现一个列表),您可以为此实现自己的枚举器,大致如下所示:

public IEnumerator<T> GetEnumerator(int start, int count, int skip)
{
    // assume we have a field in the class which contains the data as a List<T>, named _data
    for(int i = start;i<count && i < _data.Count;i+=skip)
    {
        yield return _data[i];
    }
}
public IEnumerator GetEnumerator(int start、int count、int skip)
{
//假设类中有一个字段,它以列表形式包含数据,名为_data

对于(int i=start;i我们在最近的一个应用程序中遇到了类似的问题。我们的可视化(一个简单的线图)在缩小到看不到数据的全部范围时变得太混乱(大约7天的样本,大约每6秒采集一个样本)如果我们不这样做,缩小就没有多大意义,因为你所看到的只是屏幕上一大团模糊的线条

这完全取决于如何实现向下采样。有两种(简单)方法:在获取样本时向下采样或在显示时向下采样。 在这两种情况下,真正能极大提高性能的是正确选择数据源

假设您有700万个样本,并且您的查看窗口只对最后100万个点感兴趣。如果您的实现依赖于IEnumerable,这意味着IEnumerable必须在实际开始之前移动600万次。但是,如果您使用的是针对随机读取进行优化的内容(我想到了一个列表),您可以为此实现自己的枚举器,大致如下:

public IEnumerator<T> GetEnumerator(int start, int count, int skip)
{
    // assume we have a field in the class which contains the data as a List<T>, named _data
    for(int i = start;i<count && i < _data.Count;i+=skip)
    {
        yield return _data[i];
    }
}
public IEnumerator GetEnumerator(int start、int count、int skip)
{
//假设类中有一个字段,它以列表形式包含数据,名为_data

对于(int i=start;i您已经解释了一些并告诉了一些,但我们仍然不知道这些信号是什么以及您真正想要做的是什么。请注意:如果您谈论的是数百万个数据点,信号可能是实时可视化的,请不要使用.NET。例如,Python有很多很好的库。请参阅另一个问题:您我们已经解释了一些,也告诉了一些,但我们仍然不知道这些信号是什么,也不知道您真正想做什么。请注意:如果您谈论的是数百万个数据点,信号可能是实时可视化的,请不要使用.NET。例如,Python有很多很好的库。请参阅其他问题: