2010-04-20 23 views
13

I tienen un rango de valores de 0 a 255.Método C# para escalar valores?

Hay un método que devuelve una matriz con un valores mínimo y máximo dentro de este rango, es decir: 13, 15, 20, 27, 50 ... 240 donde 13 es el mínimo y 240 es el máximo

Necesito escalar estos valores para que 13 se convierta en 0 y 240 se convierta en 255 y escalar proporcionalmente todos los demás valores entre ellos.

¿Hay algún método de C# que hace eso?

gracias!

+1

¿Debemos suponer que usted es retrete? rey para obtener una gran variedad de flotadores? –

+0

sí, olvidé mencionar que ... El método recibiría esa matriz y devolvería una nueva a escala. –

Respuesta

18

Use esta fórmula

y=mx+c 

donde m = (255-0)/(244-13) y c= -13*m

Así que hay que acaba de transformar la matriz como tal

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

En lugar de especificar 244 y 13, realmente debería recuperar el mínimo y el máximo real de la matriz especificada. –

+0

@ccomet, que debería ser trivial – Graviton

+0

@ccomet, actualizar para hacer que el apartado del código sea más general. – Graviton

4

Si está utilizando .NET 3.5, a continuación, LINQ puede obtener fácilmente los valores mínimo y máximo de cualquier objeto IEnumerable<T>, que es una matriz.

int[] values = new int[] { 0, 1, 2, ... 255 }; 

int minValue = values.Min(); 
int maxValue = values.Max(); 

Si usted está buscando algo para escalar todo el conjunto ...

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

Conoce el max y el min. Quiere transformar los valores en el medio para que pasen de 0 a 255. –

+0

@Daniel: es una buena práctica construir métodos reutilizables independientemente de si conoce los valores o no. – fearofawhackplanet

+0

@fearofawhackplanet: Mi comentario solo era aplicable para una primera versión de la pregunta, que solo decía cómo se puede encontrar el máximo y el mínimo, y nada sobre escalar. Curiosamente, esta versión solo existió en mis sueños: http://stackoverflow.com/posts/2675221/revisions –

4

Para escala de valores en un rango (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; 
} 

Para encontrar min y máx. de la matriz entrante

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