【问题标题】:Native Array, Stack, ArrayList or List for creating 'low pass' filter用于创建“低通”滤波器的原生数组、堆栈、ArrayList 或列表
【发布时间】:2023-03-17 15:16:01
【问题描述】:

尝试创建一种低通滤波器,我不断平均前 10 个浮点值。不确定是使用内置数组(原生 .NET 数组)、.NET Stack 运算符,还是 ArrayList 或 List。

在伪代码中我需要

1- 定义包含 10 个浮点数的数组或堆栈

2- 每次更新推送一个新值到数组、栈、列表

3- 检查长度,如果大于 10,则从数组、堆栈、列表中删除第一个或最旧的浮点值

4- 获取Array、Stack、List中所有float值的平均值

5- 重复步骤 2-4

第一个问题我应该使用内置数组、堆栈、数组列表还是列表?我注意到在堆栈文档中没有从堆栈中删除最旧(底部)项的方法,但也许我遗漏了一些东西

https://msdn.microsoft.com/en-us/library/3278tedw(v=vs.100).aspx

我需要的是(仅限 JavaScript)Array 类的所有功能,但在 C# 中。

2nd 任何人都可以帮助使用这两种方法的实际语法吗?任何帮助表示赞赏!

【问题讨论】:

    标签: c# arrays unity3d arraylist


    【解决方案1】:

    您可能错过了队列数据结构。有了它,你可以把新元素放在最后,把旧元素从前面删除。

    此外,如果始终有 10 个元素,则无需查看数组中的所有元素来计算平均值。知道以前的平均值,您可以像这样计算新的平均值:

    newAvg = oldAvg + (newElem - deletedElem)/10;
    

    或更多:

    avg += (newElem - deletedElem)/10;
    

    【讨论】:

    • 从 OP 的第 3 步来看,听起来队列从 0 个元素开始,这意味着队列中不会总是有 10 个元素,但我同意 Queue 是正确的数据结构。
    【解决方案2】:

    您可以使用通用 Queue<T> 集合来存储值:

    var queue = new Queue<float>();
    queue.Enqueue(1.0f); // pushes new item
    queue.Dequeue(); // removes oldest item
    

    要获得平均值,请使用 LINQ Average() 扩展方法:

    var average = queue.Average();
    

    【讨论】:

      【解决方案3】:

      堆栈是 LIFO(后进先出)。

      如果要删除最旧的值,则需要使用队列(先进先出)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-12
        • 1970-01-01
        • 2010-12-19
        • 1970-01-01
        • 2014-07-29
        • 2016-09-08
        • 2016-02-29
        • 2023-04-10
        相关资源
        最近更新 更多