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

[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]

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

11 = {{а,Ь},{2,3},{х,у}}; til = Transpose[ll] {{а,2,х},{6,3,у}} Map[f,tll]

{/[{a,2,x}],/[{b,3,y}]

Если бы а, 2, а; и 6,3, у были бы аргументами функции /, то получился бы список {/[а,2,ж],/[Ь,3,у]}, который для f = Times совпадал бы со списком рассмотренного нами примера. Таким образом, дополнительно происходит замена заголовка List на заголовок /. Такую замену производит встроенная функция Apply.

Apply [f, {а, 2, х}], или Ш@{а,2,х} f[a,2,x]

Все эти операции в совокупности производит функция MapThread.

MapThread[f, {{а, b}, {2,3}, {х,у }}] {/[a,2,x],/[&,3,y]}

В „Математике" имеется другая, в чем-то похожая, но в то же время существенно отличающаяся от MapThread функция, а именно Thread. Предположим, что имеется вычисленное



„Математикой" выражение вида f[listi,list2,...]. Функция Thread сделает с заголовком / то же самое, что и функция MapThread со „свободным" заголовком /.

Thread[f[{a,b},{l,2}]] {/[а,1],/[6,2]}]

Если же выражение f[listi,list2,...] при вычислении изменяется, то MapThread и Thread дают разные результаты.

MapThread[SameQ, {{а, Ь}, {а, с}}] {True, False}

Thread[SameQ[{a, b}, {a, с}]] Thread:: normal:

Normal expression expected at position 1 In Thread[False] Thread[False]

Мы видим, что при применении MapThread функция SameQ вычислялась на парах (а,а) и [а,с), а при применении Thread сначала было вычислено выражение SameQ[{a,b},{a,c}] с результатом False. Кроме того, если MapThread в качестве второго аргумента может иметь только список списков. Thread „продевает" заголовок выражения сквозь элементы подвыражений с иными заголовками, чем List.

Thread[f [х == у, а == b], Equal]

f[x,a]== f[y,b]

MapThread[f, {x == у, a == b}]

MapThread:: mptd:

Object x==y at position (2,1) has only 0 of required 1 dimensions

MapThread[f, {x == y, a == b}]



Мы рассматривали действие функции Thread в случаях, когда списки или выражения - ее аргументы были одинаковой длины. Возможно, что один или несколько аргументов являются символами. Тогда этот символ копируется столько раз, какова длина аргументов-списков.

Thread[f[x,{a,b},{l,2}]]

{f[x,a,l]J[x,b,2]}

Встроенная функция Inner обобщает как ранее рассмотренную функцию Dot, так и функцию MapThread. Выражение Inner[f, listi, Iist2 > • • • i g] эквивалентно выражению Apply[g, MapThread[f,{listi,list2,.. ]]. В случае g - Plus и / = Times функция Inner совпадает с Dot. Кроме того, аргументы listi, list2 и т.д. могут иметь одинаковые заголовки, не обязательно совпадающие с List.

Inner[Times,a b,x у. Power]

{axfy

Функция Outer в выражении Outer[f,listi,list2,..] применяет / ко всем элементам прямого (декартова) произведения списков listi, 4st2 и т.д.

Outer[f,{a,b},{u,v,w}]

{{f[a,u],f[a,v],f[a,w]},{f[b,u],f[b,v],f[b,w]}}

Более точное описание действия этой функции состоит в следующем. Для матриц (тензоров) M,-,,j,...,p и Njij j результат применения заголовка f к М и N есть тензор порядка p + q с компонентами /[M,i,-2,...ip,iVj,j2...i,]. Декартово произведение списков получается, если в качестве / выбрать заголовок List и применить к полученному результату Flatten.



[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.001