【问题标题】:resize int array in C# by getting average doesn't work?通过获取平均值来调整 C# 中的 int 数组大小不起作用?
【发布时间】:2012-01-07 05:21:30
【问题描述】:

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

我想得到一个 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

另一个 Last 数组: 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

【问题讨论】:

  • 是否仅用于数组调整大小?看起来你也在做一些我不遵循的平均操作。你能详细说明你想要达到的目标吗?
  • @ahmadali 所以你想调整数组的大小并用平均项目填充元素(平均哪些项目是newSize)?
  • @fardjad:是的,但是这段代码没有返回真正的数组
  • @Scott:它只是返回新数组,包括从 0 到 NewSize 的 Last 数组项。没有得到平均!!!

标签: c# arrays c#-4.0


【解决方案1】:

您不能只选择这样的值并将它们相加,您需要对要放入新值的每个旧值的分数进行一些平均和计算。看看“重采样”算法,例如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();
    }

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • :这是什么:int[] NewArray = new int[NewSize]; ?!?如果我不初始化 NewArray[] 就没有结果
      • 您没有设置明确的值。因此你有 0。
      猜你喜欢
      • 2011-12-26
      • 2014-12-25
      • 1970-01-01
      • 2015-07-01
      • 2022-07-08
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2016-10-24
      相关资源
      最近更新 更多