【问题标题】:C# method to scale values?C#方法来缩放值?
【发布时间】:2010-04-20 12:51:30
【问题描述】:

我的值范围是 0 到 255。

有一种方法可以返回一个具有此范围内的最小值和最大值的数组,即:13、15、20、27、50 ... 240 其中 13 是最小值,240 是最大值

我需要缩放这些值,使 13 变为 0,240 变为 255,并按比例缩放它们之间的所有其他值。

是否有任何 C# 方法可以做到这一点?

谢谢!

【问题讨论】:

  • 我们是否假设您正在寻找一组浮点数?
  • 是的,我忘了提...该方法将接收该数组并返回一个缩放的新数组。

标签: c# .net math


【解决方案1】:

使用这个公式

y=mx+c

m = (255-0)/(244-13)c= -13*m 的位置

所以你必须像这样转换数组

 public double[] GetScaling(double[] arr, double min, double max)
{
    double m = (max-min)/(arr.Max()-arr.Min());
    double c = min-arr.Min()*m;
    var newarr=new double[arr.Length];
    for(int i=0; i< newarr.Length; i++)
       newarr[i]=m*arr[i]+c;
    return newarr;
}

【讨论】:

  • 您应该真正检索指定数组的实际最小值和最大值,而不是指定 244 和 13。
  • @ccomet,这应该是微不足道的
  • 谢谢!!工作完美!但是双 m = (255-0)/(244-13);返回一个 int,它应该被转换为 double...
  • 你不应该计算一次m,而是在每个索引中使用它。这样可以避免使用浮点数,您可以只使用整数进行所有数学运算,从而避免所有相关的舍入问题(例如,将 4.9997 舍入为 4)。
【解决方案2】:

在一个范围内缩放值(minScale,maxScale)

private double Scale(int value , int min, int max, int minScale, int maxScale)
{
  double scaled = minScale + (double)(value - min)/(max-min) * (maxScale - minScale);
  return scaled;
}

从传入数组中查找最小值和最大值

var min = Array.Min();
var max = Array.Max();

【讨论】:

    【解决方案3】:

    如果您使用的是 .NET 3.5,则 LINQ 可以轻松地从任何 IEnumerable&lt;T&gt; 对象(即数组)中获取最小值和最大值。

    int[] values = new int[] { 0, 1, 2, ... 255 };
    
    int minValue = values.Min();
    int maxValue = values.Max();
    

    如果您正在寻找可以扩展整个数组的东西...

    public static int[] Scale(int[] values, int scaledMin, int scaledMax)
    {
        int minValue = values.Min();
        int maxValue = values.Max();
    
        float scale = (float)(scaledMax - scaledMin) / (float)(maxValue - minValue);
        float offset = minValue * scale - scaledMin;
    
        int[] output = new int[values.Length];
    
        for (int i = 0; i < values.Length; i++)
        {
            output[i] = (int)Math.Round(values[i] * scale - offset, 0);
        }
    
        return output;
    }
    

    【讨论】:

    • 他知道最大值和最小值。他想转换中间的值,使它们从 0 变为 255。
    • @Daniel:无论他是否知道值,构造可重用方法都是一个好习惯。
    • @fearofawhackplanet:我的评论仅适用于问题的第一个版本,它只是说明了如何找到最大值和最小值,而与缩放无关。有趣的是,这个版本只存在于我的梦中:stackoverflow.com/posts/2675221/revisions
    • 发布后 5 分钟内的编辑不会被记录。但不用担心!我看到了你看到的“梦想”版本。
    • @ccornet 谢谢,我不知道这个!
    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多