通过获取平均值不起作用在C#中调整int数组?

时间:2011-11-27 07:12:26

标签: c# arrays c#-4.0

我使用此代码将数组大小调整为新大小:

我想获得一个int数组,然后返回一个新数组,该数组的大小由Lastarray的Items的平均值产生。 (例如,将图片调整为新尺寸)

    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;
    }

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

最后一个数组: 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365 365

新阵列: 0 421 280 421 280 421 280 421 421 280 421 280 421 280 421 421 280 421 280 421 280 421 421 280 421 280 421 280 421 421

另一个最后一个数组: 83 84 89 90 91 92 93 94 95 96 97 99 100 101 102 104 105 106 109 111 112 114 116 118 120 121 123 125 127 128 130 132 133 134 136 137 138 140 141 142 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181

另一个新数组: 0 103 71 109 75 116 80 125 131 91 141 98 151 103 159 164 111 170 115 176 119 182 185 125 191 129 197 133 203 206

3 个答案:

答案 0 :(得分:3)

你不能只选择这样的值并总结它们,你需要做一些平均和计算你想要放入新值的每个旧值的分数。看看'重新采样'算法,例如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();
    }

答案 1 :(得分:0)

您没有初始化NewArray [0]。 然后你显示的代码无效,因为j循环指令不完整。

答案 2 :(得分:0)

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)))