Страница 1 из 2

Отнормировать вещественный масиив

Добавлено: 10 дек 2015, 22:05
desember12
В вещественном массиве отнормировать все числа по максимальному элементу.Как это реализовать? заранее спасибо

Re: В вещественном массиве отнармировать все числа по максимальному элементу.Как это

Добавлено: 10 дек 2015, 22:20
Absurd
Найти максимальный по модулю элемент, потом поделить все элементы массива на него, или нет?

Re: В вещественном массиве отнармировать все числа по максимальному элементу.Как это

Добавлено: 11 дек 2015, 10:13
desember12
Absurd писал(а):Найти максимальный по модулю элемент, потом поделить все элементы массива на него, или нет?
Да так) А можете ygbcfnm код пожалуйста.

Re: Отнормировать вещественный масиив

Добавлено: 11 дек 2015, 10:33
Romeo
А что именно у тебя не получается в написании этого кода? Цикл написать не можешь? Или не понимаешь, как найти максимальное по модулю значение элемента?

Re: Отнормировать вещественный масиив

Добавлено: 11 дек 2015, 10:34
desember12
Romeo писал(а):А что именно у тебя не получается в написании этого кода? Цикл написать не можешь? Или не понимаешь, как найти максимальное по модулю значение элемента?

И цикл и max по модулю значение. Помогите пожалуйста

Re: Отнормировать вещественный масиив

Добавлено: 11 дек 2015, 10:42
Romeo
Ну если всё так запущено, то моя помощь лишь повредит. Приложи хоть немного усилий сам. Воспользуйся гуглом в конце концов. Вот, например, по циклам тебе запрос.

Re: Отнормировать вещественный масиив

Добавлено: 11 дек 2015, 10:45
Absurd
И цикл и max по модулю значение. Помогите пожалуйста
Так не годится. Сначала напиши код который не работает, а мы поправим. А не то и так ракеты уже не летают в нашей стране. В США студенты процессоры сами делают. Русуют схематику на VHDL и несут их в лабораторию литографию делать.

Re: Отнормировать вещественный масиив

Добавлено: 11 дек 2015, 12:24
Duncon
Absurd Да кому это нужно, все же мечтают стать менеджером, что бы это не значило..

Re: В вещественном массиве отнармировать все числа по максимальному элементу.Как это

Добавлено: 12 дек 2015, 15:04
Сионист
desember12 писал(а):Да так) А можете ygbcfnm код пожалуйста.
Нет не так. Надо найти минимальный и максимальный элементы. Новое значение каждого элемента равно отношению разности его старого значения и старого минимума массива к разности старых максимума и минимума массива.

Код: Выделить всё

template <typename Type> void Norm(Type *Data, size_t Count)//Значение Count и валидность указателя не проверяются
{
 size_t i;
 Type Min;
 Type Max;
 for (i=1, Min=Data[0], Max=Data[0]; i<Count; ++i)
 {
  if (Min>Data[i])
  {
   Min=Data[i];
  }
  if (Max<Data[i])
  {
   Max=Data[i];
  }
 }
 for (i=0; i<Count; ++i)
 {
  Data[i]=(Data[i]-Min)/(Max-Min);
 }
}

Код: Выделить всё

template <typename Type> void Norm(Type *Data, size_t Count)//Значение Count и валидность указателя не проверяются
{
 size_t i;
 Type Min;
 Type Max;
 Type Range;
 for (i=1, Min=Data[0], Max=Data[0]; i<Count; ++i)
 {
  if (Min>Data[i])
  {
   Min=Data[i];
  }
  if (Max<Data[i])
  {
   Max=Data[i];
  }
 }
 Range=Max-Min;
 for (i=0; i<Count; ++i)
 {
  Data[i]=(Data[i]-Min)/Range;
 }
}
,

Код: Выделить всё

template <typename Type> void Norm(Type *Data, size_t Count)//Значение Count и валидность указателя не проверяются
{
 size_t i;
 Type Min;
 Type Max;
 Type Range;
 for (i=Count, Min=Data[0], Max=Data[0]; i>0; --i)
 {
  if (Min>Data[i])
  {
   Min=Data[i];
  }
  if (Max<Data[i])
  {
   Max=Data[i];
  }
 }
 Range=Max-Min;
 for (i=Count-1; i>=0; --i)
 {
  Data[i]=(Data[i]-Min)/Range;
 }
}

Код: Выделить всё

template <typename Type> void Norm(Type *Data, size_t Count)//Значение Count и валидность указателя не проверяются
{
 Type *Item;
 Type Min;
 Type *Max;
 Type Range;
 for (Item=Data+Count-1, Min=*Data, Max=Data; Item>Data; --Item)
 {
  if (Min>(*Item))
  {
   Min=(*Item);
  }
  if ((*Max)<(*Item))
  {
   Max=Item;
  }
 }
 Range=(*Max)-Min;
 for (Item=Data+Count-1; Item>=Data; --Item)
 {
  (*Item)=((*Item)-Min)/Range;
 }
}

Re: В вещественном массиве отнармировать все числа по максимальному элементу.Как это

Добавлено: 12 дек 2015, 17:04
Absurd
Во-первых это не нормирование, т.к если в массиве числа в диапазоне [0.2 .. 1.0], то после такого нормирования они будут замаплены на диапазон [0..1], что неверно. Это похоже на какое-то автовыравнивание уровней в Фотошопе, когда самый темный серый превращается строго в черный, а самый светлый серый превращается в белый, но это не нормирование. Норма нуля по определению это 0, так как с точки зрения математики норма это расстояние точки от нуля в метрическом пространстве. Поэтому в результате нормирования ноль должен быть отображен на ноль, поскольку ноль это инвариант у операции "норма". Во-вторых для массива единичной длины Max - Min тождественно равно 0, и в результате массив из одного элемента вроде {1.2} превращается в {-nan(ind)} в результате вычисления (1.2-1.2)/(1.2-1.2). Кстати, то же самое будет если все элементы в массиве равны. Ну и в третьих оно всегда читает первый элемент, даже у массива нулевой длины, что неверно. Если массив нулевой длины, то первого элемента не существует физически.

Ну и по стилю: непонятно зачем делать тип элемента шаблонным параметром, когда можно сделать таковым тип самой последовательности, чтобы передавать туда std::vector<double>, например. Стиль передачи параметров указатель + длина характерен для Си не соответствует тому что принят в STL и современном С++ вообще (пара итераторов).