在c#中通过获取平均值来调整int数组的大小是行不通的

本文关键字:数组 int 行不通 调整 平均值 获取 | 更新日期: 2023-09-27 18:15:46

我使用下面的代码来调整数组的大小:

我想得到一个int数组,然后返回一个新的数组,由Lastarray的项目的平均新大小。

    private int[] ResizeArray(int[] LastArray, int NewSize)
    {
        if (LastArray.GetUpperBound(0) == (NewSize-1))
        {
            return LastArray;
        }
        int i = 0;
        int j = 0;
        int c = 0;
        int[] NewArray = new int[NewSize];
        for (i = 1; i < NewSize; i++)
        {
            c = 0;
            for (j = (int)(i * ((double)LastArray.GetUpperBound(0) / (NewSize))); j <= ((i + 1) * ((double)LastArray.GetUpperBound(0) / (NewSize)) - 1); j++)
            {
                c += LastArray[j];
            }
            NewArray[i] = (int)(c / ((double)LastArray.Length / (NewSize)));
        }
        return NewArray;
    }

但有时它返回不合理的数字!这样的:

最后数组:365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365365

新数组:0421280421280421280421421280421280421280421421280421280421280421421280421280421280421421

another Last数组:838489909192939495969799One hundred.101102104105106109111112114116118120121123125127128130132133134136137138140141142144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181

another New array:01037110975116801251319114198151103159164111170115176119182185125191129197133203206

在c#中通过获取平均值来调整int数组的大小是行不通的

您不能只是选择这样的值并将它们相加,您需要对每个想要放入新值的旧值的部分进行平均和计算。看看"重新采样"算法,例如http://drdobbs.com/184405045

这是一个简单的重采样器,它向上采样第一个数组,然后向下采样它。不是很有效,但也许更容易理解:

    private static int[] ResizeArray(int[] oldArray, int newSize)
    {
        int oldSize = oldArray.Length;
        int rectangle = newSize * oldSize;
        var upsampled = Enumerable.Range(0, rectangle).Select(k => oldArray[k / newSize]).ToArray();
        var downSampled = Enumerable.Range(0, newSize).Select(j => Enumerable.Range(0, oldSize-1).Select(i => upsampled[j * oldSize + i])).Select(g => g.Average());
        return downSampled.Select(i => (int)i).ToArray();
    }

未初始化NewArray[0]。那么您所显示的代码无效,因为j循环指令是不完整的。

NewArray[0]==0,因为您在i=1而不是i=0处开始外部for循环。

出现在数组其余部分的两个不同的值是因为某些块具有比其他块更多的LastArray元素,因为它们没有均匀地划分。然而,你总是除以相同的数字((double)LastArray.Length / (NewSize))来试图计算平均值,这是行不通的。您应该除以添加到c的实际值的数量,即

(int)((i + 1) * ((double)LastArray.GetUpperBound(0) / (NewSize))) - 
   (int)(i * ((double)LastArray.GetUpperBound(0) / (NewSize)))