изменить размер массива int в C #, получая среднее значение не работает? - PullRequest
1 голос
/ 27 ноября 2011

Я использую этот код, чтобы изменить размер массива до нового размера:

Я хочу получить массив 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;
    }

, но иногда он возвращает необоснованные числа!Как это:

Последний массив: 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 365365 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

Новый массив: 0421 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 280 421 421

другой Последний массив: 83 84 89 90 91 92 93 94 95 96 9799 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 164165 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 185125 191 129 197 133 203 206

Ответы [ 3 ]

3 голосов
/ 27 ноября 2011

Вы не можете просто подобрать такие значения и суммировать их, вам нужно будет сделать некоторое усреднение и вычислить долю каждого старого значения, которое вы хотите поместить в новые значения.Взгляните на алгоритмы «ресэмплирования», например 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();
    }
0 голосов
/ 27 ноября 2011

NewArray[0]==0 потому что вы начинаете свой внешний цикл for с i = 1 вместо i = 0.

Два разных значения, появляющиеся в остальной части массива, связаны с тем, что некоторые блоки имеют больше элементов LastArray, чем другие, поскольку они не делятся равномерно. Тем не менее, вы всегда делите на одно и то же число ((double)LastArray.Length / (NewSize)), чтобы попытаться вычислить среднее значение, которое не будет работать. Вместо этого вы должны поделить на фактическое количество значений, которые вы добавили к c, что составляет

(int)((i + 1) * ((double)LastArray.GetUpperBound(0) / (NewSize))) - 
   (int)(i * ((double)LastArray.GetUpperBound(0) / (NewSize)))
0 голосов
/ 27 ноября 2011

Вы не инициализируете NewArray [0].Тогда код, который вы показываете, недопустим, потому что инструкция цикла j неполна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...