Страницы: 1
RSS
Определение амплитуды
 
Здравствуйте!
Возникла проблема в работе с экселем, а именно в написание формулы для определения максимального/минимального значения на участках в одном большом массиве.
Задача такая:
Имеется очень большой массив данных около 100000 значений, с Божей помощью из этого массива были определены все экстремумы (макс, мин, нули) этой кривой с помощью формулы
Код
=ЕСЛИ(И(E3<E2;E3<=E4);"min";ЕСЛИ(И(E3>E2;E3>=E4);"max";ЕСЛИ(ИЛИ(И(E3*E2<=0;ABS(E3)<ABS(E2));И(E3*E4<=0;ABS(E3)<ABS(E4)));"ZERO";"")))


Встал вопрос как найти максимальное значение между нулями для нахождения амплитуды волны.
P.s. Как найти амплитуду знаю, нужна помощь для нахождения  (max, min) волны между нулями
 
ну и взять максимум максимумов..
Живи и дай жить..
 
Цитата
ну и взять максимум максимумов..
Я понимаю, что взять максимум максимумов, но я не могу сообразить как это
 
Почему так не сделать?
=ЕСЛИ(ABS(A2)<ABS(A1);A1;"")
 
Формула выводит ряд значений, а в моем случае нужно одно значение между нулями.
 
Так...
Этим =ЕСЛИ(ABS(A2)<ABS(A1);A1;"") выводите список всех максимальных между нулями допустим в столбце "С", а функцией МАКС(С:С) получаете одно значение.
 
Павел немного не понимаю, как обозначаются нули в формуле =ЕСЛИ(ABS(A2)<ABS(A1);A1;"" ;) , но идею понимаю, буду про бывать, спасибо за совет.
А формуле МАКС(С:С) (с:с) - массив от нуля до нуля подразумевается? Возможно ли написать формулу для всего массива, чтобы она сама определяла максимальное значение между нулями, а то данных много, применять МАКС(С:С) не совсем удобно.
Изменено: exspe - 08.11.2013 08:12:45
 
Формула =Макс(с:с) не подходит, т.к. в ручную искать интервалы очень долго, т.к. массивы очень большие порядка 100000 строк, поэтому требуется формула позволяющая сразу определить максимумы на заданых участках в массиве.
 
exspe, вы меня запутали. Еще раз...
"вопрос как найти максимальное значение между нулями для нахождения амплитуды волны" - между какими нулями конкретно не указано, значит между всеми, т.е. максимальное значение из максимальных между нулями, ранее определенных формулой: "=ЕСЛИ(И(E3<E2;E3<=E4);"min";ЕСЛИ(И(E3>E2;E3>=E4);"max";ЕСЛИ(ИЛИ(И(E3*E2<=0;ABS(E3)<ABS(E2));И(E3*E4<=0;ABS(E3)<ABS(E4)));"ZERO";"")))".
Для этого диапазон с результатами этой формулы указываем в отдельной функции МАКС(), предварительно исправив первую формулу таким образом, чтобы она отображала не текстовые значения, а числовые, например, так "=ЕСЛИ(ABS(A2)<ABS(A1);A1;"")"
 
В примере который приложен к первому сообщению, столбец который выделен оранжевым и есть часть моего массива. Из массива с помощью формулы
Код
 "=ЕСЛИ(И(E3<E2;E3<=E4);"min";ЕСЛИ(И(E3>E2;E3>=E4);"max";ЕСЛИ(ИЛИ(И(E3*E2<=0;ABS(E3)<ABS(E2));И(E3*E4<=0;ABS(E3)<ABS(E4)));"ZERO";"")))".

были определены экстремумы (нули, максимумы и минимумы). Дело в том, что на этих интервалах (между нулями) не одно максимальное и минимальное значение, для решения моей задачи мне необходимо найти один (самое большое значение) максимум. Формулу которую вы мне посоветовали для определения максимумов
Код
=ЕСЛИ(ABS(A2)<ABS(A1);A1;"")

она мне выдает ряд максимальных значений между нулями, чтобы отбросить лишние максимальные значения и выбрать наибольший максимум из найденного ряда формула
Код
=МАКС(с:с)
мне не подходит, т.к. мой массив больше 100000 строк, т.е. равносильно ручной переборки значений, хотелось бы подобрать формулу, которая позволила определить эти максимальные значения сразу во всем массиве.
Прикрепил схематический рисунок, на котором изображен интервал между двумя нулями из большого массива, мне надо определить max3, и так со всеми интервалами во всем массиве.

