Главная Длительная эволюция [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 |