Главная  Длительная эволюция 

[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [ 38 ] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

В конце раздела уместно сделать следующее важное замечание: все функции, рассмотренные в предыдущем разделе в связи со списками, можно применять к произвольным выражениям.

expr2 = h[x,h[x-hy]]; Flatten[expr2]

h[x,x + y\

ехргЗ = ReplacePart [expr2,z,Position[expr2, у]]

h[x,h[x-\-z]]

Union[expr2, ехргЗ]

h[x,h[x + y],h[x + z]]

В рассмотренных примерах h - произвольный заголовок.

4.5. Вычисление функций

от списков и их элементов

В этом разделе нам будет удобно принять первую из упомянутых выше интерпретаций выражений „Математики", когда заголовок выражения понимается как название функции. Значение функции на совокупности аргументов мы будем называть применением функции (точнее, заголовка функции) к аргументам. Таким образом, результатом применения функции / к списку list является выражение f[list], входные формы которого могут быть f@list или list / / /. Если мы попытаемся вычислить значения многих встроенных функций „Математики" на списках, то столкнемся с неожиданным результатом.

Sqrt[{l,2,3}], или Sqrt@{l,2,3}, или {1,2,3} Sqrt {l,Sqrt[2lSqrt[3]}



Вместо математически неопределенного выражения Sqrt[{l, 2,3}] мы получили список квадратных корней из элементов списка. Еще пример:

х"{1,2,3}, или Power[x, {1,2,3}] {x,xxЗ}

Эти примеры демонстрируют свойство встроенных функций, которое можно назвать дистрибутивностью относительно списков. Если же к списку применить произвольную функцию /, то она, не обладая свойством дистрибутивности, даст ожидаемый результат:

f@{l,2,3} /[{1.2,3}].

Функция Map заставляет другие функции вести себя так, как если бы они были дистрибутивны.

matrix = {{mll,ml2,ml3},{m21m22,m23},

{т31,т32,тЗЗ}}

Map[f, matrix], или f/©matrix

{/[{mll,ml2,ml3},],/[{m21,m22,m23},],

/[{т31,т32,тЗЗ}}]}

Если в качестве третьего аргумента у функции Map указана спецификация уровня, то заголовок / будет применяться к элементам соответствующих уровней.

Map[f, matrix, {2}]

{{/[mll],/[ml2],/[ml3]},{/[m21],/[m22],/[m23]}, {/[т31],/[т32],/[тЗЗ]}}



Модификацией рассматриваемой функции служит функция Map At. Она применяет заголовок / к элементам списка в соответствии с их спецификацией.

MapAt[f, matrix, {{1,1}, {2,2}, {3,3}}] {{/[mll],m21,m23},{m21,/[m22],m23},{m31,m32,/[m33]}}

Обладает ли встроенная функция свойством дистрибутивности относительно списков, можно узнать, вычислив выражение Attributes[function]. Если в списке атрибутов функции function присутствует bistable, то она дистрибутивна. Если нет, то в необходимых случаях следует прибегнуть к Map.

{Attributes[Sqrt], Attributes[Reverse]}

{{bistable,Protected}, {Protected}}

Из двух функций Sqrt и Reverse первая обладает свойством дистрибутивности, в чем мы уже убедились раньше, вторая нет. Смысл атрибута Protected будет объяснен ниже.

l={{a,b},{c,d}}; {Reverse[l], Map[Reverse,l]}

{{{c,d},{a,b}}, {{b,a},{d,c}}}

Еще более неожиданный результат получается, если дистрибутивную функцию применить к нескольким спискам.

{a,b}-{2,3}, или Power[{a,b},{2,3}] WM}

Другой пример - обычное произведение трех списков:

{а,Ь} {2,3} {х,у} {2ах,ЗЬу}



[0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [ 38 ] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86]

0.0008