Извините, что я сразу не объяснил поподробней.
 
Правильно ли я понял. Вы хотите для функции МАКС() ограничить выборку и передать в функцию найденные по формуле "=ЕСЛИ(И(E3<E2;E3<=E4);"min";ЕСЛИ(И(E3>E2;E3>=E4);"max";ЕСЛИ(ИЛИ(И(E3*E2<=0;ABS(E3)<ABS(E2));И(E3*E4<=0;ABS(E3)<ABS(E4)));"ZERO";"" ;) ))" значения?

Т.е. из базового массива значений кривой, формируется массив значений экстремумов, из него извлекаем 1 значение. Так?
Изменено: Павел - 08.11.2013 14:00:55
 
Да, одно значение для одного интервала.
Можно извлечь в другой столбец либо выделить значение в столбце с экстремумами
Изменено: exspe - 08.11.2013 14:37:30
 
Первый отрезок до первого нуля, правда, не придумал как просчитать. Проверьте, оно или нет.

Забыл добавить, что диапазон значений функции нужно выделять со второй ячейки. Т.е. первую цифру пропускаем, со второй и до последней указываем.
Изменено: Павел - 08.11.2013 14:39:45
 
Павел Это гениально!
Только один нюанс, можно ли сделать, так, чтобы значения при выводе соответствовали тем же строкам? Либо выделялись другим цветом в исходном массиве?
 
В принципе можно
 
Павел Спасибо Большое!
Да, конечно может мой вопрос покажется дурацким, но я не совсем понял, как вставляется кнопка  :oops:
 
через вкладку разработчик
http://office.microsoft.com/ru-ru/excel-help/HA101819080.aspx
 
Павел, хотел спросить у вас, а чтобы в Вашем коде выделить другим цветом мах и мин, надо добавить

Код
Interior.ColorIndex = 43 'zero
      .Interior.ColorIndex = 45 'max

в
Код
Arr(CurRange.Find(d, lookAt:=xlWhole).Row - .Cells(1).Row + 1, 0) = d
и
Zero = .Cells(l, 1)


или я ошибаюсь?
 
Выделяете ячейку Cells(CurRange.Find(d, lookAt:=xlWhole).Row - .Cells(1).Row + 1, здесь_укажите_номер _столбца) - это для макс. И для Zero можно напрямую задавать цвет: Zero.Interior.ColorIndex = 43
Изменено: Павел - 10.11.2013 15:14:10
 
Цитата
Павел пишет:
Выделяете ячейку Cells(CurRange.Find(d, lookAt:=xlWhole).Row - .Cells(1).Row + 1, здесь_укажите_номер _столбца)

номер или буквенное обозначение?
 
номер
 
спасибо, буду пробовать.
 
Павел, Доброе утро!
Пробовал внести изменения в код, для выделения ячеек, и заметил, что они выделяются с погрешностью (в 1-2 ячейки), как можно это поправить?
И хотел уточнить, какой строкой кода вы выводите результат в столбец "D"
 
Строкой
Код
.Offset(0, 2).Resize(, 1).Value = Arr

В команде Offset(0,2) говорит , что смещение должно быль на 0 строк внизу и на 2 столбца вправо.
А по поводу заливки цвета, то может использовали бы условное форматирование? Посмотрите на форуме примеры, так будет проще. (просто этот вопрос как бы к теме уже не относится)
 
Да насчет заливки это не особо критично, просто хотел понять, как устроен код.

У меня возник вопрос по еще одной строке:

Код
For l = 2 To UBound(Arr, 1)
Это обозначаются переменная для исходных данных из 2го столбца до конца массива, я правильно понял?
 
Почти. Если быть точным, то задается цикл (повтор операций) от l=2 до размер массива по первому измерению.

Если вы решили разобраться с логикой кода, то все просто: макрос перемножает текущую и следующую ячейку и в случае отрицательного значения фиксирует нуль, а когда находит второй нуль, то ищет на отрезке между текущим и предыдущим максимальное значение по [модулю], затем определяет его адрес на отрезке и записывает под этим адресом в массив.
Изменено: Павел - 11.11.2013 22:33:44
 
Павел, Благодарю Вас за помощь ;)
Страницы: 1
Читают тему
Наверх