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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

desember12
Сообщения: 6
Зарегистрирован: 10 дек 2015, 22:04

В вещественном массиве отнормировать все числа по максимальному элементу.Как это реализовать? заранее спасибо
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Найти максимальный по модулю элемент, потом поделить все элементы массива на него, или нет?
2B OR NOT(2B) = FF
desember12
Сообщения: 6
Зарегистрирован: 10 дек 2015, 22:04

Absurd писал(а):Найти максимальный по модулю элемент, потом поделить все элементы массива на него, или нет?
Да так) А можете ygbcfnm код пожалуйста.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

А что именно у тебя не получается в написании этого кода? Цикл написать не можешь? Или не понимаешь, как найти максимальное по модулю значение элемента?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
desember12
Сообщения: 6
Зарегистрирован: 10 дек 2015, 22:04

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

И цикл и max по модулю значение. Помогите пожалуйста
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ну если всё так запущено, то моя помощь лишь повредит. Приложи хоть немного усилий сам. Воспользуйся гуглом в конце концов. Вот, например, по циклам тебе запрос.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

И цикл и max по модулю значение. Помогите пожалуйста
Так не годится. Сначала напиши код который не работает, а мы поправим. А не то и так ракеты уже не летают в нашей стране. В США студенты процессоры сами делают. Русуют схематику на VHDL и несут их в лабораторию литографию делать.
2B OR NOT(2B) = FF
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Absurd Да кому это нужно, все же мечтают стать менеджером, что бы это не значило..
[syntax=Delphi] [/syntax]
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

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;
 }
}
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Во-первых это не нормирование, т.к если в массиве числа в диапазоне [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 и современном С++ вообще (пара итераторов).
2B OR NOT(2B) = FF
Ответить