我用的数据采集卡,数据存储是这样求平均值的(一边采集一边算平均值放在Excel表中的):取了第一个数放在excel的固定单元格中,取第二个数时把采集两个数的平均值还放回到刚才的单元格中,第三,第四如此类推,我要取100个数,  我虽然求出平均值,但稳定性不要,我要在这100个数中去掉10个最大值,10个最小值,就乘下80个数据的平均值,请问高手该怎么办啊???????

解决方案 »

  1.   

    dim a(100-1) as long
    dim i as long, j as long
    for i=0 to 99
      a(i) = 采集数据
      for j=i+1 to 99 '用以采集的数循环填充满 100 个成员
        a(j) = a(j mod i)
      next
      cell("A1") = AVG(a)
    nextfunction AVG(a() as long) as double
      dim b() as long
      dim i as long
      dim sum as long
      b = sort(a) '复制一个数组并排序
      for i= 20 to 79
        sum = sum + b(i)
      next
      avg = sum / 80
    end function
      

  2.   

    再请问我如采集多通道(比如32通道)的数据,那一个一维数据就不行了,就要建一个二维动态数组了,(就是一行是一个通道采集的100个数据),那怎样进行排序,并把每一行求出来的平均数保存到对应的Excel表中,再请你帮忙一下啊~~~~~~谢了!!!!!
      

  3.   

    a(j) = a(j mod i) 'i=0时,不会出错吗?
      

  4.   

    这样做:
    1 排序采用 ListBox 控件,设置成 Visual = False, Sorted = True。
    2 将你轮询得到的数据顺序存放一个数组中。Dim a(1 To 3200) As Long, i As Integer, j As Integer
    Dim sum As Double, avg(1 To 32) As DoubleFor i = 1 To 32
        List1.Clear
        For j = i To 3200 Step 32
            List1.AddItem Right("0000000" & Hex(a(j)), 8)
        Next j
        sum = 0
        For j = 10 To 89
            sum = sum + Val("&H" & List1.List(j))
        Next j
        avg(i) = sum / 80
    Next i
      

  5.   

    不好意思,应该用 a(j) = a(j mod (i+1))不知道你采集的次序如何:
    如果是采集完一个通道(100个值)再处理下一个通道,只要在 for i=0 to 99 外面再套一个按通道的循环;
    如果是所有通道取完第一个值再处理下个值,如下修改:
    Type data
        a(100 - 1) As Long
    End TypeSub Main()
        Dim channels(32 - 1) As data
        Dim i As Long, j As Long, c As Long
        For i = 0 To 99
          For c = 0 To 31
            channels(c).a(i) = 采集数据(c)
            For j = i + 1 To 99 '用以采集的数循环填充满 100 个成员
              channels(c).a(j) = channels(c).a(j Mod (i + 1))
            Next
            cell("R1C" & c) = Avg(channels(c).a)
          Next
        Next
    End Sub排序过程随便用冒泡或快排之类的算法,唯一区别是先复制数组作为结果已保证已采样值位置不变。