2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Поэлементное сравнение массива с числом, Mathematica
Сообщение16.03.2012, 20:15 
Здравствуйте.

У меня следующая проблема - необхидомо написать цикл проверки каждого элемента массива на то больше он нуля или меньше. Если меньше - заменить этот элемент нулем, если больше - возвести в 3ю степень. Вещь довольно простая.

Вот мой цикл, но он не работает:

x = Array[{#1} &, 250];
u1 = 15;
If [(x - u1) < 0, 0, (x - u1)^3]

Я прочитал, что математика работает с массивом как раз поэлементно, но в моем случае она пытается сравнить весь массив с нулем и, соответственно, ничего не получается.

Заранее спасибо!

Подскажите, пожалуйста, в чем ошибка?

 
 
 
 Re: Поэлементное сравнение массива с числом, Mathematica
Сообщение16.03.2012, 20:39 
Может подойдет такое безцикленное решение:
Код:
Clear[f];
f[x_ /; x <= 0] := 0;
f[x_ /; x > 0] := x^3;

x = Table[RandomInteger[{-100, 100}], {i, 250}]
Map[f, x]

 
 
 
 Re: Поэлементное сравнение массива с числом, Mathematica
Сообщение16.03.2012, 21:07 
Да, спасибо большое!

Я его немного модифицировал под свой пример, но сейчас работает так как нужно. Я Математикой пользуюсь совсем недавно и, если честно, о таком варианте решения даже не подозревал.

В принципе, тему можно закрывать, но было бы интересно узнать почему мой If не работал.
В любом случае, большое спасибо за ответ!

 
 
 
 Re: Поэлементное сравнение массива с числом, Mathematica
Сообщение16.03.2012, 21:32 
На самом деле, мне стоило объявить f так:
Код:
f[x_] := If[x <= 0, 0, x^3]

Теперь про ваш if. Сравните
Код:
{-1, 1} < 0
и
Код:
-1 < 0

Первое не логическое выражение.

 
 
 
 Re: Поэлементное сравнение массива с числом, Mathematica
Сообщение17.03.2012, 01:13 
В том-то и дело. Математика пытается сравнить весь массив с числом. А я так понимаю, что если она работает с массивом поэлементно, то и сравнивать должна поэлементно, то есть каждый элемент массива сравнивать с нулем.
У меня же этого не происходит. Получается, что либи я накосячил (99.9%), либо то, что я хочу сделать таким способом реализовать нельзя (0.1%).

 
 
 
 Re: Поэлементное сравнение массива с числом, Mathematica
Сообщение17.03.2012, 11:21 
В общем случае Mathematica не работает со списками поэлементно. Поэлементная работа -- это автоматическое применение функции к каждому элементу списка. Например, сложение.
Пусть:
Код:
In> x = {a, b, c};

Прибавим число 2.
Код:
In> x + 2

Значок + превращается в функцию Plus. То же самое, но в другой форме.
Код:
In> Plus[{a, b, c}, 2]
Out> {2+a,2+b,2+c}

Двойка прибавилась к каждому элементу. Это произошло потому, что Plus имеет атрибут Listable.
Код:
In> Attributes[Plus]
Out> {Flat, Listable, NumericFunction, OneIdentity, Orderless, Protected}

Значок < превращается в функцию Less.
Код:
In> HoldForm[2 < 0] // FullForm
Out> HoldForm[Less[2,0]]

У нее нет атрибута Listable, поэтому она не будет автоматически применяться к каждому элементу списка, что и произошло в вашем коде.
Код:
In> Attributes[Less]
Out> {Protected}

In> Less[x, 0]
Out> {a,b,c}<0

После применения Less к каждому элементу списка, у нас будет список логических значений, который все равно не получится использовать в If как задумывалось.
Код:
In> x={1,-2,3};
Map[(#1<0)&,x]
If[%,0,x^3]
Out> {False,True,False}
Out> If[{False,True,False},0,x^3]

 
 
 
 Re: Поэлементное сравнение массива с числом, Mathematica
Сообщение17.03.2012, 22:46 
Ясно. Спасибо вам большое за помощь!

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group