Нужна помощь в составлении формулы

Автор темы mishaurgeu 
ОбъявленияПоследний пост
ОбъявлениеРаботодателям и кадровым агентствам: Размещение вакансий26.03.2008 03:07
ОбъявлениеЗапущен новый раздел «Задачки и головоломки»29.08.2019 00:42
ОбъявлениеОткрыта свободная публикация вакансий для математиков26.09.2019 16:34
14.02.2014 18:29
Нужна помощь в составлении формулы
Здравствуйте уважаемые пользователи!

У меня на работе возникла необходимость составить одну формулу. На первый взгляд все довольно просто, и тем не менее у меня не получается найти решение. Искренне надеюсь на вашу помощь. В случае если вам она покажется простой, напишите хотя бы о том, что ее все-таки можно найти.

Итак

Есть случайный набор чисел, например:

-8
6
3
-9
-1
0
2
0
0
-9
0

Числа могут быть любые, но среди них надо выделить три группы. Первая это положительные числа, вторая это отрицательные числа и третья это нули. Задача состоит в том, чтобы при помощи одной формулы преобразовать эти числа в отрицательные и положительные единицы по следующим правилам:
1) Любое положительное число должно быть преобразовано в положительную единицу;
2) Любое отрицательное число должно быть преобразовано в отрицательную единицу;
3) Ноль, идущий в ряду после положительного числа должен быть преобразован в положительную единицу;
4) Ноль, идущий после отрицательного числа должен быть преобразован в отрицательную единицу;
5) Ноль, идущий в ряду после нуля, преобразованного в положительную единицу, должен быть преобразован в положительную единицу;
6) Ноль, идущий в ряду после нуля, преобразованного в отрицательную единицу, должен быть преобразован в отрицательную единицу.


Т.е. если преобразовать ряд чисел, приведенный выше, мы получим

-1
1
1
-1
-1
-1
1
1
1
-1
-1

Преобразование положительных и отрицательных чисел конечно же элементарное, но вот с нулями у меня возникла проблема

Заранее спасибо за помощь!
14.02.2014 20:39
что такое "формула"
Что вы понимаете под "одной формулой"? Функцию? От каких аргументов? Ясно, что не от одного текущего.
В программе это сделать легко: менять число, как только сменится знак.

дважды два - не всегда 5
14.02.2014 21:01
вот так, например
$b_k=\sign(b_{k-1}+2a_k)$. Это если числа целые.

дважды два - не всегда 5
14.02.2014 21:04
Возможно я не совсем точно сформулировал
Если предположить, что в ряду нет нулей, то формула будет x/|x|. Таким образом любое положительное число х будет преобразовано в положительную единицу, а любое отрицательное в отрицательную единицу. Но это конечно верно только если в ряду нет нулей.

Да, еще одно допущение, для первого числа можно не определять значение, т.е. формула может применяться, начиная со второго числа в ряду

Представьте таблицу в excel. Первый столбец это случайные числа. Во втором столбце формула, которая копируется на весь столбец.


Цитата
provincialka
$b_k=\sign(b_{k-1}+2a_k)$. Это если числа целые.
Нет, числа могут быть любые, с бесконечным количеством знаков после запятой



Редактировалось 1 раз(а). Последний 14.02.2014 21:06.
14.02.2014 21:54
после запятой - неважно
Важно, не будут ли числа по модулю меньше 1 (а вернее, меньше 1/2). Идея основана на том, что если $a_k$ не ноль, то в сумме это значение "перевесит" единичку, полученную для предыдущего числа. Если такое может случиться, "навесьте" на $a_k$ еще один сигнум.

дважды два - не всегда 5
14.02.2014 21:57
функция sign
Функция "сигнум" как раз дает 1, 0 или -1 для положительных чисел, нуля и отрицательных соответственно. В Ecxel она называется ЗНАК.

дважды два - не всегда 5
14.02.2014 22:11
Ну предположим
Цитата
provincialka
Функция "сигнум" как раз дает 1, 0 или -1 для положительных чисел, нуля и отрицательных соответственно. В Ecxel она называется ЗНАК.
знаю, я ее уже пробовал(((

Предположим я сумел как-то избавиться от чисел меньше 1/2, возникает другая проблема. Формула не будет работать для ряда чисел подобному

3
0
0

По вашей формуле для третьего числа мы получим значение "0", а должно быть 1, потому что первое число, не равное нулю, которое идет в ряду до него положительное. Да и вообще в преобразованном ряду не должно быть нулей, только 1 или -1.

Ряд чисел случаен и я не могу сказать какое количество нулей подряд может в нем быть.



Редактировалось 1 раз(а). Последний 14.02.2014 22:12.
14.02.2014 23:11
Формула
$ \gamma_i= sign(a_i)Ind(a_i\ne 0) + \gamma_{i-1} Ind(a_i= 0) = sign(a_i) sign^2(a_i) + \gamma_{i-1}(1- sign^2(a_i) ) $.
Индикаторы можно представить другими формулами.



Редактировалось 1 раз(а). Последний 14.02.2014 23:13.
14.02.2014 23:15
Вы не заметили
что там две буквы: $a$ и $b$? Имелось в виду, что $a$ - "старые" числа, а $b$- "новые". Они равны только 1 или -1. Подумайте все-таки немного сами, не ждите, что вам разжуют и в рот положат.

В вашем примере получим: $b_1=sign 3 =1, b_2=sign(1+2\cdot 0)= 1$, ... Если же четвертое число будет равно -2, то $b_4=sign(1+2\cdot(-2))=sign(-3)=-1$.
Если числа $a$ могут быть маленькими, формула переписывается так: $b_k=sign(b_{k-1}+2sign(a_k))$

дважды два - не всегда 5



Редактировалось 1 раз(а). Последний 14.02.2014 23:19.
14.02.2014 23:26
...
Цитата
provincialka
... формула переписывается так: $b_k=sign(b_{k-1}+2sign(a_k))$
и прекрасно работает.
14.02.2014 23:29
Спасибо
Цитата
provincialka
что там две буквы: $a$ и $b$? Имелось в виду, что $a$ - "старые" числа, а $b$- "новые". Они равны только 1 или -1. Подумайте все-таки немного сами, не ждите, что вам разжуют и в рот положат.

В вашем примере получим: $b_1=sign 3 =1, b_2=sign(1+2\cdot 0)= 1$, ... Если же четвертое число будет равно -2, то $b_4=sign(1+2\cdot(-2))=sign(-3)=-1$.
Если числа $a$ могут быть маленькими, формула переписывается так: $b_k=sign(b_{k-1}+2sign(a_k))$
Ладно вам на новичка наезжать, сразу не понял. Большое спасибо за помощь!
14.02.2014 23:56
Извините, была неправа
Набирала в дороге с телефона, поэтому формулы без пояснений.

дважды два - не всегда 5
Извините, только зарегистрированные пользователи могут публиковать сообщения в этом форуме.

Кликните здесь, чтобы войти