2010-04-20 22 views
13

Ich habe einen Wertebereich von 0 bis 255.C# -Methode, um Werte zu skalieren?

Es gibt ein Verfahren, das ein Array mit min und max-Werte innerhalb dieses Bereichs zurückgibt, das heißt: 13, 15, 20, 27, 50 ... 240 wo 13 ist die min und 240 ist die max

Ich muss diese Werte skalieren, so dass 13 wird 0 und 240 wird 255 und skaliert alle anderen Werte zwischen ihnen proportional.

Gibt es eine C# -Methode, die das tut?

danke!

+1

Sind wir davon auszugehen, dass du klo bist König, um eine Reihe von Floats zu bekommen? –

+0

ja, ich vergaß zu erwähnen, dass ... Die Methode würde dieses Array erhalten und ein neues skaliert zurückgeben. –

Antwort

18

Verwenden Sie diese Formel

y=mx+c 

wo m = (255-0)/(244-13) und c= -13*m

So haben Sie verwandeln nur das Array als solche

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

Anstatt 244 und 13 anzugeben, sollten Sie tatsächlich das tatsächliche Min und Max des angegebenen Arrays abrufen. –

+0

@ccomet, das sollte trivial sein – Graviton

+0

@ccomet, aktualisieren, um das Code-Segment allgemeiner zu machen. – Graviton

4

Wenn Sie .NET 3.5, dann mithilfe von LINQ kann leicht die minimalen und maximalen Werte von jedem IEnumerable<T> Objekt erhalten, das ein Array ist.

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

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

Wenn Sie sich für etwas zu skalieren das gesamte Array ...

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

Er kennt die max und min. Er möchte die Werte in der Mitte transformieren, so dass sie von 0 bis 255 werden. –

+0

@Daniel: Es ist eine gute Methode, wiederverwendbare Methoden zu konstruieren, ob er die Werte kennt oder nicht. – fearofawhackplanet

+0

@fearofawhackplanet: Mein Kommentar war nur für eine erste Version der Frage anwendbar, die nur gesagt hat, wie man das Maximum und das Minimum finden kann, und nichts über Skalierung. Interessanterweise gibt es diese Version nur in meinen Träumen: http://stackoverflow.com/posts/2675221/revisions –

4

zu skalieren Wert in einem Bereich (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; 
} 

Für min suchen und max vom eingehenden Array

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