3

Мне нужно реализовать функцию, которая нормализует координаты. Я определяю нормализуют, как (пожалуйста, предложите лучшего термина, если Im неправильно):Нормализация 2D-координат

Отображение записей из набора данных из их естественного ареала до значений между 0 и 1.

Теперь это было легко в одном размер:

static List<float> Normalize(float[] nums) 
    { 
     float max = Max(nums); 
     float min = Min(nums); 
     float delta = max - min; 

     List<float> li = new List<float>(); 
     foreach (float i in nums) 
     { 
      li.Add((i - min)/delta); 
     } 
     return li; 
    } 

Мне также нужна двумерная версия, и мы должны сохранить неизменное соотношение сторон. Но у меня есть некоторые проблемы, излагающие математику.

Хотя код отправлен в C#, ответов не должно быть.

Заранее спасибо. :)

ответ

1

Простая идея: Узнайте, какое измерение больше и нормализуется в этом измерении. Второе измерение можно вычислить, используя соотношение. Таким образом, соотношение сохраняется и ваши значения находятся между 0 и 1.

+0

Вы имеете в виду, что я должен рассчитать * delta * для обоих измерений и использовать большее число во время нормализации обоих? – Mizipzor

+0

Да, это делает то же самое и даже проще :). – kasten

5

Кажется, что каждый вектор (1D, 2D или ND) имеет длину <= 1.
Если это единственное требование, вы можете просто разделить каждый вектор на длину самого длинного.

double max = maximum (|vector| for each vector in 'data'); 
foreach (Vector v : data) { 
    li.add(v/max); 
} 

Это сделает самый длинный вектор в списке результатов, чтобы иметь длину 1.

Но это не будет эквивалентом текущего кода для 1-мерного случая, так как вы не можете найти минимальными или максимум в наборе точек на плоскости. Таким образом, нет delta.

+0

Ударьте мне :) – ChrisF

+0

Hm. Возможно, я сделал плохой вызов, требуя наименьшего значения в 0 и самого высокого значения в 1. Предполагаю, что это обычно предпочтительный способ нормализации координат? – Mizipzor

+0

@mizipzor Вы можете выбрать вектор, равный нулю, и вычесть его из каждого вектора ввода. Скажем, у вас есть (0, 1), (1, 0) и (2, 2) и get (0, 0), (1, -1), (2, 1), перемещая первый вектор в нуль. –