(* Content-type: application/mathematica *) (*** Wolfram Notebook File ***) (* http://www.wolfram.com/nb *) (* CreatedBy='Mathematica 6.0' *) (*CacheID: 234*) (* Internal cache information: NotebookFileLineBreakTest NotebookFileLineBreakTest NotebookDataPosition[ 145, 7] NotebookDataLength[ 430653, 11521] NotebookOptionsPosition[ 297242, 8645] NotebookOutlinePosition[ 391901, 10299] CellTagsIndexPosition[ 391776, 10293] WindowFrame->Normal ContainsDynamic->False*) (* Beginning of Notebook Content *) Notebook[{ Cell[GraphicsData["CompressedBitmap", "\<\ eJztfXd8VdeV7uGUe68KiGpMMcbG9CLACCRUQQVJgCRAINGrkIQoQoXeqygS KlRTbOMKphhjg22MSxInk5kkM2/m5WXyJpOZSebNJJMymUkmk8zYv/XWt/Y5 516JKyFAkDiTP759z9nn3FP23uv79trtTF1cUVSwanFF8dLFfSeVLS4tKl5a 3jdtTRlHGe00zSRN08b01bCNTTsgkvDOQM4Pfuj+jo+RCIM0K4y0kMcATUfI QehjOD+8F2ldhjngiC5DEY3dnnGk9Z4A+DhIwmX6pJHWfxagWRJy3IBZbpwX YQhHzcSB/jOxJXsWQonyYItv0D+XgwG5HmzJVXJJeyab75OocVzvBAObOrZw tEcMP9IQAPfgkOM6PsMv0g3APzjEa4aSP5WdYFbTVHnSTitODP5Ph6ect0fS cMhx3UY5r449Ffabzs+aB2g+hHinPEkFvEke3mSWJIe37VLGcLZm6NjCfWfI lWdgS/Zw5RnhHEznrd7x8vTD+T0GA9hToaRWV0DevKs/NeKbJk8HieAH0z1O oUFpQUrJ9YbhWPdxfLeJfvSdqvHr9c/v1sZJoyPK2zhprEaJdJek6YSkwYWn 4eTpYdiS7JyC5HKSLCDhBgFSFAZJ8ejjJpwuIcd5I4IUs/5N07GdRJiN0zG8 tyQhbpnslqp8QN4+Hy+T36nFlMQps3zNpaSvcaq1Yfrhb9M7YwsHcuR5p2FL 9iwnrt9kfjdQRxwSjEOO6z66ScLy2eE9nIRV8EYEpF3XgMT8D4fEvJ0CSazL cKRtt9FISYU+6Xik2XipfP9W26Rok7LpaZy2OIhkfUhp+zhCvmjvWDG9UU5i KnTsh9NbKJntAhLzJ00TM7y3nZig2XgnIUEC/WfjqfLNNklJjxPXNBGbTVg/ Hz68hI1w47LdOFw+BxfI5vhekuI9xpLWuZUp/ouAxP6Bw6SS2N2ZTJ6mdl2G U7tuoznR2/VOftxNZSmv3i9+Kkvq4crTOrWYthbkHvfN5rhnspBIfVO49I1X 6MXoKoLceSCOdXy6MVlYoSqFfxiQ2t91irbwbXcAqdxluCS1l9r1n8Nb/Wd3 b0wS/kTHiwoNDxBClj1PcxkhW0aLGRFM1FpOedF77yNNefwjyyd5gH9kYUv2 dIQwgfGuCQz0I+xxkcMuwWpdfxWQKX/piKBtAlL87SzxIEv4Apwn2JI9z92z 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 ATgBaHk=\ \>"], "ConferenceGraphicCell", ImageSize->{1279, 52}, ImageMargins->0], Cell[CellGroupData[{ Cell[TextData[{ "Efficient ", StyleBox["Mathematica", FontSlant->"Italic"], " Programming" }], "Title", CellMargins->0, CellFrameMargins->{{60, 9}, {9, 12}}, CellChangeTimes->{{3.4006295530063677`*^9, 3.4006295717574472`*^9}}, FontColor->GrayLevel[1], Background->GrayLevel[0]], Cell["Lessons from MathGroup", "Subtitle", CellChangeTimes->{{3.400629577851548*^9, 3.4006295888678083`*^9}}], Cell["Carl Woll", "Author", CellChangeTimes->{{3.40062959446188*^9, 3.4006295967276354`*^9}}], Cell["Wolfram Research", "Affiliation", CellChangeTimes->{{3.4006295988371325`*^9, 3.4006296019310603`*^9}}], Cell[TextData[{ "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellChangeTimes->{{3.3984418381493893`*^9, 3.398441843396253*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["Abstract", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{{3.4006296127598095`*^9, 3.4006296375112348`*^9}}], Cell[TextData[{ StyleBox["MathGroup", FontSlant->"Italic"], " frequently presents opportunities for users to develop quick, efficient \ code to solve a wide variety of problems. In this talk I will present various \ principles that I have come across in participating in these algorithmic \ explorations. These principles usually involve optimized data structures such \ as PackedArray objects and the optimal use of built-in functions, but can \ also include various optimizations that occur behind the scenes such as \ autocompilation and listability. The basic theme to all of these principles \ is to avoid using top-level code to do loops, and instead let the lower level \ internal code handle these loops." }], "Text", CellChangeTimes->{{3.4006296685755243`*^9, 3.4006296967333956`*^9}, { 3.4006298150527105`*^9, 3.400629856492597*^9}, {3.400629912917722*^9, 3.400630096381414*^9}, {3.4006301640694222`*^9, 3.400630206172289*^9}, { 3.400630251444189*^9, 3.400630372460661*^9}, {3.400630477623209*^9, 3.400630484885579*^9}, {3.400666860842745*^9, 3.4006669732747355`*^9}, { 3.4006692166450644`*^9, 3.40066921830513*^9}, {3.400974158609375*^9, 3.40097416121875*^9}, {3.40097419678125*^9, 3.4009742215625*^9}, { 3.401109623859375*^9, 3.401109638671875*^9}}] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["Toy problem", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.4006937324014697`*^9, 3.400693738378766*^9}, {3.4007055618722773`*^9, 3.400705563981639*^9}}], Cell["\<\ Let's get started with the toy problem of adding 1 to a bunch of data, and a \ simplified discussion of functional versus procedural programming approaches. \ For my purposes, I'll take functional programming to mean variableless \ programs using pure functions and Map, while procedural programs will use \ variables, at the minimum including an iteration variable.\ \>", "Text", CellChangeTimes->{{3.400687755089608*^9, 3.400687790220479*^9}, { 3.400688424157173*^9, 3.4006884262922773`*^9}, {3.4006927242039976`*^9, 3.400692885912385*^9}, 3.4007055051382656`*^9}], Cell[BoxData[ RowBox[{ RowBox[{"$HistoryLength", "=", "0"}], ";"}]], "Input", CellChangeTimes->{{3.40070860210282*^9, 3.4007086093840237`*^9}}], Cell[CellGroupData[{ Cell["Numerical data", "Subsection", CellChangeTimes->{{3.400692952290535*^9, 3.4006929528516207`*^9}, { 3.4006932030452366`*^9, 3.4006932056243763`*^9}, {3.400693726132223*^9, 3.400693726301247*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"10", ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400692961046874*^9, 3.4006929725066266`*^9}, { 3.400693485443328*^9, 3.4006934948172393`*^9}}], Cell[CellGroupData[{ Cell["Basic functional approach", "Subsubsection", CellChangeTimes->{{3.400690240768942*^9, 3.4006902408784714`*^9}, { 3.4006913477827415`*^9, 3.4006913512370825`*^9}, {3.400692906179484*^9, 3.400692946645672*^9}, 3.4006930701525583`*^9}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r1", "=", RowBox[{ RowBox[{ RowBox[{"#", "+", "1"}], "&"}], "/@", "data"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4006903653000307`*^9, 3.400690365425172*^9}, { 3.4006929796987267`*^9, 3.4006929959022045`*^9}, {3.400693365229647*^9, 3.4006933662928224`*^9}, {3.4006934113504915`*^9, 3.400693429304677*^9}, 3.4006935084438524`*^9, 3.4006935518693223`*^9, {3.40070503729751*^9, 3.400705039359997*^9}, {3.400705254967992*^9, 3.400705258592969*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.5780000000000034`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4007050414537334`*^9, 3.400705120421978*^9, 3.40070527093664*^9, 3.400706424491757*^9, 3.4007076818899593`*^9, 3.4007079627787867`*^9, 3.4007085841029353`*^9, 3.4007086590982504`*^9, 3.4007113483343353`*^9, 3.40071355937601*^9, 3.4007138836974273`*^9, 3.4008591855042315`*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Basic iterative approach", "Subsubsection", CellChangeTimes->{{3.400693090096608*^9, 3.40069309507837*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r2", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{ RowBox[{"data", "[", RowBox[{"[", "i", "]"}], "]"}], "+", "1"}], ",", RowBox[{"{", RowBox[{"i", ",", RowBox[{"Length", "[", "data", "]"}]}], "}"}]}], "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.400693097033669*^9, 3.4006931161275887`*^9}, { 3.400693369991474*^9, 3.4006933715787506`*^9}, {3.400693438783409*^9, 3.4006934458063555`*^9}, {3.4006935204382668`*^9, 3.400693546867906*^9}, { 3.400705048531813*^9, 3.400705049047435*^9}, {3.4007052625148187`*^9, 3.4007052666085424`*^9}, {3.400711343240553*^9, 3.4007113443499346`*^9}, { 3.4008591735966244`*^9, 3.400859196929309*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"2.5000000000000018`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400693188665454*^9, 3.4006932192260942`*^9}, 3.4006933723574142`*^9, 3.4006934496697245`*^9, {3.4006935248107624`*^9, 3.4006935477513895`*^9}, 3.400705051188046*^9, 3.4007051222500916`*^9, 3.4007052735772476`*^9, 3.4007064271948643`*^9, 3.4007076922492685`*^9, 3.4007079706068616`*^9, 3.400708669935869*^9, 3.4007113511312284`*^9, 3.4007135621729927`*^9, 3.4007136674106407`*^9, 3.4007138865256243`*^9, { 3.400859176242759*^9, 3.400859199980147*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400693188665454*^9, 3.4006932192260942`*^9}, 3.4006933723574142`*^9, 3.4006934496697245`*^9, {3.4006935248107624`*^9, 3.4006935477513895`*^9}, 3.400705051188046*^9, 3.4007051222500916`*^9, 3.4007052735772476`*^9, 3.4007064271948643`*^9, 3.4007076922492685`*^9, 3.4007079706068616`*^9, 3.400708669935869*^9, 3.4007113511312284`*^9, 3.4007135621729927`*^9, 3.4007136674106407`*^9, 3.4007138865256243`*^9, { 3.400859176242759*^9, 3.4008592000579743`*^9}}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["New version 6.0 Table syntax", "Subsubsection", CellChangeTimes->{{3.400693301943596*^9, 3.400693315799483*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r3", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"i", "+", "1"}], ",", RowBox[{"{", RowBox[{"i", ",", "data"}], "}"}]}], "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r3"}]}], "Input", CellChangeTimes->{{3.400711386100202*^9, 3.400711401506551*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.656000000000003`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400711400959672*^9, 3.400711403694065*^9}, 3.4007135645168324`*^9, 3.40071367773903*^9, 3.4007138886975555`*^9, 3.40071406863863*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400711400959672*^9, 3.400711403694065*^9}, 3.4007135645168324`*^9, 3.40071367773903*^9, 3.4007138886975555`*^9, 3.400714068685506*^9}] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell["Non-numerical data", "Subsection", CellChangeTimes->{{3.4006907187282934`*^9, 3.4006907192285976`*^9}, { 3.4006937146847024`*^9, 3.400693721153704*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"x", "/@", RowBox[{"Range", "[", RowBox[{"10", "^", "5"}], "]"}]}]}], ";"}]], "Input", CellChangeTimes->{ 3.400690721620676*^9, {3.4007055154038253`*^9, 3.400705525575635*^9}}], Cell[CellGroupData[{ Cell["Functional", "Subsubsection", CellChangeTimes->{{3.400706124478052*^9, 3.400706126696788*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r1", "=", RowBox[{ RowBox[{ RowBox[{"#", "+", "1"}], "&"}], "/@", "data"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}]], "Input"], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.9219999999999997`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4007061320248785`*^9, 3.4007140800919747`*^9, 3.400714115264525*^9, 3.4011114428522835`*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Procedural", "Subsubsection", CellChangeTimes->{{3.4007061407904477`*^9, 3.4007061425716863`*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r2", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{ RowBox[{"data", "[", RowBox[{"[", "i", "]"}], "]"}], "+", "1"}], ",", RowBox[{"{", RowBox[{"i", ",", RowBox[{"Length", "[", "data", "]"}]}], "}"}]}], "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.400714127639763*^9, 3.400714128749159*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"2.3589999999999995`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.4007061579934626`*^9, 3.4007140828889036`*^9, {3.40071412332718*^9, 3.400714131639839*^9}, 3.4011114453885164`*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{ 3.4007061579934626`*^9, 3.4007140828889036`*^9, {3.40071412332718*^9, 3.400714131639839*^9}, 3.4011114453885164`*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Functional Table", "Subsubsection", CellChangeTimes->{{3.400714102717409*^9, 3.400714107389374*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r3", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"i", "+", "1"}], ",", RowBox[{"{", RowBox[{"i", ",", "data"}], "}"}]}], "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r3"}]}], "Input", CellChangeTimes->{{3.400693097033669*^9, 3.4006931161275887`*^9}, { 3.400693369991474*^9, 3.4006933715787506`*^9}, {3.400693438783409*^9, 3.4006934458063555`*^9}, {3.4006935204382668`*^9, 3.400693546867906*^9}, { 3.400705048531813*^9, 3.400705049047435*^9}, {3.4007052625148187`*^9, 3.4007052666085424`*^9}, {3.400711343240553*^9, 3.4007113443499346`*^9}, { 3.4007141397806206`*^9, 3.4007141537965145`*^9}, {3.401111455123871*^9, 3.4011114555492015`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.5779999999999994`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400693188665454*^9, 3.4006932192260942`*^9}, 3.4006933723574142`*^9, 3.4006934496697245`*^9, {3.4006935248107624`*^9, 3.4006935477513895`*^9}, 3.400705051188046*^9, 3.4007051222500916`*^9, 3.4007052735772476`*^9, 3.4007064271948643`*^9, 3.4007076922492685`*^9, 3.4007079706068616`*^9, 3.400708669935869*^9, 3.4007113511312284`*^9, 3.4007135621729927`*^9, 3.4007136674106407`*^9, 3.4007138865256243`*^9, { 3.4007141382649665`*^9, 3.4007141559215555`*^9}, {3.4011114482713156`*^9, 3.4011114577546215`*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400693188665454*^9, 3.4006932192260942`*^9}, 3.4006933723574142`*^9, 3.4006934496697245`*^9, {3.4006935248107624`*^9, 3.4006935477513895`*^9}, 3.400705051188046*^9, 3.4007051222500916`*^9, 3.4007052735772476`*^9, 3.4007064271948643`*^9, 3.4007076922492685`*^9, 3.4007079706068616`*^9, 3.400708669935869*^9, 3.4007113511312284`*^9, 3.4007135621729927`*^9, 3.4007136674106407`*^9, 3.4007138865256243`*^9, { 3.4007141382649665`*^9, 3.4007141559215555`*^9}, {3.4011114482713156`*^9, 3.4011114577703743`*^9}}] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell["Mixed numerical data", "Subsection", CellChangeTimes->{{3.4007062086025133`*^9, 3.4007062126962376`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"Sqrt", "[", RowBox[{"RandomReal", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"-", "1"}], ",", "1"}], "}"}], ",", RowBox[{"10", "^", "5"}]}], "]"}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400706215289971*^9, 3.40070622947738*^9}}], Cell[CellGroupData[{ Cell["Functional", "Subsubsection", CellChangeTimes->{{3.400706294617588*^9, 3.4007062963363276`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r1", "=", RowBox[{ RowBox[{ RowBox[{"#", "+", "1"}], "&"}], "/@", "data"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}]], "Input"], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.297000000000012`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4007061320248785`*^9, 3.400706241492928*^9, 3.400714178343861*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Procedural", "Subsubsection", CellChangeTimes->{{3.4007061407904477`*^9, 3.4007061425716863`*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r2", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{ RowBox[{"data", "[", RowBox[{"[", "i", "]"}], "]"}], "+", "1"}], ",", RowBox[{"{", RowBox[{"i", ",", RowBox[{"Length", "[", "data", "]"}]}], "}"}]}], "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.4007141820158067`*^9, 3.4007141831564536`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.578000000000006`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4007061579934626`*^9, 3.4007062434616656`*^9, 3.400714186000258*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.4007061579934626`*^9, 3.4007062434616656`*^9, 3.400714186047134*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Functional Table", "Subsubsection", CellChangeTimes->{{3.400714102717409*^9, 3.400714107389374*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r3", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"i", "+", "1"}], ",", RowBox[{"{", RowBox[{"i", ",", "data"}], "}"}]}], "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r3"}]}], "Input", CellChangeTimes->{{3.400693097033669*^9, 3.4006931161275887`*^9}, { 3.400693369991474*^9, 3.4006933715787506`*^9}, {3.400693438783409*^9, 3.4006934458063555`*^9}, {3.4006935204382668`*^9, 3.400693546867906*^9}, { 3.400705048531813*^9, 3.400705049047435*^9}, {3.4007052625148187`*^9, 3.4007052666085424`*^9}, {3.400711343240553*^9, 3.4007113443499346`*^9}, { 3.4007141397806206`*^9, 3.4007141537965145`*^9}, {3.4007142149851894`*^9, 3.4007142151414423`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.265000000000002`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400693188665454*^9, 3.4006932192260942`*^9}, 3.4006933723574142`*^9, 3.4006934496697245`*^9, {3.4006935248107624`*^9, 3.4006935477513895`*^9}, 3.400705051188046*^9, 3.4007051222500916`*^9, 3.4007052735772476`*^9, 3.4007064271948643`*^9, 3.4007076922492685`*^9, 3.4007079706068616`*^9, 3.400708669935869*^9, 3.4007113511312284`*^9, 3.4007135621729927`*^9, 3.4007136674106407`*^9, 3.4007138865256243`*^9, { 3.4007141382649665`*^9, 3.4007141559215555`*^9}, 3.400714220172789*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400693188665454*^9, 3.4006932192260942`*^9}, 3.4006933723574142`*^9, 3.4006934496697245`*^9, {3.4006935248107624`*^9, 3.4006935477513895`*^9}, 3.400705051188046*^9, 3.4007051222500916`*^9, 3.4007052735772476`*^9, 3.4007064271948643`*^9, 3.4007076922492685`*^9, 3.4007079706068616`*^9, 3.400708669935869*^9, 3.4007113511312284`*^9, 3.4007135621729927`*^9, 3.4007136674106407`*^9, 3.4007138865256243`*^9, { 3.4007141382649665`*^9, 3.4007141559215555`*^9}, 3.4007142201884146`*^9}] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext"] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell["Functional programming and one-liners", "Subsection", CellChangeTimes->{{3.4007154026642427`*^9, 3.400715410914401*^9}}], Cell[TextData[{ "Quite often on ", StyleBox["MathGroup", FontSlant->"Italic"], " one-liner solutions are supplied. I just want to mention that one-liner \ solutions are not necessarily any faster than the same solution written out \ using intermediate variables. Here's an example:" }], "Text", CellChangeTimes->{{3.401180948453125*^9, 3.4011810195625*^9}}], Cell["Richard Gaylord writes:", "Text", CellChangeTimes->{{3.401180835828125*^9, 3.4011808410625*^9}}], Cell["\<\ Given a list of numbers row={18,19,1,11,25,12,22,14}. Select the numbers from the list by taking the largest number from the ends \ of the list until the list is empty. \ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"{", RowBox[{ "18", ",", "19", ",", "1", ",", "11", ",", "25", ",", "12", ",", "22", ",", "14"}], "}"}]}], ";"}]], "Input", CellChangeTimes->{{3.400718470246801*^9, 3.400718509496299*^9}, { 3.4007193572354474`*^9, 3.4007193587198033`*^9}}], Cell["Here is a one-liner solution proposed by Robert Hall:", "Text", CellChangeTimes->{{3.401180885265625*^9, 3.40118090409375*^9}, { 3.40118093496875*^9, 3.401180938046875*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"oneliner", "[", "row_", "]"}], ":=", RowBox[{"Apply", "[", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"#1", "-", "#2"}], ")"}], "&"}], ",", RowBox[{"Partition", "[", RowBox[{ RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"Plus", "@@", "#"}], ")"}], "&"}], "/@", RowBox[{"NestList", "[", RowBox[{ RowBox[{ RowBox[{"If", "[", RowBox[{ RowBox[{ RowBox[{"First", "[", "#", "]"}], "\[GreaterEqual]", RowBox[{"Last", "[", "#", "]"}]}], ",", RowBox[{"Rest", "[", "#", "]"}], ",", RowBox[{"Drop", "[", RowBox[{"#", ",", RowBox[{"-", "1"}]}], "]"}]}], "]"}], "&"}], ",", "row", ",", RowBox[{"Length", "[", "row", "]"}]}], "]"}]}], ",", "2", ",", "1"}], "]"}], ",", "1"}], "]"}]}]], "Input", CellChangeTimes->{{3.400718417747473*^9, 3.4007184211536794`*^9}, { 3.400718503652623*^9, 3.4007185070432053`*^9}}], Cell["It works:", "Text", CellChangeTimes->{{3.401181084234375*^9, 3.401181086140625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"oneliner", "[", "data", "]"}]], "Input", CellChangeTimes->{{3.401181067453125*^9, 3.40118106921875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "18", ",", "19", ",", "14", ",", "22", ",", "12", ",", "25", ",", "11", ",", "1"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.40118107346875*^9}] }, Open ]], Cell["\<\ Below I take the oneliner solution and split it up using intermediate \ variables:\ \>", "Text", CellChangeTimes->{{3.4011810276875*^9, 3.40118104184375*^9}, { 3.401181093078125*^9, 3.40118110740625*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"nononeliner", "[", "row_", "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", RowBox[{"remainingrows", ",", " ", "rowtotals", ",", " ", "rowpairs"}], "}"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"remainingrows", "=", RowBox[{"NestList", "[", RowBox[{ RowBox[{ RowBox[{"If", "[", RowBox[{ RowBox[{ RowBox[{"First", "[", "#", "]"}], "\[GreaterEqual]", RowBox[{"Last", "[", "#", "]"}]}], ",", RowBox[{"Rest", "[", "#", "]"}], ",", RowBox[{"Drop", "[", RowBox[{"#", ",", RowBox[{"-", "1"}]}], "]"}]}], "]"}], "&"}], ",", "row", ",", RowBox[{"Length", "[", "row", "]"}]}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"rowtotals", "=", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"Plus", "@@", "#"}], ")"}], "&"}], "/@", "remainingrows"}]}], ";", "\[IndentingNewLine]", RowBox[{"rowpairs", "=", RowBox[{"Partition", "[", RowBox[{"rowtotals", ",", "2", ",", "1"}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"Apply", "[", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"#1", "-", "#2"}], ")"}], "&"}], ",", "rowpairs", ",", "1"}], "]"}]}]}], "\[IndentingNewLine]", "]"}]}]], "Input", CellChangeTimes->{{3.400718518043064*^9, 3.4007186694630013`*^9}, { 3.400718742352693*^9, 3.400718746165144*^9}, {3.4007191801283393`*^9, 3.4007191815970707`*^9}, {3.4011812*^9, 3.401181214609375*^9}, { 3.401181247609375*^9, 3.40118125990625*^9}, {3.401181295328125*^9, 3.4011813031875*^9}}], Cell["Now, let's compare timings for a larger example:", "Text", CellChangeTimes->{{3.401181279828125*^9, 3.401181290796875*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"1000", ",", "1000"}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.4007186759316683`*^9, 3.400718683322199*^9}, { 3.4007187265560203`*^9, 3.4007187550556555`*^9}, {3.400718804383149*^9, 3.4007188056018834`*^9}, {3.4007188504606843`*^9, 3.400718852913778*^9}, { 3.4007189428813763`*^9, 3.400718943068874*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r1", "=", RowBox[{"oneliner", "[", "data", "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r2", "=", RowBox[{"nononeliner", "[", "data", "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.4007186856971684`*^9, 3.400718711024969*^9}, { 3.400718857179348*^9, 3.4007188677260885`*^9}, {3.4007189130536327`*^9, 3.4007189147098618`*^9}, {3.400718944771977*^9, 3.400718947209446*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.468`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4007187243529234`*^9, 3.40071877225856*^9}, { 3.400718810945565*^9, 3.4007189178660717`*^9}, {3.4007189512875185`*^9, 3.4007189572249427`*^9}, 3.4011116030831356`*^9, 3.4011812678125*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.5470000000000002`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4007187243529234`*^9, 3.40071877225856*^9}, { 3.400718810945565*^9, 3.4007189178660717`*^9}, {3.4007189512875185`*^9, 3.4007189572249427`*^9}, 3.4011116030831356`*^9, 3.40118126940625*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.4007187243529234`*^9, 3.40071877225856*^9}, { 3.400718810945565*^9, 3.4007189178660717`*^9}, {3.4007189512875185`*^9, 3.4007189572249427`*^9}, 3.4011116030831356`*^9, 3.401181269421875*^9}] }, Open ]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["Autocompilation", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.4007194802807474`*^9, 3.400719482749466*^9}}], Cell["\<\ What happens if we use normal functions instead of pure functions? Consider:\ \>", "Text", CellChangeTimes->{{3.4008522503793974`*^9, 3.4008522886438403`*^9}}], Cell[CellGroupData[{ Cell["Pure vs ordinary (SetDelayed) functions", "Subsection", CellChangeTimes->{{3.400875789350174*^9, 3.4008758039216003`*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"pure", "=", RowBox[{ RowBox[{"#", "+", "1"}], "&"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"nonpure", "[", "x_", "]"}], ":=", RowBox[{"x", "+", "1"}]}], ";"}]}], "Input", CellChangeTimes->{{3.4008522915511875`*^9, 3.400852314200362*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"10", "^", "5"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.4008523179048853`*^9, 3.400852340507167*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"pure", "/@", "data"}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"nonpure", "/@", "data"}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.4008523302220345`*^9, 3.400852352464805*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.1559999999999998`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400852353543337*^9, 3.4011116487898874`*^9, 3.401181481859375*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.344`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400852353543337*^9, 3.4011116487898874`*^9, 3.40118148328125*^9}] }, Open ]], Cell["\<\ Quite a difference. This suggests that we should try to use pure functions in \ our interior loops as much as possible.\ \>", "Text", CellChangeTimes->{{3.4008523674704695`*^9, 3.4008525605277147`*^9}, { 3.4008758310902586`*^9, 3.400875834067217*^9}}] }, Closed]], Cell[CellGroupData[{ Cell["Autocompilation", "Subsection", CellChangeTimes->{{3.40087582507367*^9, 3.400875827235882*^9}}], Cell["\<\ What is going on here is that Mathematica' s autocompile feature is not \ speeding up this nonpure function. Let' s turn off autocompilation, which is \ a system option:\ \>", "Text", CellChangeTimes->{{3.4008758486073065`*^9, 3.4008758597473965`*^9}, { 3.4011814326875*^9, 3.401181464171875*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"SystemOptions", "[", "\"\\"", "]"}]], "Input", CellChangeTimes->{{3.400852570828478*^9, 3.4008525739390273`*^9}, { 3.4008758622229724`*^9, 3.400875866187027*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"\<\"CompileOptions\"\>", "\[Rule]", RowBox[{"{", RowBox[{ RowBox[{"\<\"ApplyCompileLength\"\>", "\[Rule]", "\[Infinity]"}], ",", RowBox[{"\<\"ArrayCompileLength\"\>", "\[Rule]", "250"}], ",", RowBox[{"\<\"AutoCompileAllowCoercion\"\>", "\[Rule]", "False"}], ",", RowBox[{"\<\"AutoCompileProtectValues\"\>", "\[Rule]", "False"}], ",", RowBox[{"\<\"AutomaticCompile\"\>", "\[Rule]", "False"}], ",", RowBox[{"\<\"CompileAllowCoercion\"\>", "\[Rule]", "True"}], ",", RowBox[{"\<\"CompileConfirmInitializedVariables\"\>", "\[Rule]", "True"}], ",", RowBox[{"\<\"CompiledFunctionArgumentCoercionTolerance\"\>", "\[Rule]", "2.1072099696478683`"}], ",", RowBox[{"\<\"CompileDynamicScoping\"\>", "\[Rule]", "False"}], ",", RowBox[{"\<\"CompileEvaluateConstants\"\>", "\[Rule]", "True"}], ",", RowBox[{"\<\"CompileReportCoercion\"\>", "\[Rule]", "False"}], ",", RowBox[{"\<\"CompileReportExternal\"\>", "\[Rule]", "False"}], ",", RowBox[{"\<\"CompileReportFailure\"\>", "\[Rule]", "False"}], ",", RowBox[{"\<\"CompileValuesLast\"\>", "\[Rule]", "True"}], ",", RowBox[{"\<\"FoldCompileLength\"\>", "\[Rule]", "100"}], ",", RowBox[{"\<\"InternalCompileMessages\"\>", "\[Rule]", "False"}], ",", RowBox[{"\<\"ListableFunctionCompileLength\"\>", "\[Rule]", "250"}], ",", RowBox[{"\<\"MapCompileLength\"\>", "\[Rule]", "100"}], ",", RowBox[{"\<\"NestCompileLength\"\>", "\[Rule]", "100"}], ",", RowBox[{"\<\"NumericalAllowExternal\"\>", "\[Rule]", "True"}], ",", RowBox[{"\<\"ProductCompileLength\"\>", "\[Rule]", "250"}], ",", RowBox[{"\<\"SumCompileLength\"\>", "\[Rule]", "250"}], ",", RowBox[{"\<\"SystemCompileOptimizations\"\>", "\[Rule]", "All"}], ",", RowBox[{"\<\"TableCompileLength\"\>", "\[Rule]", "250"}]}], "}"}]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4008525757991047`*^9, 3.400875866986105*^9, 3.4011116783297596`*^9}] }, Open ]], Cell["\<\ The compile option we are interested in changing is \"MapCompileLength\":\ \>", "Text", CellChangeTimes->{{3.400875877985182*^9, 3.4008758976331043`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"SetSystemOptions", "[", RowBox[{"\"\\"", "\[Rule]", RowBox[{"\"\\"", "\[Rule]", "Infinity"}]}], "]"}], ";"}]], "Input", CellChangeTimes->{{3.400852561496831*^9, 3.4008525938527937`*^9}}], Cell["Now, let's compare them again:", "Text", CellChangeTimes->{{3.400852603153179*^9, 3.4008526074360456`*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"pure", "/@", "data"}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"nonpure", "/@", "data"}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.4008523302220345`*^9, 3.400852352464805*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.1250000000000002`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4008526097806807`*^9, 3.4011116972120476`*^9, 3.401181496078125*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.391`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4008526097806807`*^9, 3.4011116972120476`*^9, 3.401181497453125*^9}] }, Open ]], Cell["\<\ Not so dramatic a difference. Let's return the system option to its original \ value:\ \>", "Text", CellChangeTimes->{{3.4008759074106293`*^9, 3.4008759351121674`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"SetSystemOptions", "[", RowBox[{"\"\\"", "\[Rule]", RowBox[{"\"\\"", "\[Rule]", "100"}]}], "]"}], ";"}]], "Input", CellChangeTimes->{{3.4008526409955883`*^9, 3.4008526531407976`*^9}}] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping", CellChangeTimes->{{3.4008526629726334`*^9, 3.4008526715852594`*^9}}] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["Listability", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.4007195270613985`*^9, 3.400719528592629*^9}}], Cell[TextData[{ "As many of you probably wanted to say earlier, there are much faster ways \ of doing our toy problem. Basically, the fastest way to do the previous type \ of problem in ", StyleBox["Mathematica", FontSlant->"Italic"], " is to take advantage of the Listability attribute. " }], "Text", CellChangeTimes->{{3.400853350247676*^9, 3.4008534183202453`*^9}, { 3.400854672402983*^9, 3.400854680874931*^9}, {3.4008548267893825`*^9, 3.4008548359647207`*^9}, {3.4008549502422304`*^9, 3.4008549677488384`*^9}}], Cell[CellGroupData[{ Cell["Listable single argument function", "Subsection", CellChangeTimes->{{3.401109825453125*^9, 3.4011098313125*^9}}], Cell["\<\ Most mathematical functions are Listable, and using the Listable property is \ much faster than using Map and relying on autocompilation.\ \>", "Text", CellChangeTimes->{{3.40110984278125*^9, 3.40110987378125*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"10", ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.401109766390625*^9, 3.401109781859375*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Sin", "/@", "data"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Sin", "[", "data", "]"}]}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.40110979996875*^9, 3.401109810390625*^9}, { 3.4011117608436317`*^9, 3.4011117636846075`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.187999999999999`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.4011098109375*^9, {3.4011117527915835`*^9, 3.4011117643124475`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.04600000000000082`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.4011098109375*^9, {3.4011117527915835`*^9, 3.4011117643595357`*^9}}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r1", "===", "r2"}]], "Input", CellChangeTimes->{{3.4011117652699037`*^9, 3.4011117658349595`*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.4011117661331835`*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["\<\ Listable multiple argument functions\ \>", "Subsection", CellChangeTimes->{{3.401109891734375*^9, 3.401109897390625*^9}, { 3.4011117418985596`*^9, 3.4011117497151675`*^9}}], Cell["\<\ An example of a Listable multiple argument function is Plus. In this case \ some of the arguments can be lists and some can be scalars (not lists). For \ example, due to the Listable attribute of Plus, the input\ \>", "Text", CellChangeTimes->{{3.401109941515625*^9, 3.401110004125*^9}, { 3.401110051890625*^9, 3.401110058890625*^9}, {3.40111009984375*^9, 3.401110147640625*^9}, {3.401110190140625*^9, 3.401110238890625*^9}, { 3.4011103017055235`*^9, 3.4011103209695473`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"{", RowBox[{"a", ",", "b", ",", "c"}], "}"}], "+", RowBox[{"{", RowBox[{"1", ",", "1", ",", "1"}], "}"}]}]], "Input", CellChangeTimes->{{3.40111023984375*^9, 3.401110246625*^9}}], Cell["gets automatically converted to", "Text", CellChangeTimes->{{3.401110270165495*^9, 3.401110309489125*^9}}], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"a", "+", "1"}], ",", RowBox[{"b", "+", "1"}], ",", RowBox[{"c", "+", "1"}]}], "}"}]], "Input", CellChangeTimes->{{3.401110284453693*^9, 3.4011102875577745`*^9}}], Cell["Similarly, the input", "Text", CellChangeTimes->{{3.4011103267097583`*^9, 3.401110342027387*^9}, { 3.4011103725690546`*^9, 3.4011103730526047`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"{", RowBox[{"a", ",", "b", ",", "c"}], "}"}], "+", "1"}]], "Input", CellChangeTimes->{{3.401110060265625*^9, 3.4011100655625*^9}, { 3.4011103882922416`*^9, 3.401110391224741*^9}}], Cell["gets automatically converted to", "Text", CellChangeTimes->{{3.40111008678125*^9, 3.401110091828125*^9}, { 3.401110154171875*^9, 3.40111015903125*^9}, {3.40111021159375*^9, 3.401110222796875*^9}, {3.4011103543501234`*^9, 3.401110380430648*^9}}], Cell[BoxData[ RowBox[{"{", RowBox[{ RowBox[{"a", "+", "1"}], ",", RowBox[{"b", "+", "1"}], ",", RowBox[{"c", "+", "1"}]}], "}"}]], "Input", CellChangeTimes->{{3.401110160109375*^9, 3.4011101640625*^9}, { 3.40111039347091*^9, 3.401110397323715*^9}}], Cell["\<\ Again, using Listability is much faster than using Map with autocompilation:\ \>", "Text", CellChangeTimes->{{3.4011104523236732`*^9, 3.4011104654107313`*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{ RowBox[{ RowBox[{"#", "+", "1"}], "&"}], "/@", "data"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"data", "+", "1"}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.40111001078125*^9, 3.401110019109375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.15600000000000142`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401110024625*^9, 3.4011104726327906`*^9, 3.4011117907288156`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.06299999999999963`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401110024625*^9, 3.4011104726327906`*^9, 3.4011117907915993`*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Making use of Listability", "Subsection", CellChangeTimes->{{3.4008552388785167`*^9, 3.4008552638132725`*^9}, { 3.401180512375*^9, 3.401180514421875*^9}}], Cell[CellGroupData[{ Cell["Illustrative example", "Subsubsection", CellChangeTimes->{{3.400855796456977*^9, 3.400855800127043*^9}, { 3.400855942910309*^9, 3.400855945129201*^9}}], Cell["\<\ In a nutshell, Listability is an attribute which makes it possible to use \ vector (or in general array) operations on arrays. Consider the following \ matrix:\ \>", "Text", CellChangeTimes->{{3.4008552678345065`*^9, 3.4008553258706946`*^9}, { 3.400855366740472*^9, 3.400855374162835*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{ RowBox[{"{", RowBox[{"1", ",", "10"}], "}"}], ",", RowBox[{"{", RowBox[{"10", ",", "2"}], "}"}]}], "]"}]}]], "Input", CellChangeTimes->{{3.4008546820316176`*^9, 3.4008546912694798`*^9}, { 3.400854781678605*^9, 3.400854782006854*^9}, {3.4008548161760015`*^9, 3.400854817426473*^9}, {3.400855479448121*^9, 3.4008554798535447`*^9}, { 3.4008557212909126`*^9, 3.400855723399248*^9}}], Cell[BoxData[ FormBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"9", "8"}, {"9", "4"}, {"7", "10"}, {"1", "7"}, {"3", "9"}, {"6", "5"}, {"9", "10"}, {"5", "3"}, {"2", "6"}, {"4", "9"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], TraditionalForm]], "Output", CellChangeTimes->{{3.40085469197287*^9, 3.4008547159506702`*^9}, 3.4008547824757805`*^9, 3.4008548185206366`*^9, 3.400855480508459*^9, 3.400855723836532*^9}] }, Open ]], Cell["\<\ Suppose we wanted to form the integer a^b from each {a,b} pair above. One \ possibility is to use our previous ideas here:\ \>", "Text", CellChangeTimes->{{3.4008553900990853`*^9, 3.400855476002024*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Apply", "[", RowBox[{ RowBox[{ RowBox[{"#1", "^", "#2"}], "&"}], ",", "data", ",", "1"}], "]"}]], "Input",\ CellChangeTimes->{{3.4008554825511684`*^9, 3.400855550069724*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "43046721", ",", "6561", ",", "282475249", ",", "1", ",", "19683", ",", "7776", ",", "3486784401", ",", "125", ",", "64", ",", "262144"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008554999843655`*^9, 3.400855551098875*^9}, 3.4008557260854235`*^9}] }, Open ]], Cell["\<\ However, noting that Power has the Listable attribute, we could also do:\ \>", "Text", CellChangeTimes->{{3.4008555732568126`*^9, 3.400855602275758*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"data", "\[LeftDoubleBracket]", RowBox[{"All", ",", "1"}], "\[RightDoubleBracket]"}], "^", RowBox[{"data", "\[LeftDoubleBracket]", RowBox[{"All", ",", "2"}], "\[RightDoubleBracket]"}]}]], "Input", CellChangeTimes->{{3.4008556043028736`*^9, 3.4008556273060007`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "43046721", ",", "6561", ",", "282475249", ",", "1", ",", "19683", ",", "7776", ",", "3486784401", ",", "125", ",", "64", ",", "262144"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400855628399212*^9, 3.40085572731919*^9}] }, Open ]], Cell["Let's compare timings with a larger data set:", "Text", CellChangeTimes->{{3.400855640393298*^9, 3.400855648358121*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{ RowBox[{"{", RowBox[{"1", ",", "10"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"10", "^", "5"}], ",", "2"}], "}"}]}], "]"}]}], ";"}]], "Input",\ CellChangeTimes->{{3.4008556561980057`*^9, 3.400855666318016*^9}, { 3.40085572969302*^9, 3.400855731332836*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r1", "=", RowBox[{"Apply", "[", RowBox[{ RowBox[{ SuperscriptBox["#1", "#2"], "&"}], ",", "data", ",", "1"}], "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r2", "=", RowBox[{ RowBox[{"data", "\[LeftDoubleBracket]", RowBox[{"All", ",", "1"}], "\[RightDoubleBracket]"}], "^", RowBox[{"data", "\[LeftDoubleBracket]", RowBox[{"All", ",", "2"}], "\[RightDoubleBracket]"}]}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.4008556680983887`*^9, 3.4008557065169463`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.6099999999999997`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008557090625668`*^9, 3.40085573495605*^9}, 3.4011118174434075`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.3279999999999997`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008557090625668`*^9, 3.40085573495605*^9}, 3.4011118178044157`*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.4008557090625668`*^9, 3.40085573495605*^9}, 3.4011118178515034`*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Counting runs - Mathgroup inspired example", "Subsubsection", CellChangeTimes->{{3.400855858192164*^9, 3.400855860253648*^9}, { 3.400855921426612*^9, 3.4008559250966773`*^9}, {3.4008559568955784`*^9, 3.400855960302047*^9}, {3.40119603071875*^9, 3.401196032078125*^9}}], Cell["\<\ One common example on Mathgroup is to count the number of runs of consecutive \ elements there are in a list. Let's first try out the following data:\ \>", "Text", CellChangeTimes->{{3.4008560621679406`*^9, 3.4008560781220865`*^9}, { 3.4008561233124785`*^9, 3.4008561662214746`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"1", ",", "10"}], "]"}]}]], "Input", CellChangeTimes->{{3.4008561678778305`*^9, 3.4008561785816402`*^9}, { 3.400856534244528*^9, 3.4008565342757883`*^9}, {3.400856705708919*^9, 3.4008567063653917`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "0", ",", "0", ",", "1", ",", "1", ",", "1", ",", "1", ",", "0", ",", "1", ",", "1", ",", "1"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008561742688646`*^9, 3.400856178987917*^9}, 3.400856534650916*^9, 3.4008567068655615`*^9, 3.401089054282727*^9, 3.401203092546875*^9}] }, Open ]], Cell["\<\ A common approach is to use Partition to create a list of pairs, and then to \ do some counting:\ \>", "Text", CellChangeTimes->{{3.4008561917387323`*^9, 3.4008562194436307`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"parts", "=", RowBox[{"Partition", "[", RowBox[{"data", ",", "2", ",", "1"}], "]"}]}]], "Input", CellChangeTimes->{{3.4008562218812866`*^9, 3.4008562252877855`*^9}, { 3.4008562699401245`*^9, 3.400856270924758*^9}}], Cell[BoxData[ FormBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "0"}, {"0", "1"}, {"1", "1"}, {"1", "1"}, {"1", "1"}, {"1", "0"}, {"0", "1"}, {"1", "1"}, {"1", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], TraditionalForm]], "Output", CellChangeTimes->{3.400856225615997*^9, 3.400856284819028*^9, 3.4008565374331093`*^9, 3.4008567090538034`*^9, 3.4010890561733513`*^9, 3.401203095390625*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Count", "[", RowBox[{"parts", ",", RowBox[{"{", RowBox[{"1", ",", "0"}], "}"}]}], "]"}]], "Input", CellChangeTimes->{{3.4008562645324554`*^9, 3.4008562762073936`*^9}, { 3.4008567162593718`*^9, 3.400856718869632*^9}}], Cell[BoxData[ FormBox["3", TraditionalForm]], "Output", CellChangeTimes->{{3.4008562770044775`*^9, 3.4008562865694866`*^9}, 3.4008565396213512`*^9, {3.4008567108981786`*^9, 3.4008567196042557`*^9}}] }, Open ]], Cell["\<\ However, given our discussion of the Listable attribute, we might try to work \ with the lists Most[data] and Rest[data] instead. Here we want \[LineSeparator]{0,0}->0 {0,1}->0 {1,0}->1 {1,1}->0 A Listable function that will do this is Clip[x-y,{1,1},{0,0}]:\ \>", "Text", CellChangeTimes->{{3.4008563142173643`*^9, 3.400856364496179*^9}, { 3.4008564146655903`*^9, 3.400856471008496*^9}, {3.4008566233216076`*^9, 3.4008566303083515`*^9}, {3.4008588737512903`*^9, 3.400858876533591*^9}, { 3.401180490453125*^9, 3.401180491015625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Clip", "[", RowBox[{ RowBox[{ RowBox[{"{", RowBox[{"0", ",", "0", ",", "1", ",", "1"}], "}"}], "-", RowBox[{"{", RowBox[{"0", ",", "1", ",", "0", ",", "1"}], "}"}]}], ",", RowBox[{"{", RowBox[{"1", ",", "1"}], "}"}], ",", RowBox[{"{", RowBox[{"0", ",", "0"}], "}"}]}], "]"}]], "Input", CellChangeTimes->{{3.4008565495309615`*^9, 3.4008565589560328`*^9}, { 3.400857110447204*^9, 3.400857113573344*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0", ",", "0", ",", "1", ",", "0"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400856559190487*^9, 3.4008571139641113`*^9}] }, Open ]], Cell["\<\ As an aside, there are faster Listable approaches using BitXor/BitAnd which \ are a bit more complex. Anyway, let's scale up this problem.\ \>", "Text", CellChangeTimes->{{3.401196111921875*^9, 3.40119619025*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"1", ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.4008567637754836`*^9, 3.400856771121724*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r1", "=", RowBox[{"Count", "[", RowBox[{ RowBox[{"Partition", "[", RowBox[{"data", ",", "2", ",", "1"}], "]"}], ",", RowBox[{"{", RowBox[{"1", ",", "0"}], "}"}]}], "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"Do", "[", RowBox[{ RowBox[{"r2", "=", RowBox[{"Tr", "[", RowBox[{"Clip", "[", RowBox[{ RowBox[{ RowBox[{"Most", "[", "data", "]"}], "-", RowBox[{"Rest", "[", "data", "]"}]}], ",", RowBox[{"{", RowBox[{"1", ",", "1"}], "}"}], ",", RowBox[{"{", RowBox[{"0", ",", "0"}], "}"}]}], "]"}], "]"}]}], ",", RowBox[{"{", "10", "}"}]}], "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.4008567732161846`*^9, 3.400856814777152*^9}, { 3.400857097614399*^9, 3.4008570997714357`*^9}, {3.4010890847046013`*^9, 3.4010891072671013`*^9}, {3.401089812578125*^9, 3.401089818265625*^9}, { 3.401109700921875*^9, 3.401109701859375*^9}, 3.401196080015625*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"4.155999999999999`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.400856820279018*^9, 3.400857063711411*^9, 3.400857104835783*^9, 3.401089156063977*^9, 3.4010892379233513`*^9, 3.401089824328125*^9, { 3.401109702515625*^9, 3.40110971153125*^9}, 3.4011119583042374`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.5630000000000004`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.400856820279018*^9, 3.400857063711411*^9, 3.400857104835783*^9, 3.401089156063977*^9, 3.4010892379233513`*^9, 3.401089824328125*^9, { 3.401109702515625*^9, 3.40110971153125*^9}, 3.4011119591820655`*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{ 3.400856820279018*^9, 3.400857063711411*^9, 3.400857104835783*^9, 3.401089156063977*^9, 3.4010892379233513`*^9, 3.401089824328125*^9, { 3.401109702515625*^9, 3.40110971153125*^9}, 3.4011119597150326`*^9}] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["PackedArrays", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.400853848967171*^9, 3.4008538588927927`*^9}}], Cell[TextData[{ "PackedArray objects were introduced in version 4, and provide memory \ efficient storage of arrays of numbers, and allow much more efficient \ implementation of many core functions of ", StyleBox["Mathematica", FontSlant->"Italic"], ". The only drawback to packed arrays are that the only types of numbers \ permitted are machine integers and real and complex machine numbers. Also, \ all elements in a packed array must be of the same type." }], "Text", CellChangeTimes->{{3.400935939078125*^9, 3.40093609865625*^9}, { 3.4009361305*^9, 3.40093624015625*^9}}], Cell["\<\ Before exploring possibilities associated with packed arrays, it is useful to \ first discuss the tools available to process and analyze packed arrays. Most \ of these tools live in the Developer` package.\ \>", "Text", CellChangeTimes->{{3.4009363195625*^9, 3.4009364050625*^9}}], Cell[CellGroupData[{ Cell["Developer`PackedArrayQ", "Subsection", CellChangeTimes->{{3.400936303796875*^9, 3.40093631028125*^9}, { 3.40093638315625*^9, 3.400936387*^9}}], Cell[TextData[{ "Where possible, most ", StyleBox["Mathematica", FontSlant->"Italic"], " functions will return packed arrays. We can use Developer`PackedArrayQ to \ test this:" }], "Text", CellChangeTimes->{{3.40093641025*^9, 3.400936452265625*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"{", RowBox[{"100", ",", "50"}], "}"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400935710671875*^9, 3.400935745046875*^9}, { 3.400936456890625*^9, 3.400936461125*^9}, {3.400936858578125*^9, 3.400936860140625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}]], "Input", CellChangeTimes->{{3.400936464109375*^9, 3.400936486453125*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.40093647971875*^9, 3.40093649553125*^9}, 3.400936578984375*^9, 3.400936861515625*^9}] }, Open ]], Cell["\<\ Let's use Developer`PackedArrayQ to investigate the packed behavior of data \ after part assignments.\ \>", "Text", CellChangeTimes->{{3.400936760125*^9, 3.400936778609375*^9}, 3.400937092875*^9}], Cell[CellGroupData[{ Cell["Simple part assignment", "Subsubsection", CellChangeTimes->{{3.40093674809375*^9, 3.400936748328125*^9}, { 3.4009367810625*^9, 3.400936787265625*^9}}], Cell["\<\ Simple part assignments with the right number type to packed arrays will not \ unpack the array:\ \>", "Text", CellChangeTimes->{{3.40093651053125*^9, 3.400936550171875*^9}, { 3.400936617859375*^9, 3.40093662034375*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{"3", ",", "3"}], "]"}], "]"}], "=", "2."}]], "Input", CellChangeTimes->{{3.40093655153125*^9, 3.400936582125*^9}}], Cell[BoxData[ FormBox["2.`", TraditionalForm]], "Output", CellChangeTimes->{{3.4009365590625*^9, 3.40093658246875*^9}, 3.40093686315625*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}]], "Input", CellChangeTimes->{{3.400936561375*^9, 3.400936565453125*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400936566234375*^9, 3.400936630484375*^9}, 3.400936863703125*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Submatrix part assignment", "Subsubsection", CellChangeTimes->{{3.400936796515625*^9, 3.400936800671875*^9}, { 3.400937010171875*^9, 3.400937011515625*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{ RowBox[{"{", RowBox[{"2", ",", "3"}], "}"}], ",", RowBox[{"{", RowBox[{"3", ",", "4"}], "}"}]}], "]"}], "]"}], "=", RowBox[{"RandomReal", "[", RowBox[{"2", ",", RowBox[{"{", RowBox[{"2", ",", "2"}], "}"}]}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}]}], "Input", CellChangeTimes->{{3.400936826296875*^9, 3.4009368678125*^9}, { 3.40093702259375*^9, 3.40093703084375*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400936842828125*^9, 3.400936868265625*^9}, 3.400937032078125*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{"All", ",", "1"}], "]"}], "]"}], "=", RowBox[{"RandomReal", "[", RowBox[{"3", ",", "100"}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}]}], "Input", CellChangeTimes->{{3.400936848*^9, 3.400936877140625*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.40093687759375*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{ RowBox[{"2", ";;", "4"}], ",", RowBox[{"3", ";;", "5"}]}], "]"}], "]"}], "=", RowBox[{"RandomReal", "[", RowBox[{"3", ",", RowBox[{"{", RowBox[{"3", ",", "3"}], "}"}]}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}]}], "Input", CellChangeTimes->{{3.40093721828125*^9, 3.4009372340625*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.400937234359375*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Part assignments that unpack", "Subsubsection", CellChangeTimes->{{3.40093714603125*^9, 3.400937153421875*^9}, { 3.400937201265625*^9, 3.400937206359375*^9}}], Cell["\<\ If the right hand side is not packed, than unpacking occurs. Here is an \ unpacked list:\ \>", "Text", CellChangeTimes->{{3.4009372146875*^9, 3.400937252515625*^9}, { 3.4009373240625*^9, 3.40093733721875*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{"new", "=", RowBox[{"{", RowBox[{"1.", ",", "2."}], "}"}]}], ";"}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "new", "]"}]}], "Input", CellChangeTimes->{{3.40093729359375*^9, 3.4009373045*^9}}], Cell[BoxData[ FormBox["False", TraditionalForm]], "Output", CellChangeTimes->{3.400937305640625*^9, 3.40093734721875*^9}] }, Open ]], Cell["We see that assigning new to data causes unpacking:", "Text", CellChangeTimes->{{3.4009373535*^9, 3.4009373680625*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{"2", ";;", "3"}], "]"}], "]"}], "=", "new"}], ";"}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}]}], "Input", CellChangeTimes->{{3.4009372731875*^9, 3.400937319453125*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.40093731134375*^9, 3.40093734828125*^9}], Cell[BoxData[ FormBox["False", TraditionalForm]], "Output", CellChangeTimes->{3.40093731134375*^9, 3.40093734834375*^9}] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell["Developer`ToPackedArray", "Subsection", CellChangeTimes->{{3.4009373779375*^9, 3.400937382328125*^9}}], Cell["\<\ Developer`ToPackedArray will attempt to create a PackedArray. There will be \ no visible difference between the input and the output, and the only way to \ test if packing has occurred is to use Developer`PackedArrayQ:\ \>", "Text", CellChangeTimes->{{3.400937393453125*^9, 3.400937457671875*^9}}], Cell[CellGroupData[{ Cell["Successful packing", "Subsubsection", CellChangeTimes->{{3.4009375160625*^9, 3.40093751953125*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"data", "=", RowBox[{"{", RowBox[{"1.", ",", "2.", ",", RowBox[{"N", "[", "Pi", "]"}]}], "}"}]}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}]}], "Input", CellChangeTimes->{{3.40093746134375*^9, 3.400937476890625*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.`", ",", "2.`", ",", "3.141592653589793`"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400937467484375*^9, 3.400937477328125*^9}}], Cell[BoxData[ FormBox["False", TraditionalForm]], "Output", CellChangeTimes->{{3.400937467484375*^9, 3.40093747734375*^9}}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"pdata", "=", RowBox[{ "Developer`ToPackedArray", "[", "data", "]"}]}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "pdata", "]"}]}], "Input", CellChangeTimes->{{3.400937482515625*^9, 3.40093750640625*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.`", ",", "2.`", ",", "3.141592653589793`"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400937489921875*^9, 3.400937507703125*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400937489921875*^9, 3.40093750771875*^9}}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Unsuccessful packing", "Subsubsection", CellChangeTimes->{{3.400937523890625*^9, 3.4009375280625*^9}}], Cell["\<\ Here is a list that can't be packed because it contains mixed number types:\ \>", "Text", CellChangeTimes->{{3.400937531421875*^9, 3.400937545359375*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"data", "=", RowBox[{"{", RowBox[{"1", ",", "2.", ",", "3."}], "}"}]}]], "Input", CellChangeTimes->{{3.400937549484375*^9, 3.400937555296875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1", ",", "2.`", ",", "3.`"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.40093755709375*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"pdata", "=", RowBox[{ "Developer`ToPackedArray", "[", "data", "]"}]}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "pdata", "]"}]}], "Input", CellChangeTimes->{{3.40093755921875*^9, 3.400937579109375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1", ",", "2.`", ",", "3.`"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4009375795625*^9}], Cell[BoxData[ FormBox["False", TraditionalForm]], "Output", CellChangeTimes->{3.400937579609375*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Coercion", "Subsubsection", CellChangeTimes->{{3.400937773234375*^9, 3.40093777609375*^9}}], Cell["\<\ When mixed number types are present, the optional second argument of \ Developer`ToPackedArray can be used to coerce the incorrect types:\ \>", "Text", CellChangeTimes->{{3.4009375849375*^9, 3.40093761459375*^9}, { 3.4009377849375*^9, 3.400937803765625*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"rdata", "=", RowBox[{"Developer`ToPackedArray", "[", RowBox[{ RowBox[{"{", RowBox[{"1.", ",", "2.", ",", "3."}], "}"}], ",", "Real"}], "]"}]}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "rdata", "]"}]}], "Input", CellChangeTimes->{{3.4009376171875*^9, 3.400937695046875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.`", ",", "2.`", ",", "3.`"}], "}"}], TraditionalForm]], "Output",\ CellChangeTimes->{{3.400937623171875*^9, 3.4009376963125*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400937623171875*^9, 3.4009376963125*^9}}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"idata", "=", RowBox[{"Developer`ToPackedArray", "[", RowBox[{ RowBox[{"{", RowBox[{"1.", ",", "2.", ",", "3."}], "}"}], ",", "Integer"}], "]"}]}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "idata", "]"}]}], "Input", CellChangeTimes->{{3.400937698640625*^9, 3.400937720125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1", ",", "2", ",", "3"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400937720625*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.4009377206875*^9}] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell["Developer`FromPackedArray", "Subsection", CellChangeTimes->{{3.40093781840625*^9, 3.4009378221875*^9}}], Cell["\<\ Developer`FromPackedArray does the obvious thing, and we'll use this function \ to test packed array behavior. There are situations where unpacking an array \ can be speed things up, but I won't be giving any such examples today\ \>", "Text", CellChangeTimes->{{3.400937868890625*^9, 3.4009379425625*^9}}] }, Closed]], Cell[CellGroupData[{ Cell["\"PackedArrayOptions\"", "Subsection", CellChangeTimes->{{3.400937948015625*^9, 3.400937957875*^9}, { 3.4009380168125*^9, 3.4009380175625*^9}}], Cell[TextData[{ "As we saw earlier, ", StyleBox["Mathematica", FontSlant->"Italic"], " uses system options to control the behavior of various functions. For \ packed arrays, they are:" }], "Text", CellChangeTimes->{{3.40093798171875*^9, 3.4009380989375*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"SystemOptions", "[", "\"\\"", "]"}]], "Input", CellChangeTimes->{{3.400938101296875*^9, 3.400938107890625*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"\<\"PackedArrayOptions\"\>", "\[Rule]", RowBox[{"{", RowBox[{ RowBox[{"\<\"ListableAutoPackLength\"\>", "\[Rule]", "250"}], ",", RowBox[{"\<\"PackedArrayMathLinkRead\"\>", "\[Rule]", "True"}], ",", RowBox[{"\<\"PackedArrayPatterns\"\>", "\[Rule]", "True"}], ",", RowBox[{"\<\"PackedRange\"\>", "\[Rule]", "True"}], ",", RowBox[{"\<\"UnpackMessage\"\>", "\[Rule]", "False"}]}], "}"}]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400938108609375*^9}] }, Open ]], Cell["The only option that we will use today is the last one:", "Text", CellChangeTimes->{{3.4009381150625*^9, 3.400938132921875*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"SetSystemOptions", "[", RowBox[{"\"\\"", "\[Rule]", RowBox[{"\"\\"", "\[Rule]", "True"}]}], "]"}], ";"}]], "Input", CellChangeTimes->{{3.40093813515625*^9, 3.400938147390625*^9}}], Cell["Let's try the last part assignment example again.", "Text", CellChangeTimes->{{3.40093817003125*^9, 3.400938183984375*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"new", "=", RowBox[{"{", RowBox[{"1.", ",", "2.", ",", "3."}], "}"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", "10"}], "]"}]}], ";"}]}], "Input", CellChangeTimes->{{3.400938186640625*^9, 3.40093820725*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{"2", ";;", "4"}], "]"}], "]"}], "=", "new"}]], "Input", CellChangeTimes->{{3.40093821378125*^9, 3.400938217625*^9}}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"unpack1\"\>"}], ":", " ", "\<\"Unpacking array.\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.40093821834375*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.`", ",", "2.`", ",", "3.`"}], "}"}], TraditionalForm]], "Output",\ CellChangeTimes->{3.400938218359375*^9}] }, Open ]], Cell["\<\ These unpacking messages are useful when a packed array operation seems to be \ slower than expected.\ \>", "Text", CellChangeTimes->{{3.4009382505625*^9, 3.400938276984375*^9}}] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["Useful functions for packed arrays", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.4007195270613985`*^9, 3.400719528592629*^9}, {3.400858963566442*^9, 3.4008589640509996`*^9}, {3.400859105151134*^9, 3.40085910838673*^9}, { 3.401179863765625*^9, 3.401179869484375*^9}}], Cell[CellGroupData[{ Cell["Part", "Subsection", CellChangeTimes->{{3.400859115983348*^9, 3.4008591163428583`*^9}}], Cell["Part assignments are quick. Here is some sample data:", "Text", CellChangeTimes->{{3.400859511103749*^9, 3.4008595230369835`*^9}, { 3.4008596610101385`*^9, 3.400859666438591*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"{", RowBox[{"1000", ",", "1000"}], "}"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400859227998047*^9, 3.40085923338371*^9}, { 3.400859383014861*^9, 3.4008593982846165`*^9}, {3.400859572782195*^9, 3.4008596305764894`*^9}}], Cell["Create a target matrix:", "Text", CellChangeTimes->{{3.4008595630172205`*^9, 3.400859568586064*^9}, { 3.400859656346038*^9, 3.4008596582803135`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"new", "=", RowBox[{"ConstantArray", "[", RowBox[{"0", ",", RowBox[{"{", RowBox[{"1000", ",", "1000"}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400859240170268*^9, 3.400859249135996*^9}, { 3.400859386984064*^9, 3.4008594000123873`*^9}, {3.400859531242058*^9, 3.400859541896175*^9}, {3.4008595804101057`*^9, 3.400859634897413*^9}, { 3.400859670057559*^9, 3.40085967191384*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.031999999999999335`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.400859249587395*^9, {3.400859387622249*^9, 3.4008594018491163`*^9}, { 3.400859534003081*^9, 3.4008595423797436`*^9}, {3.400859585479781*^9, 3.4008596375804405`*^9}, 3.400859672241419*^9}] }, Open ]], Cell["Copy data to new:", "Text", CellChangeTimes->{{3.400859717416123*^9, 3.4008597204423285`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{ RowBox[{"new", "[", RowBox[{"[", RowBox[{"All", ",", "All"}], "]"}], "]"}], "=", "data"}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4008592517509995`*^9, 3.4008592585375576`*^9}, { 3.400859380524381*^9, 3.400859390003771*^9}, {3.400859492104167*^9, 3.400859496144308*^9}, {3.400859550460026*^9, 3.4008595547185526`*^9}, { 3.4008595907834406`*^9, 3.400859619719586*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.1399999999999999`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008596200939617`*^9, 3.400859639499118*^9}}] }, Open ]], Cell["Obviously, in this case it would be easier to just use:", "Text", CellChangeTimes->{{3.400859754148625*^9, 3.40085975578778*^9}, { 3.4008597859482317`*^9, 3.40085980496243*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"new", "=", "data"}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400859806226921*^9, 3.4008598084905157`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4008598088339577`*^9}] }, Open ]], Cell[CellGroupData[{ Cell["Mathgroup example", "Subsubsection", CellChangeTimes->{{3.4008598281291537`*^9, 3.4008598306893578`*^9}}], Cell["Yoram Pollack writes:", "Text", CellChangeTimes->{{3.401196720421875*^9, 3.401196724578125*^9}}], Cell["\<\ I am trying to create a \"n x n\" matrix with \"1\" in every position exept \ in first and last row, and first and last coulumn, where \"0\" is needed. In other words : sqare matrix full of \"1\" sorounded by \"0\". What will be the fastest and shortest way to do it?\ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["\<\ In this case, Allan Hayes suggested to create a matrix of 1s and then to \ overwrite 0s in the right place.\ \>", "Text", CellChangeTimes->{{3.40119687925*^9, 3.40119695953125*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"f2", "[", "n_", "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "tmp", "}"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"tmp", "=", RowBox[{"ConstantArray", "[", RowBox[{"1", ",", RowBox[{"{", RowBox[{"n", ",", "n"}], "}"}]}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{ RowBox[{"tmp", "[", RowBox[{"[", RowBox[{ RowBox[{"{", RowBox[{"1", ",", RowBox[{"-", "1"}]}], "}"}], ",", "All"}], "]"}], "]"}], "=", "0"}], ";", "\[IndentingNewLine]", RowBox[{ RowBox[{"tmp", "[", RowBox[{"[", RowBox[{"All", ",", RowBox[{"{", RowBox[{"1", ",", RowBox[{"-", "1"}]}], "}"}]}], "]"}], "]"}], "=", "0"}], ";", "\[IndentingNewLine]", "tmp"}]}], "\[IndentingNewLine]", "]"}]}]], "Input", CellChangeTimes->{{3.400860259100561*^9, 3.4008603618829646`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"f2", "[", "1000", "]"}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.40119696453125*^9, 3.40119696859375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.031000000000000555`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401196970046875*^9}] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell["Clip/Unitize", "Subsection", CellChangeTimes->{{3.400859443903257*^9, 3.4008594443244295`*^9}, { 3.401195230421875*^9, 3.40119523153125*^9}}], Cell["\<\ Clip is a new version 5.1 function that I find very useful. The syntax is:\ \>", "Text", CellChangeTimes->{{3.4008608836374393`*^9, 3.4008608897438817`*^9}, { 3.4008609217129045`*^9, 3.4008610018627424`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"?", "Clip"}]], "Input", CellChangeTimes->{{3.400861002909128*^9, 3.400861003565072*^9}}], Cell[BoxData[ RowBox[{ StyleBox["\<\"\!\(\*RowBox[{\\\"Clip\\\", \\\"[\\\", StyleBox[\\\"x\\\", \\\ \"TI\\\"], \\\"]\\\"}]\) gives \!\(\*StyleBox[\\\"x\\\", \\\"TI\\\"]\) \ clipped to be between \!\(\*RowBox[{\\\"-\\\", \\\"1\\\"}]\) and \ \!\(\*RowBox[{\\\"+\\\", \\\"1\\\"}]\). \\n\!\(\*RowBox[{\\\"Clip\\\", \ \\\"[\\\", RowBox[{StyleBox[\\\"x\\\", \\\"TI\\\"], \\\",\\\", \ RowBox[{\\\"{\\\", RowBox[{StyleBox[\\\"min\\\", \\\"TI\\\"], \\\",\\\", \ StyleBox[\\\"max\\\", \\\"TI\\\"]}], \\\"}\\\"}]}], \\\"]\\\"}]\) gives \ \!\(\*StyleBox[\\\"x\\\", \\\"TI\\\"]\) for \ \!\(\*RowBox[{StyleBox[\\\"min\\\", \\\"TI\\\"], \\\"\[LessEqual]\\\", \ StyleBox[\\\"x\\\", \\\"TI\\\"], \\\"\[LessEqual]\\\", StyleBox[\\\"max\\\", \ \\\"TI\\\"]}]\), \!\(\*StyleBox[\\\"min\\\", \\\"TI\\\"]\) for \ \!\(\*RowBox[{StyleBox[\\\"x\\\", \\\"TI\\\"], \\\"<\\\", \ StyleBox[\\\"min\\\", \\\"TI\\\"]}]\) and \!\(\*StyleBox[\\\"max\\\", \ \\\"TI\\\"]\) for \!\(\*RowBox[{StyleBox[\\\"x\\\", \\\"TI\\\"], \\\">\\\", \ StyleBox[\\\"max\\\", \\\"TI\\\"]}]\). \\n\!\(\*RowBox[{\\\"Clip\\\", \\\"[\\\ \", RowBox[{StyleBox[\\\"x\\\", \\\"TI\\\"], \\\",\\\", RowBox[{\\\"{\\\", \ RowBox[{StyleBox[\\\"min\\\", \\\"TI\\\"], \\\",\\\", StyleBox[\\\"max\\\", \ \\\"TI\\\"]}], \\\"}\\\"}], \\\",\\\", RowBox[{\\\"{\\\", \ RowBox[{SubscriptBox[StyleBox[\\\"v\\\", \\\"TI\\\"], StyleBox[\\\"min\\\", \ \\\"TI\\\"]], \\\",\\\", SubscriptBox[StyleBox[\\\"v\\\", \\\"TI\\\"], \ StyleBox[\\\"max\\\", \\\"TI\\\"]]}], \\\"}\\\"}]}], \\\"]\\\"}]\) gives \!\(\ \*SubscriptBox[StyleBox[\\\"v\\\", \\\"TI\\\"], StyleBox[\\\"min\\\", \ \\\"TI\\\"]]\) for \!\(\*RowBox[{StyleBox[\\\"x\\\", \\\"TI\\\"], \\\"<\\\", \ StyleBox[\\\"min\\\", \\\"TI\\\"]}]\) and \!\(\*SubscriptBox[StyleBox[\\\"v\\\ \", \\\"TI\\\"], StyleBox[\\\"max\\\", \\\"TI\\\"]]\) for \ \!\(\*RowBox[{StyleBox[\\\"x\\\", \\\"TI\\\"], \\\">\\\", \ StyleBox[\\\"max\\\", \\\"TI\\\"]}]\). \"\>", "MSG"], " ", ButtonBox[ StyleBox["\[RightSkeleton]", "SR"], Active->True, BaseStyle->"Link", ButtonData->"paclet:ref/Clip"]}]], "Print", "PrintUsage", CellChangeTimes->{3.4008621623262477`*^9}, CellTags->"Info3400847762-2134627"] }, Open ]], Cell["Here is a paraphrased Mathgroup example:", "Text", CellChangeTimes->{{3.4008616958537974`*^9, 3.4008617295101566`*^9}, { 3.400862251316472*^9, 3.400862253003195*^9}, {3.400862734296937*^9, 3.4008627364678116`*^9}}], Cell["\<\ What is the fastest way to replace every element different from 1 by zero?\ \>", "Text", CellChangeTimes->{{3.400862742996052*^9, 3.4008627626744795`*^9}, { 3.4008628106523614`*^9, 3.4008628277382345`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"10", ",", RowBox[{"{", "1000000", "}"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.4008628427469406`*^9, 3.400862851274259*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"Clip", "[", RowBox[{"data", ",", RowBox[{"{", RowBox[{"1", ",", "1"}], "}"}], ",", RowBox[{"{", RowBox[{"0", ",", "0"}], "}"}]}], "]"}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4008628544602904`*^9, 3.4008628604731436`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"5.589972928987663`*^-14", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4008628611603265`*^9, 3.400927909640625*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"data", "/.", RowBox[{"x_Integer", "\[Rule]", RowBox[{"0", "/;", RowBox[{"x", "\[NotEqual]", "1"}]}]}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400862962707262*^9, 3.400862965971382*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.2030000000000443`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4008629692511206`*^9, 3.40092789978125*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{ RowBox[{ RowBox[{"If", "[", RowBox[{ RowBox[{"#", "===", "1"}], ",", "#", ",", "0"}], "]"}], "&"}], "/@", "data"}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400927871234375*^9, 3.400927890828125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.8119999999999559`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.40092789403125*^9}] }, Open ]], Cell["\<\ Unitize[expr] is another quick function, and is basically short hand for \ Clip[expr, {1,1}, {0,0}].\ \>", "Text", CellChangeTimes->{{3.4011952379375*^9, 3.401195314453125*^9}}], Cell[BoxData[""], "Input", CellChangeTimes->{{3.401195261828125*^9, 3.40119526371875*^9}}] }, Closed]], Cell[CellGroupData[{ Cell["UnitStep", "Subsection", CellChangeTimes->{{3.4008594619980965`*^9, 3.400859463152423*^9}}], Cell["\<\ Another very quick function is UnitStep. Here is another Mathgroup example, \ where Larry (actuary@mchsi.com) writes:\ \>", "Text", CellChangeTimes->{{3.4008634085337944`*^9, 3.4008634267130566`*^9}, { 3.401197118375*^9, 3.401197142515625*^9}}], Cell["\<\ I have two lists of real numbers, a & b. I want to compare individual items \ in one list to the corresponding items in the other list. For example Is a[[1]] > b[[1]]. At the end of the comparisons, I want \ to count the \"Trues\". I know how to do this use a \"Table\" statement and a \"Count\" statement. Is there a quicker, more efficient way \ of counting the number of \"Trues\"?\ \>", "Program", CellChangeTimes->{{3.4008634589777193`*^9, 3.4008634884817686`*^9}}, FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell[BoxData[{ RowBox[{ RowBox[{"a", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"b", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}]}], "Input", CellChangeTimes->{{3.400863507147275*^9, 3.4008635332162437`*^9}}], Cell["Using UnitStep and Total is much faster than Count:", "Text", CellChangeTimes->{{3.401197244828125*^9, 3.401197255296875*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Count", "[", RowBox[{ RowBox[{"a", "-", "b"}], ",", RowBox[{"_", "?", "Positive"}]}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Total", "[", RowBox[{"UnitStep", "[", RowBox[{"a", "-", "b"}], "]"}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.4008635387812443`*^9, 3.400863609723382*^9}, { 3.4008636471502886`*^9, 3.4008636755334024`*^9}, {3.401197266875*^9, 3.40119727453125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.0469999999999993`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008635833117523`*^9, 3.4008636103961906`*^9}, { 3.4008636511401973`*^9, 3.400863675987157*^9}, 3.401197281140625*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.17200000000000046`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008635833117523`*^9, 3.4008636103961906`*^9}, { 3.4008636511401973`*^9, 3.400863675987157*^9}, 3.4011972813125*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.4008635833117523`*^9, 3.4008636103961906`*^9}, { 3.4008636511401973`*^9, 3.400863675987157*^9}, 3.401197281359375*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["BitAnd, BitXor, Total, Tr", "Subsection", CellChangeTimes->{{3.401111005543951*^9, 3.401111011482826*^9}, { 3.40114546528125*^9, 3.401145468546875*^9}}], Cell["\<\ In many of algorithms we construct an array of 0s and 1s, and BitAnd, BitXor \ etc are a bit faster than Plus/Times for these types of arguments. Also, \ Total and Tr are properly optimized for packed arrays.\ \>", "Text", CellChangeTimes->{{3.401111020258645*^9, 3.401111051122093*^9}, { 3.40119539271875*^9, 3.40119545171875*^9}}] }, Closed]], Cell[CellGroupData[{ Cell["Tally", "Subsection", CellChangeTimes->{{3.4008638832496433`*^9, 3.400863883968747*^9}}], Cell["\<\ Tally is a new version 6 function that works very nicely with packed lists. \ For example, here is a function that does integer bin counts:\ \>", "Text", CellChangeTimes->{{3.40119855278125*^9, 3.401198629140625*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"100", ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400927997828125*^9, 3.40092808265625*^9}, { 3.40092860346875*^9, 3.400928606140625*^9}, {3.40092869546875*^9, 3.400928697296875*^9}, {3.40092878503125*^9, 3.400928787140625*^9}, { 3.40092884828125*^9, 3.400928850546875*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"BinCounts", "[", "data", "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.40092848496875*^9, 3.400928512125*^9}, 3.40092860909375*^9, {3.400928699796875*^9, 3.4009287181875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.7340000000000012`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.40092851503125*^9, 3.40092860953125*^9, {3.400928702015625*^9, 3.40092871903125*^9}, 3.400928853265625*^9, 3.40120333390625*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{ RowBox[{ RowBox[{"Tally", "[", RowBox[{ RowBox[{"Range", "[", RowBox[{"0", ",", "100"}], "]"}], "~", "Join", "~", "data"}], "]"}], "[", RowBox[{"[", RowBox[{"All", ",", "2"}], "]"}], "]"}], "-", "1"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.40092851675*^9, 3.40092856725*^9}, { 3.400928681953125*^9, 3.4009286848125*^9}, {3.400928722046875*^9, 3.400928725171875*^9}, {3.400928842921875*^9, 3.4009288438125*^9}, { 3.400928906828125*^9, 3.400928920546875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.014999999999998292`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.40092853684375*^9, 3.400928568578125*^9}, { 3.400928685640625*^9, 3.40092872553125*^9}, 3.400928855140625*^9, 3.400928921765625*^9, 3.40120333509375*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"Rest", "[", "r1", "]"}], "===", "r2"}]], "Input", CellChangeTimes->{{3.400928862640625*^9, 3.40092886559375*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.400928866046875*^9, 3.400928924125*^9, 3.401203336390625*^9}] }, Open ]], Cell["Another nice example is an unsorted union:", "Text", CellChangeTimes->{{3.401198640375*^9, 3.40119865065625*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{ RowBox[{"10", "^", "6"}], ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.40119865153125*^9, 3.401198665609375*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Union", "[", "data", "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{ RowBox[{"Tally", "[", "data", "]"}], "[", RowBox[{"[", RowBox[{"All", ",", "1"}], "]"}], "]"}]}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.40119866871875*^9, 3.401198683953125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.7650000000000005`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4011986890625*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.0939999999999999`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401198690390625*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r1", "===", RowBox[{"Sort", "[", "r2", "]"}]}]], "Input", CellChangeTimes->{{3.4011986924375*^9, 3.4011986984375*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.40119869925*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Ordering", "Subsection", CellChangeTimes->{{3.400863910903889*^9, 3.4008639116542587`*^9}}], Cell[TextData[{ "Ordering is a version 4 ", StyleBox["Mathematica", FontSlant->"Italic"], " function which can be extremely useful. The basic situation where Ordering \ is useful is when one wants to sort some data, but the sort criteria isn't \ simple. It is possible to use Sort with a custom ordering function, but such \ a Sort is orders of magnitude slower than a Sort without an ordering \ function. Using Ordering allows one to use the default ordering function \ applied to a specific part of the data.\n\nThe new version 6 function SortBy \ can also be used for this purpose, but I find the Ordering approach to be \ quicker." }], "Text", CellChangeTimes->{{3.400971519875*^9, 3.400971727875*^9}, {3.400971783875*^9, 3.400971854125*^9}}], Cell[CellGroupData[{ Cell["Sorting based on the last element", "Subsubsection", CellChangeTimes->{{3.40097186765625*^9, 3.400971874359375*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"1000", ",", RowBox[{"{", RowBox[{ RowBox[{"10", "^", "5"}], ",", "5"}], "}"}]}], "]"}]}], ";"}]], "Input",\ CellChangeTimes->{{3.400971859625*^9, 3.40097190215625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Sort", "[", RowBox[{"data", ",", RowBox[{ RowBox[{ RowBox[{"#1", "[", RowBox[{"[", RowBox[{"-", "1"}], "]"}], "]"}], ">", RowBox[{"#2", "[", RowBox[{"[", RowBox[{"-", "1"}], "]"}], "]"}]}], "&"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.40097190715625*^9, 3.400971935234375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"3.6090000000000515`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.40097194265625*^9, 3.400972016765625*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"SortBy", "[", RowBox[{"data", ",", "Last"}], "]"}]}], ";"}], "//", "Timing"}]], "Input",\ CellChangeTimes->{{3.4009719385*^9, 3.40097195178125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.3130000000000515`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.400971952546875*^9, {3.400971989046875*^9, 3.400972018171875*^9}}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r3", "=", RowBox[{"data", "[", RowBox[{"[", RowBox[{"Ordering", "[", RowBox[{"data", "[", RowBox[{"[", RowBox[{"All", ",", RowBox[{"-", "1"}]}], "]"}], "]"}], "]"}], "]"}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400971954171875*^9, 3.40097197478125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.046999999999975284`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4009719826875*^9, 3.400971985953125*^9}, 3.400972019953125*^9}] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell["Transpose", "Subsection", CellChangeTimes->{{3.400875954489292*^9, 3.4008759573106017`*^9}}], Cell["\<\ With packed arrays, transposing an array is simply a matter of reindexing the \ packed array elements. Consequently, Transpose is a very quick operation:\ \>", "Text", CellChangeTimes->{{3.400972060171875*^9, 3.40097210846875*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"{", RowBox[{"1000", ",", "1000"}], "}"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.4009721095*^9, 3.4009721173125*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"Transpose", "[", "data", "]"}], ";"}], "//", "Timing"}]], "Input",\ CellChangeTimes->{{3.40097212003125*^9, 3.40097212328125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.031000000000024286`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400972123640625*^9}] }, Open ]], Cell[CellGroupData[{ Cell["Adding a vector to a list of points", "Subsubsection", CellChangeTimes->{{3.40097213815625*^9, 3.40097215296875*^9}, { 3.40097272621875*^9, 3.400972726703125*^9}, {3.400973633828125*^9, 3.4009736341875*^9}}], Cell["\<\ One common operation when dealing with lists or matrices of points is to \ scale or translate the points. For a single point, or a list of points, the \ new version 6 function TransformationFunction is both powerful and quick.\ \>", "Text", CellChangeTimes->{{3.400972155203125*^9, 3.400972194296875*^9}, { 3.40097271390625*^9, 3.400972760109375*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"t", "=", RowBox[{"TranslationTransform", "[", RowBox[{"{", RowBox[{"1", ",", "2"}], "}"}], "]"}]}]], "Input", CellChangeTimes->{{3.40097276475*^9, 3.40097278828125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"TransformationFunction", "[", RowBox[{"(", GridBox[{ {"1", "0", "1"}, {"0", "1", "2"}, {"0", "0", "1"} }, ColumnsEqual->False, GridBoxDividers->{ "ColumnsIndexed" -> {-2 -> True}, "RowsIndexed" -> {-2 -> True}}, GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}, RowsEqual->False], ")"}], "]"}], TraditionalForm]], "Output", CellChangeTimes->{3.400972911234375*^9, 3.4009730488125*^9}] }, Open ]], Cell["Here is a list of a million 2-dimensional points:", "Text", CellChangeTimes->{{3.4009730584375*^9, 3.40097307940625*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"10", ",", RowBox[{"{", RowBox[{ RowBox[{"10", "^", "6"}], ",", "2"}], "}"}]}], "]"}]}], ";"}]], "Input",\ CellChangeTimes->{{3.40097304125*^9, 3.400973055796875*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"t", "[", "data", "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400973086515625*^9, 3.400973090796875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.375`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4009730916875*^9}] }, Open ]], Cell["\<\ As an alternative, one can use Transpose a couple times to achieve the same \ result:\ \>", "Text", CellChangeTimes->{{3.400973106453125*^9, 3.400973132109375*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Transpose", "[", RowBox[{ RowBox[{"Transpose", "[", "data", "]"}], "+", RowBox[{"{", RowBox[{"1", ",", "2"}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.400973133296875*^9, 3.400973150140625*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.12499999999999994`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.40097315059375*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.40097315065625*^9}] }, Open ]], Cell["\<\ The advantage of using TransformationFunctions is that they can handle \ scaling, translations and rotations, and they are not too slow. \ \>", "Text", CellChangeTimes->{{3.400973285625*^9, 3.400973331625*^9}, { 3.400973508703125*^9, 3.400973555546875*^9}}] }, Closed]], Cell[CellGroupData[{ Cell["Adding a vector to a matrix of points", "Subsubsection", CellChangeTimes->{{3.40097362571875*^9, 3.4009736418125*^9}}], Cell["\<\ For a matrix of points, TransformationFunction can't be used directly. For \ simple translations and scaling, a nested Transpose approach may be useful.\ \>", "Text", CellChangeTimes->{{3.400973647734375*^9, 3.400973713234375*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"{", RowBox[{"1000", ",", "1000", ",", "2"}], "}"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400973719578125*^9, 3.400973737734375*^9}, { 3.400973858953125*^9, 3.40097386615625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r", "=", RowBox[{"Transpose", "[", RowBox[{ RowBox[{ RowBox[{"Transpose", "[", RowBox[{"data", ",", RowBox[{"{", RowBox[{"3", ",", "2", ",", "1"}], "}"}]}], "]"}], "+", RowBox[{"{", RowBox[{"1", ",", "2"}], "}"}]}], ",", RowBox[{"{", RowBox[{"3", ",", "2", ",", "1"}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400973743265625*^9, 3.400973817921875*^9}, { 3.40097386815625*^9, 3.400973869234375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.1410000000000001`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.40097386975*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"data", "[", RowBox[{"[", RowBox[{ RowBox[{"1", ";;", "3"}], ",", RowBox[{"1", ";;", "3"}]}], "]"}], "]"}]], "Input", CellChangeTimes->{{3.400973819578125*^9, 3.4009738321875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ { RowBox[{"{", RowBox[{"0.17152574698108847`", ",", "0.4577416652327668`"}], "}"}], RowBox[{"{", RowBox[{"0.14111602241954868`", ",", "0.13432099169199252`"}], "}"}], RowBox[{"{", RowBox[{"0.919849223507351`", ",", "0.47237392902600983`"}], "}"}]}, { RowBox[{"{", RowBox[{"0.9011933206317644`", ",", "0.9661078510863834`"}], "}"}], RowBox[{"{", RowBox[{"0.7142674951902643`", ",", "0.7739094072578434`"}], "}"}], RowBox[{"{", RowBox[{"0.6781775434007242`", ",", "0.21009363000387515`"}], "}"}]}, { RowBox[{"{", RowBox[{"0.33338376927739`", ",", "0.23486677161652603`"}], "}"}], RowBox[{"{", RowBox[{"0.8482367434414266`", ",", "0.22270185163571887`"}], "}"}], RowBox[{"{", RowBox[{"0.06805505061462913`", ",", "0.4851951134260599`"}], "}"}]} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], TraditionalForm]], "Output", CellChangeTimes->{3.400973832390625*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r", "[", RowBox[{"[", RowBox[{ RowBox[{"1", ";;", "3"}], ",", RowBox[{"1", ";;", "3"}]}], "]"}], "]"}]], "Input", CellChangeTimes->{{3.400973834421875*^9, 3.400973838703125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ { RowBox[{"{", RowBox[{"1.1715257469810885`", ",", "2.457741665232767`"}], "}"}], RowBox[{"{", RowBox[{"1.1411160224195487`", ",", "2.1343209916919923`"}], "}"}], RowBox[{"{", RowBox[{"1.919849223507351`", ",", "2.47237392902601`"}], "}"}]}, { RowBox[{"{", RowBox[{"1.9011933206317644`", ",", "2.9661078510863836`"}], "}"}], RowBox[{"{", RowBox[{"1.7142674951902643`", ",", "2.773909407257843`"}], "}"}], RowBox[{"{", RowBox[{"1.6781775434007242`", ",", "2.2100936300038754`"}], "}"}]}, { RowBox[{"{", RowBox[{"1.33338376927739`", ",", "2.234866771616526`"}], "}"}], RowBox[{"{", RowBox[{"1.8482367434414266`", ",", "2.222701851635719`"}], "}"}], RowBox[{"{", RowBox[{"1.0680550506146291`", ",", "2.4851951134260597`"}], "}"}]} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], TraditionalForm]], "Output", CellChangeTimes->{3.400973839046875*^9}] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["PackedArray issues", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.400857543233452*^9, 3.400857544390138*^9}}], Cell[TextData[{ "The most obvious situation where packed arrays are useful is when \ arithmetic is involved, since packed arrays + listability produces the \ fastest ", StyleBox["Mathematica", FontSlant->"Italic"], " code. Even with just arithmetic, though, unpacking can occur." }], "Text", CellChangeTimes->{{3.400938544328125*^9, 3.400938626875*^9}}], Cell[CellGroupData[{ Cell["Unpacking", "Subsection", CellChangeTimes->{{3.400938527125*^9, 3.4009385395*^9}, 3.4009699125*^9}], Cell["\<\ A simple example of unpacking is division with integers. Here is a packed \ array of even integers:\ \>", "Text", CellChangeTimes->{{3.400938631671875*^9, 3.400938648375*^9}, { 3.400938694640625*^9, 3.400938713109375*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"data", "=", RowBox[{"2", RowBox[{"RandomInteger", "[", RowBox[{"5", ",", "10"}], "]"}]}]}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}]}], "Input", CellChangeTimes->{{3.400938654140625*^9, 3.4009386665625*^9}, { 3.400938704875*^9, 3.4009387188125*^9}, {3.4011312729116697`*^9, 3.4011312823046703`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "4", ",", "2", ",", "8", ",", "2", ",", "0", ",", "2", ",", "8", ",", "8", ",", "10", ",", "2"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.40093872003125*^9, {3.40113127653867*^9, 3.40113128289367*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{ 3.40093872003125*^9, {3.40113127653867*^9, 3.40113128290917*^9}}] }, Open ]], Cell["One might expect that division by 2 would be ok:", "Text", CellChangeTimes->{{3.40093872728125*^9, 3.400938738265625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Developer`PackedArrayQ", "[", RowBox[{"data", "/", "2"}], "]"}]], "Input", CellChangeTimes->{{3.40093867475*^9, 3.400938682078125*^9}}], Cell[BoxData[ FormBox["False", TraditionalForm]], "Output", CellChangeTimes->{3.4009386825625*^9, 3.40113129007017*^9}] }, Open ]], Cell["A similar example with real data:", "Text", CellChangeTimes->{{3.400969695546875*^9, 3.400969704421875*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"-", "10"}], ",", "10"}], "}"}], ",", "10"}], "]"}]}], "\[IndentingNewLine]", RowBox[{"Developer`PackedArrayQ", "[", "data", "]"}]}], "Input", CellChangeTimes->{{3.400969706421875*^9, 3.400969724421875*^9}, 3.4011313003931704`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ RowBox[{"-", "9.11831078037606`"}], ",", RowBox[{"-", "4.209772579386395`"}], ",", "9.156874946950492`", ",", RowBox[{"-", "5.713394877002589`"}], ",", "8.319759024122511`", ",", RowBox[{"-", "6.941314727777135`"}], ",", RowBox[{"-", "3.303020136386552`"}], ",", "0.6869117741520503`", ",", "2.378314213687478`", ",", RowBox[{"-", "2.482478525043126`"}]}], "}"}], TraditionalForm]], "Output",\ CellChangeTimes->{3.400969726484375*^9, 3.40113130074967*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.400969726484375*^9, 3.40113130078067*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Developer`PackedArrayQ", "[", RowBox[{"Sqrt", "[", "data", "]"}], "]"}]], "Input", CellChangeTimes->{{3.40096973021875*^9, 3.4009697458125*^9}}], Cell[BoxData[ FormBox["False", TraditionalForm]], "Output", CellChangeTimes->{{3.400969739890625*^9, 3.400969746234375*^9}, 3.40113130721317*^9}] }, Open ]], Cell["\<\ In this case, coercion to complex data first may be helpful. A larger data \ set illustrates the advantage of avoiding unpacking here:\ \>", "Text", CellChangeTimes->{{3.4009698155625*^9, 3.400969838859375*^9}, { 3.4011313353456697`*^9, 3.40113135713527*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"-", "10"}], ",", "10"}], "}"}], ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"cdata", "=", RowBox[{"Developer`ToPackedArray", "[", RowBox[{"data", ",", "Complex"}], "]"}]}], ";"}]}], "Input", CellChangeTimes->{{3.4011313670126953`*^9, 3.4011313803588853`*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Sqrt", "[", "data", "]"}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"Sqrt", "[", "cdata", "]"}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.401131392211795*^9, 3.4011314268994455`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.7970000000000004`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4011314047024603`*^9, 3.401131428703825*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.2339999999999967`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4011314047024603`*^9, 3.40113142896826*^9}}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Integer square roots", "Subsection", CellChangeTimes->{{3.400969924796875*^9, 3.400969927578125*^9}, { 3.40097082790625*^9, 3.400970833625*^9}}], Cell["\<\ Suppose we are interested in finding the greatest integer less than the \ square root of a list of integers. How do we do this and keep everything \ packed?\ \>", "Text", CellChangeTimes->{{3.40097083628125*^9, 3.4009708744375*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{ SuperscriptBox["10", "6"], ",", SuperscriptBox["10", "4"]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.4009708778125*^9, 3.400970897671875*^9}, { 3.400970959078125*^9, 3.400970959625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Floor", "[", RowBox[{"Sqrt", "[", "data", "]"}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.40097090596875*^9, 3.400970925484375*^9}}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"unpack\"\>"}], ":", " ", "\<\"Unpacking array in call to \ \\!\\(TraditionalForm\\`Sqrt\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.400970926203125*^9, 3.400970960828125*^9, 3.40097102825*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.8440000000000042`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400970954453125*^9, 3.40097098325*^9}, 3.400971029265625*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Floor", "[", RowBox[{"Sqrt", "[", RowBox[{"N", "[", "data", "]"}], "]"}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400970939546875*^9, 3.4009709486875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4009710205*^9, 3.4009710264375*^9}}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["MathGroup", FontSlant->"Italic"], " example" }], "Subsection", CellChangeTimes->{{3.40101510758829*^9, 3.4010151082743907`*^9}, { 3.4010192690768766`*^9, 3.401019271748769*^9}}], Cell["Istvan Zachar writes:", "Text", CellChangeTimes->{{3.401182268703125*^9, 3.4011822715*^9}, { 3.40118240271875*^9, 3.401182411265625*^9}}], Cell["\<\ Consider a set of data (y values): data = Table[i*j, {i, 5}, {j, 10}] I want to label each Integer with an x value: label := Table[{i, #} & /@ data[[i]], {i, Length[data]}] I've understand that list creation is much faster with Map than with Table. \ Is there an effective way to convert the Table to Map in the label function \ (either with nested Map or to incorporate the Table function into the Map)? \ Would it be really faster for very large datasets than with Table? \ \>", "Program", CellChangeTimes->{{3.4010193086396303`*^9, 3.4010193092333837`*^9}, { 3.401019380953415*^9, 3.40101941511032*^9}}, FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["Here is a larger version of the example:", "Text", CellChangeTimes->{{3.401019750351132*^9, 3.4010197695077496`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"i", " ", "j"}], ",", RowBox[{"{", RowBox[{"i", ",", "1000"}], "}"}], ",", RowBox[{"{", RowBox[{"j", ",", "1000"}], "}"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.4010197705858955`*^9, 3.401019777429777*^9}, { 3.401019823821293*^9, 3.401019827290109*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{ RowBox[{ RowBox[{"{", RowBox[{"i", ",", "#"}], "}"}], "&"}], "/@", RowBox[{"data", "[", RowBox[{"[", "i", "]"}], "]"}]}], ",", RowBox[{"{", RowBox[{"i", ",", RowBox[{"Length", "[", "data", "]"}]}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.401019779789197*^9, 3.401019790601905*^9}, { 3.401019936026572*^9, 3.401019961073928*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.15599999999999983`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.4010197911487904`*^9, {3.4010199304483395`*^9, 3.401019968292816*^9}, 3.4011112656639547`*^9}] }, Open ]], Cell["\<\ This speed seems fairly optimal. Some contortions are needed to convert the \ Table to Map, and as we've seen earlier, there isn't necessarily a large \ speed advantage in this conversion due to autocompilation.\ \>", "Text", CellChangeTimes->{{3.4010197983208027`*^9, 3.401019808586625*^9}, { 3.401019846274849*^9, 3.4010198991352386`*^9}}], Cell[CellGroupData[{ Cell["Map version", "Subsubsection", CellChangeTimes->{{3.4010203961760316`*^9, 3.401020397441681*^9}}], Cell["\<\ A straightforward conversion to a Map approach is actually slower:\ \>", "Text", CellChangeTimes->{{3.401111119941347*^9, 3.4011111310708933`*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{ RowBox[{"Function", "[", RowBox[{"i", ",", RowBox[{ RowBox[{ RowBox[{"{", RowBox[{"i", ",", "#"}], "}"}], "&"}], "/@", RowBox[{"data", "[", RowBox[{"[", "i", "]"}], "]"}]}]}], "]"}], "/@", RowBox[{"Range", "[", RowBox[{"Length", "[", "data", "]"}], "]"}]}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.401019628458167*^9, 3.401019656630583*^9}, { 3.401019921057534*^9, 3.4010199659958973`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.172`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.401019657208719*^9, {3.4010199226669407`*^9, 3.4010199698084707`*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{ 3.401019657208719*^9, {3.4010199226669407`*^9, 3.4010199698553467`*^9}}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["MathGroup", FontSlant->"Italic"], " suggestions" }], "Subsubsection", CellChangeTimes->{{3.4010204046136937`*^9, 3.401020407941882*^9}}], Cell[TextData[{ "This post elicited several responses on ", StyleBox["MathGroup", FontSlant->"Italic"], ". Before testing these responses, let's turn on unpack messages." }], "Text", CellChangeTimes->{{3.4010199954339623`*^9, 3.4010200474974623`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"SetSystemOptions", "[", RowBox[{"\"\\"", "\[Rule]", RowBox[{"\"\\"", "\[Rule]", "True"}]}], "]"}], ";"}]], "Input", CellChangeTimes->{{3.40102005026314*^9, 3.401020066091569*^9}}], Cell["\<\ We will see that most of the proposed solutions did some unpacking, and were \ consequently not competitive in timing. A few are presented below:\ \>", "Text", CellChangeTimes->{{3.4011111452711973`*^9, 3.401111210050966*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"MapIndexed", "[", RowBox[{ RowBox[{ RowBox[{"First", "@", RowBox[{"Outer", "[", RowBox[{"List", ",", "#2", ",", "#1"}], "]"}]}], "&"}], ",", "data"}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.4010179721299725`*^9, 3.401017972333119*^9}, { 3.4010180220664153`*^9, 3.401018022488182*^9}, {3.401018348552846*^9, 3.4010183506932926`*^9}, {3.4010187584514217`*^9, 3.4010187595764074`*^9}, { 3.4010200763105154`*^9, 3.4010200837325325`*^9}}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"punpack1\"\>"}], ":", " ", "\<\"Unpacking array to level \\!\\(TraditionalForm\\`1\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{ 3.401018352036931*^9, {3.4010187547014694`*^9, 3.4010187598732786`*^9}, 3.40102008410754*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"punpack1\"\>"}], ":", " ", "\<\"Unpacking array to level \\!\\(TraditionalForm\\`1\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{ 3.401018352036931*^9, {3.4010187547014694`*^9, 3.4010187598732786`*^9}, 3.4010200841387906`*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"punpack1\"\>"}], ":", " ", "\<\"Unpacking array to level \\!\\(TraditionalForm\\`1\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{ 3.401018352036931*^9, {3.4010187547014694`*^9, 3.4010187598732786`*^9}, 3.401020084170041*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"General", "::", "\<\"stop\"\>"}], ":", " ", "\<\"Further output of \ \\!\\(TraditionalForm\\`\\(Developer`FromPackedArray :: \ \\\"punpack1\\\"\\)\\) will be suppressed during this calculation. \ \\!\\(\\*ButtonBox[\\\"\[RightSkeleton]\\\", ButtonStyle->\\\"Link\\\", \ ButtonFrame->None, ButtonData:>\\\"paclet:ref/message/General/stop\\\", \ ButtonNote -> \\\"General::stop\\\"]\\)\"\>"}], TraditionalForm]], "Message", \ "MSG", CellChangeTimes->{ 3.401018352036931*^9, {3.4010187547014694`*^9, 3.4010187598732786`*^9}, 3.401020084185666*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.46799999999999964`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.401017999679669*^9, 3.4010180324075174`*^9, 3.4010183538805275`*^9, { 3.4010187550764647`*^9, 3.401018760373272*^9}, 3.401020084529423*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{ 3.401017999679669*^9, 3.4010180324075174`*^9, 3.4010183538805275`*^9, { 3.4010187550764647`*^9, 3.401018760373272*^9}, 3.4010200846388*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"MapIndexed", "[", RowBox[{ RowBox[{ RowBox[{"Thread", "[", RowBox[{"Append", "[", RowBox[{"#2", ",", "#1"}], "]"}], "]"}], "&"}], ",", "data"}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.401017983490511*^9, 3.40101798372491*^9}, { 3.401018023612894*^9, 3.4010180238315887`*^9}, {3.401018361145548*^9, 3.401018361192419*^9}, {3.401018765466957*^9, 3.401018766701316*^9}, { 3.401020091670185*^9, 3.4010200938264766`*^9}}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"punpack1\"\>"}], ":", " ", "\<\"Unpacking array to level \\!\\(TraditionalForm\\`1\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183625673046`*^9, 3.4010187670450616`*^9, 3.401020094107732*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"punpack1\"\>"}], ":", " ", "\<\"Unpacking array to level \\!\\(TraditionalForm\\`1\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183625673046`*^9, 3.4010187670450616`*^9, 3.401020094138983*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"punpack1\"\>"}], ":", " ", "\<\"Unpacking array to level \\!\\(TraditionalForm\\`1\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183625673046`*^9, 3.4010187670450616`*^9, 3.4010200941702332`*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"General", "::", "\<\"stop\"\>"}], ":", " ", "\<\"Further output of \ \\!\\(TraditionalForm\\`\\(Developer`FromPackedArray :: \ \\\"punpack1\\\"\\)\\) will be suppressed during this calculation. \ \\!\\(\\*ButtonBox[\\\"\[RightSkeleton]\\\", ButtonStyle->\\\"Link\\\", \ ButtonFrame->None, ButtonData:>\\\"paclet:ref/message/General/stop\\\", \ ButtonNote -> \\\"General::stop\\\"]\\)\"\>"}], TraditionalForm]], "Message", \ "MSG", CellChangeTimes->{3.4010183625673046`*^9, 3.4010187670450616`*^9, 3.401020094217109*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"unpack1\"\>"}], ":", " ", "\<\"Unpacking array.\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183625673046`*^9, 3.4010187670450616`*^9, 3.4010200942796106`*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"unpack1\"\>"}], ":", " ", "\<\"Unpacking array.\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183625673046`*^9, 3.4010187670450616`*^9, 3.401020094373362*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"unpack1\"\>"}], ":", " ", "\<\"Unpacking array.\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183625673046`*^9, 3.4010187670450616`*^9, 3.401020094420238*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"General", "::", "\<\"stop\"\>"}], ":", " ", "\<\"Further output of \ \\!\\(TraditionalForm\\`\\(Developer`FromPackedArray :: \\\"unpack1\\\"\\)\\) \ will be suppressed during this calculation. \\!\\(\\*ButtonBox[\\\"\ \[RightSkeleton]\\\", ButtonStyle->\\\"Link\\\", ButtonFrame->None, \ ButtonData:>\\\"paclet:ref/message/General/stop\\\", ButtonNote -> \ \\\"General::stop\\\"]\\)\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183625673046`*^9, 3.4010187670450616`*^9, 3.4010200944827394`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.5310000000000008`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401018001758006*^9, 3.4010180475442667`*^9, 3.401018363832824*^9, 3.401018767576305*^9, 3.4010200947171187`*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.401018001758006*^9, 3.4010180475442667`*^9, 3.401018363832824*^9, 3.401018767576305*^9, 3.401020094857746*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Thread", "/@", RowBox[{"Transpose", "[", RowBox[{"{", RowBox[{ RowBox[{"Range", "@", RowBox[{"Length", "@", "data"}]}], ",", "data"}], "}"}], "]"}]}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.401017991553837*^9, 3.4010179917882357`*^9}, { 3.4010180253312044`*^9, 3.4010180254874144`*^9}, {3.4010183675668883`*^9, 3.4010183677699966`*^9}, {3.4010187742480946`*^9, 3.401018775201207*^9}, { 3.4010201030454035`*^9, 3.401020112295581*^9}}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"punpack1\"\>"}], ":", " ", "\<\"Unpacking array to level \\!\\(TraditionalForm\\`1\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183682074604`*^9, 3.4010187756699514`*^9, 3.4010201129362183`*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"punpack1\"\>"}], ":", " ", "\<\"Unpacking array to level \\!\\(TraditionalForm\\`1\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183682074604`*^9, 3.4010187756699514`*^9, 3.4010201129518437`*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"punpack1\"\>"}], ":", " ", "\<\"Unpacking array to level \\!\\(TraditionalForm\\`1\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.4010183682074604`*^9, 3.4010187756699514`*^9, 3.401020112983094*^9}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"General", "::", "\<\"stop\"\>"}], ":", " ", "\<\"Further output of \ \\!\\(TraditionalForm\\`\\(Developer`FromPackedArray :: \ \\\"punpack1\\\"\\)\\) will be suppressed during this calculation. \ \\!\\(\\*ButtonBox[\\\"\[RightSkeleton]\\\", ButtonStyle->\\\"Link\\\", \ ButtonFrame->None, ButtonData:>\\\"paclet:ref/message/General/stop\\\", \ ButtonNote -> \\\"General::stop\\\"]\\)\"\>"}], TraditionalForm]], "Message", \ "MSG", CellChangeTimes->{3.4010183682074604`*^9, 3.4010187756699514`*^9, 3.4010201129987197`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.42199999999999954`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401018003414426*^9, 3.401018154829294*^9, 3.401018368848032*^9, 3.401018776169945*^9, 3.401020113358102*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.401018003414426*^9, 3.401018154829294*^9, 3.401018368848032*^9, 3.401018776169945*^9, 3.4010201135299797`*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Table + Transpose", "Subsubsection", CellChangeTimes->{{3.401020423957815*^9, 3.4010204265359898`*^9}}], Cell["\<\ We see that all of these suggestions were suboptimal because of unpacking. \ It's possible that some of the unpacking that's occuring should be \ eliminated, but I'll ignore that issue. Instead, an alternative to the original poster's query is to create a table \ of labels, and then to use Transpose. Creating a Table, and using Transpose \ are safe from unpacking:\ \>", "Text", CellChangeTimes->{{3.401020139577355*^9, 3.4010203134713187`*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"With", "[", RowBox[{ RowBox[{"{", RowBox[{"lab", "=", RowBox[{"Table", "[", RowBox[{"j", ",", RowBox[{"{", RowBox[{"i", ",", "1000"}], "}"}], ",", RowBox[{"{", RowBox[{"j", ",", "1000"}], "}"}]}], "]"}]}], "}"}], ",", RowBox[{"Transpose", "[", RowBox[{ RowBox[{"{", RowBox[{"lab", ",", "data"}], "}"}], ",", RowBox[{"{", RowBox[{"3", ",", "2", ",", "1"}], "}"}]}], "]"}]}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.401018729858038*^9, 3.4010187309986477`*^9}, { 3.4010188999808598`*^9, 3.401018913824603*^9}, {3.401111241364445*^9, 3.4011112573874702`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.06299999999999958`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.401018781951121*^9, {3.401018823169343*^9, 3.401018839762881*^9}, 3.401018914387107*^9, {3.4010203201745725`*^9, 3.401020325659053*^9}, 3.4011112712127843`*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{ 3.401018781951121*^9, {3.401018823169343*^9, 3.401018839762881*^9}, 3.401018914387107*^9, {3.4010203201745725`*^9, 3.401020325659053*^9}, 3.4011112712439575`*^9}] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["SparseArrays", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.4008575536905236`*^9, 3.4008575553005066`*^9}}], Cell["\<\ Sparse arrays were introduced in version 5, and are a very useful data \ structure. In this talk, the only feature of SparseArrays that I want to draw \ your attention to are the fact that conversions between sparse arrays and \ normal arrays are extremely quick, as long as the size of the normal matrix \ isn't too large.\ \>", "Text", CellChangeTimes->{{3.40092929540625*^9, 3.40092940840625*^9}}], Cell[CellGroupData[{ Cell["Vector conversions", "Subsection", CellChangeTimes->{{3.40092952071875*^9, 3.40092952475*^9}, {3.4009712155*^9, 3.4009712178125*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"3", ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400929421015625*^9, 3.400929430140625*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"sa", "=", RowBox[{ RowBox[{"SparseArray", "[", "data", "]"}], "//", "Timing"}]}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"Normal", "[", "sa", "]"}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.400929432609375*^9, 3.400929441359375*^9}, { 3.400929560875*^9, 3.40092956115625*^9}, 3.4011122231324444`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.03100000000000072`", ",", TagBox[ RowBox[{"SparseArray", "[", RowBox[{ InterpretationBox[ RowBox[{"\<\"<\"\>", "\[InvisibleSpace]", "748900", "\[InvisibleSpace]", "\<\">\"\>"}], SequenceForm["<", 748900, ">"], Editable->False], ",", RowBox[{"{", "1000000", "}"}]}], "]"}], False, Editable->False]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400929438234375*^9, 3.400929441859375*^9}, 3.4009295624375*^9, 3.4011122269711533`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.030999999999999583`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400929438234375*^9, 3.400929441859375*^9}, 3.4009295624375*^9, 3.4011122270494943`*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Matrix conversions", "Subsection", CellChangeTimes->{{3.400929541671875*^9, 3.4009295435*^9}, { 3.40097122084375*^9, 3.400971223453125*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"3", ",", RowBox[{"{", RowBox[{"1000", ",", "1000"}], "}"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400929468078125*^9, 3.400929479078125*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"sa", "=", RowBox[{"SparseArray", "[", "data", "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"Normal", "[", "sa", "]"}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.400929480453125*^9, 3.400929491484375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.03200000000000078`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.40092949190625*^9, 3.4011122511158495`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.015000000000000749`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.40092949190625*^9, 3.4011122511315174`*^9}] }, Open ]], Cell["\<\ The down side to the speed issue is that these conversions are somewhat \ expensive with memory usage.\ \>", "Text", CellChangeTimes->{{3.400929626078125*^9, 3.400929658765625*^9}, { 3.401112261519534*^9, 3.4011122628669996`*^9}}] }, Closed]], Cell[CellGroupData[{ Cell["SparseArray internal structure", "Subsection", CellChangeTimes->{{3.400929586625*^9, 3.400929600953125*^9}}], Cell["\<\ The reason that the speed of conversion is of interest in this talk, is that \ conversion produces a SparseArray object that contains data structures that \ can be exploited. Here is the input form of a SparseArray object:\ \>", "Text", CellChangeTimes->{{3.40092950371875*^9, 3.400929505125*^9}, { 3.4009296723125*^9, 3.400929709359375*^9}, {3.400929764*^9, 3.40092978409375*^9}, {3.40093369184375*^9, 3.400933710078125*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"SparseArray", "[", RowBox[{"RandomInteger", "[", RowBox[{"1", ",", "10"}], "]"}], "]"}], "//", "InputForm"}]], "Input", CellChangeTimes->{{3.400929791546875*^9, 3.400929801859375*^9}, { 3.400933022734375*^9, 3.4009330228125*^9}}], Cell["\<\ SparseArray[Automatic, {10}, 0, {1, {{0, 5}, {{1}, {2}, {4}, {8}, {10}}}, {1, \ 1, 1, 1, 1}}]\ \>", "Output", CellChangeTimes->{3.400933023265625*^9, 3.40093371803125*^9}] }, Open ]], Cell["\<\ Below, I label the various pieces of the SparseArray data structure:\ \>", "Text", CellChangeTimes->{{3.400933667953125*^9, 3.400933681671875*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"HoldForm", "[", "SparseArray", "]"}], "[", RowBox[{ OverscriptBox[ OverscriptBox["Automatic", "\[OverBracket]"], "\"\\""], ",", OverscriptBox[ OverscriptBox[ RowBox[{"{", "10", "}"}], "\[OverBracket]"], "\"\\""], ",", OverscriptBox[ OverscriptBox["0", "\[OverBracket]"], "\"\\""], ",", RowBox[{"{", RowBox[{"1", ",", RowBox[{"{", RowBox[{ OverscriptBox[ OverscriptBox[ RowBox[{"{", RowBox[{"0", ",", "5"}], "}"}], "\[OverBracket]"], RowBox[{"Column", "[", RowBox[{"{", RowBox[{"\"\\"", ",", "\"\\""}], "}"}], "]"}]], ",", OverscriptBox[ OverscriptBox[ RowBox[{"{", RowBox[{ RowBox[{"{", "2", "}"}], ",", RowBox[{"{", "5", "}"}], ",", RowBox[{"{", "6", "}"}], ",", RowBox[{"{", "9", "}"}], ",", RowBox[{"{", "10", "}"}]}], "}"}], "\[OverBracket]"], "\"\\""], ",", OverscriptBox[ OverscriptBox[ RowBox[{"{", RowBox[{"1", ",", "1", ",", "1", ",", "1", ",", "1"}], "}"}], "\[OverBracket]"], "\"\\""]}], "}"}]}], "}"}]}], "]"}], "//", "StandardForm"}]], "Input", CellChangeTimes->{{3.400933269625*^9, 3.40093332546875*^9}, { 3.400933362640625*^9, 3.400933632859375*^9}, {3.4011317618451223`*^9, 3.401131804395749*^9}}], Cell[BoxData[ RowBox[{ TagBox["SparseArray", HoldForm], "[", RowBox[{ OverscriptBox[ OverscriptBox["Automatic", "\[OverBracket]"], "\<\"not data\"\>"], ",", OverscriptBox[ OverscriptBox[ RowBox[{"{", "10", "}"}], "\[OverBracket]"], "\<\"dims\"\>"], ",", OverscriptBox[ OverscriptBox["0", "\[OverBracket]"], "\<\"default\"\>"], ",", RowBox[{"{", RowBox[{"1", ",", RowBox[{"{", RowBox[{ OverscriptBox[ OverscriptBox[ RowBox[{"{", RowBox[{"0", ",", "5"}], "}"}], "\[OverBracket]"], TagBox[GridBox[{ {"\<\"cumulative\"\>"}, {"\<\"row counts\"\>"} }, ColumnsEqual->False, GridBoxAlignment->{"Columns" -> {{Left}}}, GridBoxItemSize->{ "Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}, RowsEqual->False], "Column"]], ",", OverscriptBox[ OverscriptBox[ RowBox[{"{", RowBox[{ RowBox[{"{", "2", "}"}], ",", RowBox[{"{", "5", "}"}], ",", RowBox[{"{", "6", "}"}], ",", RowBox[{"{", "9", "}"}], ",", RowBox[{"{", "10", "}"}]}], "}"}], "\[OverBracket]"], "\<\"nonzero columns per row\"\>"], ",", OverscriptBox[ OverscriptBox[ RowBox[{"{", RowBox[{"1", ",", "1", ",", "1", ",", "1", ",", "1"}], "}"}], "\[OverBracket]"], "\<\"nonzero elements\"\>"]}], "}"}]}], "}"}]}], "]"}]], "Output", CellChangeTimes->{3.4011318061712875`*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["SparseArray construction", "Subsection", CellChangeTimes->{{3.4010141171197433`*^9, 3.4010141210568285`*^9}}], Cell["\<\ By knowing the internal structure of a sparse array, it is sometimes possible \ to construct sparse arrays more quickly by creating the sparse array \ structure rather than specifying rules. For example, suppose we want to \ create a SparseArray object with the integers 1 to n on the superdiagonal.\ \>", "Text", CellChangeTimes->{{3.4010141253985147`*^9, 3.4010142193364973`*^9}, { 3.4010142729220295`*^9, 3.4010143142665777`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"n", "=", RowBox[{"10", "^", "5"}]}], ";"}]], "Input", CellChangeTimes->{{3.4004547861386557`*^9, 3.4004547921376953`*^9}}], Cell["One method is to construct a list of rules:", "Text", CellChangeTimes->{{3.401014317685934*^9, 3.4010143426831474`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"SparseArray", "[", RowBox[{ RowBox[{"Table", "[", RowBox[{ RowBox[{ RowBox[{"{", RowBox[{"i", ",", RowBox[{"i", "+", "1"}]}], "}"}], "\[Rule]", "i"}], ",", RowBox[{"{", RowBox[{"i", ",", RowBox[{"n", "-", "1"}]}], "}"}]}], "]"}], ",", RowBox[{"{", RowBox[{"n", ",", "n"}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4004548523780556`*^9, 3.400454889606473*^9}, { 3.4010143597330894`*^9, 3.401014359811157*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.5780000000000052`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400454890621936*^9, 3.4010137256247163`*^9, 3.401014469855105*^9, 3.401132047330015*^9}] }, Open ]], Cell["A second method is to use a Band object:", "Text", CellChangeTimes->{{3.401014368492263*^9, 3.401014377985271*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"SparseArray", "[", RowBox[{ RowBox[{ RowBox[{"Band", "[", RowBox[{"{", RowBox[{"1", ",", "2"}], "}"}], "]"}], "\[Rule]", RowBox[{"Range", "[", RowBox[{"n", "-", "1"}], "]"}]}], ",", RowBox[{"{", RowBox[{"n", ",", "n"}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4004486313013554`*^9, 3.4004486322235966`*^9}, { 3.400453906319211*^9, 3.4004539599161797`*^9}, {3.4004543939037848`*^9, 3.4004544489367957`*^9}, {3.400454560330985*^9, 3.4004545605184913`*^9}, 3.4004547533938956`*^9, {3.4004547969494257`*^9, 3.4004547997614756`*^9}, { 3.4010144609710236`*^9, 3.4010144610959315`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.8910000000000003`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4004539390244846`*^9, 3.400453964541416*^9}, { 3.4004544004352436`*^9, 3.400454449780573*^9}, 3.40045456111226*^9, { 3.4004547381463356`*^9, 3.400454753846948*^9}, 3.400454803167181*^9, 3.401013731993395*^9, 3.401014471135412*^9}] }, Open ]], Cell["The direct construction of a SparseArray data structure:", "Text", CellChangeTimes->{{3.4010143890864697`*^9, 3.4010144196577024`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r3", "=", RowBox[{"SparseArray", "[", RowBox[{"Automatic", ",", RowBox[{"{", RowBox[{"n", ",", "n"}], "}"}], ",", "0", ",", RowBox[{"{", RowBox[{"1", ",", RowBox[{"{", RowBox[{ RowBox[{"Append", "[", RowBox[{ RowBox[{"Range", "[", RowBox[{"0", ",", RowBox[{"n", "-", "1"}]}], "]"}], ",", RowBox[{"n", "-", "1"}]}], "]"}], ",", RowBox[{"List", "/@", RowBox[{"Range", "[", RowBox[{"2", ",", "n"}], "]"}]}]}], "}"}], ",", RowBox[{"Range", "[", RowBox[{"n", "-", "1"}], "]"}]}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4004544622653475`*^9, 3.400454563549838*^9}, { 3.4004546479732656`*^9, 3.4004546507853155`*^9}, 3.400454762236231*^9, { 3.4004548061979456`*^9, 3.4004548185397205`*^9}, 3.401014462985165*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.016000000000000153`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4004545412522497`*^9, 3.4004545639092245`*^9}, 3.400454651613308*^9, 3.400454762548681*^9, 3.4004548190240183`*^9, 3.401013741734649*^9, {3.4010144654677114`*^9, 3.401014471354001*^9}}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r1", "===", "r2", "===", "r3"}]], "Input", CellChangeTimes->{{3.4004546547690535`*^9, 3.4004546583778505`*^9}, 3.4004547663449483`*^9, {3.4004548947306533`*^9, 3.4004548958554735`*^9}, { 3.4010137851546044`*^9, 3.401013785907552*^9}, 3.401131880821783*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400454656081343*^9, 3.4004546586590557`*^9}, 3.400454766860491*^9, 3.4004548233045835`*^9, 3.4004548961835456`*^9, 3.401013743805254*^9, {3.401013786252652*^9, 3.401013808621622*^9}, 3.4010144718692465`*^9}] }, Open ]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["SparseArray examples", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.40085755866115*^9, 3.400857561881115*^9}, {3.40092926428125*^9, 3.40092927696875*^9}, { 3.400934597703125*^9, 3.400934598265625*^9}, {3.400934934640625*^9, 3.400934942375*^9}, {3.401013920670105*^9, 3.4010139240625343`*^9}}], Cell["\<\ Here are a couple useful utility functions taking advantage of the quick \ conversion between normal and sparse vectors.\ \>", "Text", CellChangeTimes->{{3.401014490074588*^9, 3.401014517457143*^9}}], Cell["Extract the nonzero entries of a vector:", "Text", CellChangeTimes->{{3.400934667375*^9, 3.400934689109375*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"NonzeroEntries", "[", "data_", "]"}], ":=", RowBox[{ RowBox[{"SparseArray", "[", "data", "]"}], "/.", RowBox[{ RowBox[{"SparseArray", "[", RowBox[{"_", ",", "_", ",", "_", ",", "x_"}], "]"}], "\[RuleDelayed]", RowBox[{"x", "[", RowBox[{"[", "3", "]"}], "]"}]}]}]}]], "Input", CellChangeTimes->{{3.400934718046875*^9, 3.400934759703125*^9}}], Cell["Extract the nonzero positions of a vector:", "Text", CellChangeTimes->{{3.400934811203125*^9, 3.4009348215*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"NonzeroPositions", "[", "data_", "]"}], ":=", RowBox[{ RowBox[{"SparseArray", "[", "data", "]"}], "/.", RowBox[{ RowBox[{"SparseArray", "[", RowBox[{"_", ",", "_", ",", "_", ",", "x_"}], "]"}], "\[RuleDelayed]", RowBox[{"Flatten", "[", RowBox[{"x", "[", RowBox[{"[", RowBox[{"2", ",", "2"}], "]"}], "]"}], "]"}]}]}]}]], "Input", CellChangeTimes->{{3.40093482275*^9, 3.400934842390625*^9}}], Cell[CellGroupData[{ Cell["Simple example", "Subsection", CellChangeTimes->{{3.40093497428125*^9, 3.400934977890625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"1", ",", "10"}], "]"}]}]], "Input", CellChangeTimes->{{3.400934885140625*^9, 3.4009348920625*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "0", ",", "0", ",", "1", ",", "0", ",", "1", ",", "0", ",", "1", ",", "0", ",", "1", ",", "0"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400934892859375*^9, 3.401112385853696*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"NonzeroPositions", "[", "data", "]"}]], "Input", CellChangeTimes->{{3.400934850234375*^9, 3.400934852796875*^9}, { 3.400934894734375*^9, 3.40093489521875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"3", ",", "5", ",", "7", ",", "9"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.4009348955625*^9, {3.4011123868768144`*^9, 3.401112394364184*^9}}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Larger examples", "Subsection", CellChangeTimes->{{3.400934996890625*^9, 3.4009349991875*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{"2", ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400935021953125*^9, 3.400935030796875*^9}, { 3.400935112953125*^9, 3.400935113125*^9}, {3.400935213203125*^9, 3.400935213375*^9}}], Cell["Using NonzeroPositions:", "Text", CellChangeTimes->{{3.4009350374375*^9, 3.400935057203125*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"NonzeroPositions", "[", "data", "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400935059328125*^9, 3.40093506653125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.06299999999996003`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400935067953125*^9, 3.4009351286875*^9, 3.400935215484375*^9}] }, Open ]], Cell["Using Position:", "Text", CellChangeTimes->{{3.400935069765625*^9, 3.40093507278125*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Position", "[", RowBox[{"data", ",", RowBox[{"Except", "[", "0", "]"}], ",", "1", ",", RowBox[{"Heads", "\[Rule]", "False"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400935073765625*^9, 3.400935082828125*^9}, { 3.40093512159375*^9, 3.400935124046875*^9}, {3.400935187140625*^9, 3.400935208015625*^9}}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"unpack\"\>"}], ":", " ", "\<\"Unpacking array in call to \ \\!\\(TraditionalForm\\`Position\\).\"\>"}], TraditionalForm]], "Message", \ "MSG", CellChangeTimes->{ 3.400935084609375*^9, {3.400935115734375*^9, 3.400935129984375*^9}, { 3.40093518775*^9, 3.400935217390625*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.046999999999997`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.40093508596875*^9, {3.400935116109375*^9, 3.40093513*^9}, { 3.400935187765625*^9, 3.40093521846875*^9}}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r1", "===", RowBox[{"r2", "\[LeftDoubleBracket]", RowBox[{"All", ",", "1"}], "\[RightDoubleBracket]"}]}]], "Input", CellChangeTimes->{{3.4009350871875*^9, 3.400935090484375*^9}, { 3.400935142875*^9, 3.400935151671875*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.4009351024375*^9, 3.40093515278125*^9}, { 3.400935202078125*^9, 3.400935219875*^9}}] }, Open ]], Cell["\<\ Alternately, one could speed up the use of Position by Unitizing and then \ matching with 1:\ \>", "Text", CellChangeTimes->{{3.400935290359375*^9, 3.400935310421875*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r3", "=", RowBox[{"Position", "[", RowBox[{ RowBox[{"Unitize", "[", "data", "]"}], ",", "1"}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.40093523140625*^9, 3.400935241703125*^9}}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"unpack\"\>"}], ":", " ", "\<\"Unpacking array in call to \ \\!\\(TraditionalForm\\`Position\\).\"\>"}], TraditionalForm]], "Message", \ "MSG", CellChangeTimes->{3.40093524209375*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.9529999999999601`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400935243984375*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r1", "===", RowBox[{"r3", "\[LeftDoubleBracket]", RowBox[{"All", ",", "1"}], "\[RightDoubleBracket]"}]}]], "Input", CellChangeTimes->{{3.40093524434375*^9, 3.400935253046875*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.40093525415625*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["MathGroup", FontSlant->"Italic"], " example" }], "Subsection", CellChangeTimes->{{3.400933818859375*^9, 3.400933822125*^9}, { 3.401013965736499*^9, 3.4010139681485467`*^9}}], Cell["Matt Pharr wrote:", "Text", CellChangeTimes->{{3.40119762953125*^9, 3.4011976334375*^9}}], Cell["\<\ I have a sparse matrix, roughly 200k by 200k, with about .01% of the entries non zero, represented with SparseArray. I'd like to reasonably efficiently generate a 200k-long list where each element is the number of non-zero entries in the corresponding row of the matrix. I haven't been able to figure out a quick way to do this. \ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["\<\ Paul Abbott suggested the use of applying Differences to the right piece of \ the SparseArray data structure.\ \>", "Text", CellChangeTimes->{{3.40119754140625*^9, 3.401197570328125*^9}}], Cell[CellGroupData[{ Cell["Illustrative example", "Subsubsection", CellChangeTimes->{{3.401014036230547*^9, 3.4010140398252764`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"sa", "=", RowBox[{"SparseArray", "[", RowBox[{"RandomInteger", "[", RowBox[{"1", ",", RowBox[{"{", RowBox[{"10", ",", "10"}], "}"}]}], "]"}], "]"}]}]], "Input", CellChangeTimes->{{3.400933895578125*^9, 3.400933929921875*^9}, 3.400934229546875*^9}], Cell[BoxData[ FormBox[ TagBox[ RowBox[{"SparseArray", "[", RowBox[{ InterpretationBox[ RowBox[{"\<\"<\"\>", "\[InvisibleSpace]", "52", "\[InvisibleSpace]", "\<\">\"\>"}], SequenceForm["<", 52, ">"], Editable->False], ",", RowBox[{"{", RowBox[{"10", ",", "10"}], "}"}]}], "]"}], False, Editable->False], TraditionalForm]], "Output", CellChangeTimes->{3.40093393221875*^9, 3.40093422996875*^9, 3.401132170082653*^9}] }, Open ]], Cell["\<\ Paul Abbott suggested the use SparseArrayFrom the previous description, we \ know that we are interested in the \"cumulative row counts\" field of the \ data structure. A naive application of Part will not help here, as Part has \ special code to handle SparseArray objects:\ \>", "Text", CellChangeTimes->{{3.40093393815625*^9, 3.4009340038125*^9}, { 3.4011321775631905`*^9, 3.401132186146123*^9}, {3.401197524859375*^9, 3.40119753746875*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"sa", "[", RowBox[{"[", "4", "]"}], "]"}]], "Input", CellChangeTimes->{{3.400934005296875*^9, 3.4009340064375*^9}}], Cell[BoxData[ FormBox[ RowBox[{ RowBox[{"Developer`FromPackedArray", "::", "\<\"unpack\"\>"}], ":", " ", "\<\"Unpacking array in call to \ \\!\\(TraditionalForm\\`AtomQ\\).\"\>"}], TraditionalForm]], "Message", "MSG", CellChangeTimes->{3.400934006671875*^9, 3.4009342319375*^9}], Cell[BoxData[ FormBox[ TagBox[ RowBox[{"SparseArray", "[", RowBox[{ InterpretationBox[ RowBox[{"\<\"<\"\>", "\[InvisibleSpace]", "6", "\[InvisibleSpace]", "\<\">\"\>"}], SequenceForm["<", 6, ">"], Editable->False], ",", RowBox[{"{", "10", "}"}]}], "]"}], False, Editable->False], TraditionalForm]], "Output", CellChangeTimes->{3.4009340066875*^9, 3.400934231953125*^9}] }, Open ]], Cell["\<\ Here are two possibilities for extracting the cumulative row element count \ data:\ \>", "Text", CellChangeTimes->{{3.400934060625*^9, 3.400934068859375*^9}, { 3.400934160734375*^9, 3.400934168359375*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"rowcount", "=", RowBox[{"Block", "[", RowBox[{ RowBox[{"{", RowBox[{"SparseArray", "=", "List"}], "}"}], ",", RowBox[{"sa", "[", RowBox[{"[", RowBox[{"4", ",", "2", ",", "1"}], "]"}], "]"}]}], "]"}]}]], "Input", CellChangeTimes->{{3.4009340748125*^9, 3.400934111953125*^9}, { 3.400934174328125*^9, 3.400934175734375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "0", ",", "4", ",", "10", ",", "18", ",", "24", ",", "29", ",", "37", ",", "42", ",", "48", ",", "55", ",", "62"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.400934113890625*^9, 3.400934182375*^9, 3.400934233671875*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"rowcount", "=", RowBox[{"sa", "/.", RowBox[{ RowBox[{"SparseArray", "[", RowBox[{"_", ",", "_", ",", "_", ",", "x_"}], "]"}], "\[RuleDelayed]", RowBox[{"x", "[", RowBox[{"[", RowBox[{"2", ",", "1"}], "]"}], "]"}]}]}]}]], "Input", CellChangeTimes->{{3.400934115796875*^9, 3.4009341429375*^9}, { 3.4009341786875*^9, 3.40093418034375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "0", ",", "4", ",", "10", ",", "18", ",", "24", ",", "29", ",", "37", ",", "42", ",", "48", ",", "55", ",", "62"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.40093412828125*^9, 3.400934143296875*^9}, 3.40093418309375*^9, 3.4009342344375*^9}] }, Open ]], Cell["The row counts can now be obtained using Differences:", "Text", CellChangeTimes->{{3.400934188484375*^9, 3.400934208375*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Differences", "[", "rowcount", "]"}]], "Input", CellChangeTimes->{{3.400934209625*^9, 3.400934214328125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "4", ",", "6", ",", "8", ",", "6", ",", "5", ",", "8", ",", "5", ",", "6", ",", "7", ",", "7"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4009342151875*^9, 3.40093423553125*^9}}] }, Open ]], Cell["\<\ Since we have a matrix of 0s and 1s, we can also use Total to compare:\ \>", "Text", CellChangeTimes->{{3.40093426884375*^9, 3.40093428778125*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Total", "[", RowBox[{"sa", ",", RowBox[{"{", "2", "}"}]}], "]"}]], "Input", CellChangeTimes->{{3.400934241921875*^9, 3.400934249*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{ "4", ",", "6", ",", "8", ",", "6", ",", "5", ",", "8", ",", "5", ",", "6", ",", "7", ",", "7"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.40093424396875*^9, 3.40093424946875*^9}}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Larger example", "Subsubsection", CellChangeTimes->{{3.400934310484375*^9, 3.400934315515625*^9}}], Cell["Here is a larger sparse array:", "Text", CellChangeTimes->{{3.400934535109375*^9, 3.40093453990625*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"SparseArray", "[", RowBox[{"RandomInteger", "[", RowBox[{"2", ",", RowBox[{"{", RowBox[{"2000", ",", "2000"}], "}"}]}], "]"}], "]"}]}], ";"}]], "Input",\ CellChangeTimes->{{3.4009343183125*^9, 3.400934344421875*^9}, { 3.400934396265625*^9, 3.400934438546875*^9}}], Cell["\<\ We compare the data structure extraction procedure with Total + Clip:\ \>", "Text", CellChangeTimes->{{3.40093454365625*^9, 3.4009345673125*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Block", "[", RowBox[{ RowBox[{"{", RowBox[{"SparseArray", "=", "List"}], "}"}], ",", RowBox[{"Differences", "[", RowBox[{"data", "[", RowBox[{"[", RowBox[{"4", ",", "2", ",", "1"}], "]"}], "]"}], "]"}]}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Total", "[", RowBox[{ RowBox[{"Clip", "[", RowBox[{"data", ",", RowBox[{"{", RowBox[{"0", ",", "0"}], "}"}], ",", RowBox[{"{", RowBox[{"1", ",", "1"}], "}"}]}], "]"}], ",", RowBox[{"{", "2", "}"}]}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "===", "r2"}]}], "Input", CellChangeTimes->{{3.40093435471875*^9, 3.400934410921875*^9}, { 3.400934443375*^9, 3.400934446125*^9}, {3.4009344971875*^9, 3.40093450253125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400934388390625*^9, 3.400934446515625*^9}, 3.40093450340625*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.26500000000002094`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400934388390625*^9, 3.400934446515625*^9}, 3.4009345036875*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.400934388390625*^9, 3.400934446515625*^9}, 3.40093450375*^9}] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["MathGroup", FontSlant->"Italic", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]], StyleBox[": Clip + NonzeroPosition examples", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]] }], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.400857547422533*^9, 3.400857549751537*^9}, {3.40097442796875*^9, 3.40097443228125*^9}, { 3.401204641390625*^9, 3.401204648078125*^9}}], Cell["\<\ Most of the examples I will present can be summarized with the following \ procedure. Construct some integer packed array structures representing a \ certain aspect of the data. Manipulate these packed arrays, making sure that \ they don't unpack, and produce a result.\ \>", "Text", CellChangeTimes->{{3.4011200302646675`*^9, 3.401120046430414*^9}, { 3.4011201347142267`*^9, 3.4011201430482187`*^9}, {3.401120238080838*^9, 3.401120278306055*^9}, {3.4011219452058334`*^9, 3.401121946111915*^9}}], Cell[CellGroupData[{ Cell["Extract 2D points in the third quadrant", "Subsection", CellChangeTimes->{{3.4010692530078797`*^9, 3.4010692756546636`*^9}}], Cell["Matt wrote:", "Text", CellChangeTimes->{{3.4011982116875*^9, 3.40119821325*^9}}], Cell["\<\ After I posted my earlier message (the one entitled \"'Good' or 'Proper' \ Mathematica coding habits question\"), I decided to try some timings for the last code sample I had a question on (the one trying to \ extract all sublists where each element of a sublist had to be \ negative).Here' s what I found :\ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["\<\ Matt presented some variations on code to extract data points that were in \ the third quadrant.\ \>", "Text", CellChangeTimes->{{3.40119833925*^9, 3.40119837159375*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"L", "=", RowBox[{"RandomReal", "[", RowBox[{ RowBox[{"NormalDistribution", "[", RowBox[{"0", ",", "1"}], "]"}], ",", RowBox[{"{", RowBox[{ SuperscriptBox["10", "6"], ",", "2"}], "}"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400876187495345*^9, 3.4008761877278705`*^9}, { 3.4008780749797764`*^9, 3.4008780842950773`*^9}, {3.401041672744898*^9, 3.401041679432526*^9}, {3.4010692213524723`*^9, 3.401069233999003*^9}, { 3.401132326055797*^9, 3.4011323264652576`*^9}, {3.401133139396037*^9, 3.401133149814459*^9}}], Cell[BoxData[ RowBox[{"Graphics", "[", RowBox[{ RowBox[{"{", RowBox[{"Point", "[", "L", "]"}], "}"}], ",", RowBox[{"Axes", "\[Rule]", "True"}], ",", RowBox[{"PlotRange", "\[Rule]", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"-", "6"}], ",", "6"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"-", "6"}], ",", "6"}], "}"}]}], "}"}]}]}], "]"}]], "Input", CellChangeTimes->{{3.4011322718337116`*^9, 3.40113228035365*^9}, { 3.401133039108283*^9, 3.401133109848452*^9}, {3.401133163695244*^9, 3.40113319700286*^9}, {3.4011332829979258`*^9, 3.4011333185302277`*^9}}], Cell["The most straightforward possibility is:", "Text", CellChangeTimes->{{3.401042306178934*^9, 3.401042315491613*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Cases", "[", RowBox[{"L", ",", RowBox[{"{", RowBox[{ RowBox[{"_", "?", "Negative"}], ",", RowBox[{"_", "?", "Negative"}]}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{3.401042321272974*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"3.297000000000006`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401042324694915*^9, 3.4010428345328283`*^9, 3.4011299584757867`*^9, 3.4011323636159697`*^9, 3.401132897391094*^9, 3.4011332183723755`*^9}] }, Open ]], Cell["Some other posted responses were:", "Text", CellChangeTimes->{{3.401041684479498*^9, 3.4010416881514435`*^9}, { 3.4010423276949725`*^9, 3.4010423326950684`*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"Pick", "[", RowBox[{"L", ",", RowBox[{ RowBox[{ RowBox[{"Plus", "@@", RowBox[{"Sign", "@", "#"}]}], "&"}], "/@", "L"}], ",", RowBox[{"-", "2"}]}], "]"}], ";"}], "//", "Timing"}], "\n", RowBox[{ RowBox[{ RowBox[{"Pick", "[", RowBox[{"L", ",", RowBox[{"Total", "@", RowBox[{"Transpose", "@", RowBox[{"Sign", "@", "L"}]}]}], ",", RowBox[{"-", "2"}]}], "]"}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.401041698917275*^9, 3.4010417009641895`*^9}, 3.401042335335744*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.8130000000000053`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4010417076361923`*^9, 3.4010423381014223`*^9, 3.4011299609065323`*^9, 3.401132899413169*^9, 3.4011332211923995`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.5630000000000022`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4010417076361923`*^9, 3.4010423381014223`*^9, 3.4011299609065323`*^9, 3.401132899413169*^9, 3.4011332223204093`*^9}] }, Open ]], Cell["\<\ We can do this much more quickly by applying Sign, then adding the pairs, \ finally clipping to -2.\ \>", "Text", CellChangeTimes->{{3.4010417247146454`*^9, 3.4010417415587187`*^9}, { 3.40104181924771*^9, 3.4010418695143003`*^9}, {3.401042942113019*^9, 3.401042946394351*^9}, {3.4010684431563225`*^9, 3.401068443877552*^9}, 3.401143006296875*^9}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Style", "[", RowBox[{ RowBox[{"Row", "[", RowBox[{"{", RowBox[{ RowBox[{"L", "[", RowBox[{"[", RowBox[{";;", "10"}], "]"}], "]"}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Sign\)]\) \ \>\"", ",", RowBox[{"Sign", "[", RowBox[{"L", "[", RowBox[{"[", RowBox[{";;", "10"}], "]"}], "]"}], "]"}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Total\)]\) \ \>\"", ",", RowBox[{"List", "/@", RowBox[{"Total", "[", RowBox[{ RowBox[{"Sign", "[", RowBox[{"L", "[", RowBox[{"[", RowBox[{";;", "10"}], "]"}], "]"}], "]"}], ",", RowBox[{"{", "2", "}"}]}], "]"}]}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Clip\)]\) \ \>\"", ",", RowBox[{"Clip", "[", RowBox[{ RowBox[{"List", "/@", RowBox[{"Total", "[", RowBox[{ RowBox[{"Sign", "[", RowBox[{"L", "[", RowBox[{"[", RowBox[{";;", "10"}], "]"}], "]"}], "]"}], ",", RowBox[{"{", "2", "}"}]}], "]"}]}], ",", RowBox[{"{", RowBox[{ RowBox[{"-", "2"}], ",", RowBox[{"-", "2"}]}], "}"}], ",", RowBox[{"{", RowBox[{"0", ",", "0"}], "}"}]}], "]"}]}], "}"}], "]"}], ",", RowBox[{"ScriptSizeMultipliers", "\[Rule]", "1"}]}], "]"}]], "Input", CellChangeTimes->{{3.4011323844211664`*^9, 3.401132483280192*^9}, { 3.401132517886344*^9, 3.401132687628244*^9}, {3.4011327281951437`*^9, 3.401132786521819*^9}}], Cell[BoxData[ FormBox[ StyleBox[ InterpretationBox[ RowBox[{ RowBox[{"(", "\[NoBreak]", GridBox[{ { RowBox[{"-", "2.2300164313073134`"}], "6.469604817348862`"}, { RowBox[{"-", "1.668928403584422`"}], "3.75317976860321`"}, { RowBox[{"-", "5.617801969803362`"}], "4.824387718632002`"}, { RowBox[{"-", "2.0494285677744672`"}], "8.758246489029911`"}, {"7.758894691877614`", RowBox[{"-", "9.978564596342562`"}]}, {"4.293494562430418`", "2.8884901473114954`"}, { RowBox[{"-", "3.7645065233321207`"}], "5.616825072101901`"}, { RowBox[{"-", "6.186782358578489`"}], RowBox[{"-", "1.4415239081183628`"}]}, { RowBox[{"-", "0.5636753769574154`"}], RowBox[{"-", "7.062830906009201`"}]}, {"3.794169664484084`", "2.6138189876869866`"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(Sign\\)]\\) \"\>", "\[InvisibleSpace]", RowBox[{"(", "\[NoBreak]", GridBox[{ { RowBox[{"-", "1"}], "1"}, { RowBox[{"-", "1"}], "1"}, { RowBox[{"-", "1"}], "1"}, { RowBox[{"-", "1"}], "1"}, {"1", RowBox[{"-", "1"}]}, {"1", "1"}, { RowBox[{"-", "1"}], "1"}, { RowBox[{"-", "1"}], RowBox[{"-", "1"}]}, { RowBox[{"-", "1"}], RowBox[{"-", "1"}]}, {"1", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(Total\\)]\\) \"\>", "\[InvisibleSpace]", RowBox[{"(", "\[NoBreak]", GridBox[{ {"0"}, {"0"}, {"0"}, {"0"}, {"0"}, {"2"}, {"0"}, { RowBox[{"-", "2"}]}, { RowBox[{"-", "2"}]}, {"2"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(Clip\\)]\\) \"\>", "\[InvisibleSpace]", RowBox[{"(", "\[NoBreak]", GridBox[{ {"0"}, {"0"}, {"0"}, {"0"}, {"0"}, {"0"}, {"0"}, { RowBox[{"-", "2"}]}, { RowBox[{"-", "2"}]}, {"0"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}]}], Row[{{{-2.2300164313073134`, 6.469604817348862}, {-1.668928403584422, 3.75317976860321}, {-5.617801969803362, 4.824387718632002}, {-2.0494285677744672`, 8.758246489029911}, { 7.758894691877614, -9.978564596342562}, {4.293494562430418, 2.8884901473114954`}, {-3.7645065233321207`, 5.616825072101901}, {-6.186782358578489, -1.4415239081183628`}, \ {-0.5636753769574154, -7.062830906009201}, {3.794169664484084, 2.6138189876869866`}}, " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Sign\)]\) ", \ {{-1, 1}, {-1, 1}, {-1, 1}, {-1, 1}, {1, -1}, {1, 1}, {-1, 1}, {-1, -1}, {-1, -1}, {1, 1}}, " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Total\)]\) ", \ {{0}, {0}, {0}, {0}, {0}, {2}, {0}, {-2}, {-2}, {2}}, " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Clip\)]\) ", {{ 0}, {0}, {0}, {0}, {0}, {0}, {0}, {-2}, {-2}, {0}}}]], StripOnInput->False, ScriptSizeMultipliers->1], TraditionalForm]], "Output", CellChangeTimes->{{3.401132475542853*^9, 3.4011324836882467`*^9}, { 3.401132524682019*^9, 3.4011325750767374`*^9}, {3.4011326226307697`*^9, 3.4011326356571217`*^9}, 3.401132688051469*^9, {3.4011327676177692`*^9, 3.401132787352594*^9}}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "tmp", "}"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"tmp", "=", RowBox[{"Sign", "[", "L", "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"tmp", "=", RowBox[{"Total", "[", RowBox[{"tmp", ",", RowBox[{"{", "2", "}"}]}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"tmp", "=", RowBox[{"Clip", "[", RowBox[{"tmp", ",", RowBox[{"{", RowBox[{ RowBox[{"-", "2"}], ",", RowBox[{"-", "2"}]}], "}"}], ",", RowBox[{"{", RowBox[{"0", ",", "0"}], "}"}]}], "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"tmp", "=", RowBox[{"NonzeroPositions", "[", "tmp", "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"L", "[", RowBox[{"[", "tmp", "]"}], "]"}]}]}], "\[IndentingNewLine]", "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4010419785476437`*^9, 3.4010420454708033`*^9}, { 3.4010420844715524`*^9, 3.401042085221567*^9}, {3.401042140285124*^9, 3.4010421858641243`*^9}, {3.4010422173334785`*^9, 3.401042218380374*^9}, { 3.4010422511310024`*^9, 3.401042251209129*^9}, {3.401042460978781*^9, 3.401042465353865*^9}, {3.40104253565209*^9, 3.4010425392459087`*^9}, { 3.401042580590453*^9, 3.4010426004814596`*^9}, {3.401042820079426*^9, 3.401042821985712*^9}, {3.401042906940469*^9, 3.4010429107217913`*^9}, { 3.401129941476152*^9, 3.4011299445145836`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.14099999999999335`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.401042046627076*^9, 3.4010420890185146`*^9}, { 3.4010421321755934`*^9, 3.401042188442299*^9}, {3.4010422192241397`*^9, 3.401042222427326*^9}, {3.401042253521673*^9, 3.4010422601468005`*^9}, { 3.401042467353904*^9, 3.401042488463684*^9}, {3.401042541386575*^9, 3.401042602262744*^9}, 3.4010428238607483`*^9, {3.4010429127218294`*^9, 3.4010429182531857`*^9}, {3.401129946540204*^9, 3.401129981489958*^9}, { 3.401132879098369*^9, 3.4011329013725443`*^9}, 3.4011332254851027`*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r1", "===", "r2"}]], "Input", CellChangeTimes->{{3.400878092203706*^9, 3.400878104676206*^9}, { 3.4010420472677135`*^9, 3.4010420475802193`*^9}, {3.4010420947217493`*^9, 3.401042094815501*^9}, {3.40104219162986*^9, 3.4010421917079864`*^9}, { 3.401042262162464*^9, 3.4010422622405906`*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{{3.4008780972677283`*^9, 3.4008781186335287`*^9}, 3.4008781691174593`*^9, 3.4008782087231193`*^9, 3.4010420951905084`*^9, 3.4010421920829935`*^9, 3.4010422252711306`*^9, 3.4010422626155977`*^9, { 3.401042565715167*^9, 3.4010425900437593`*^9}, {3.4010428255326557`*^9, 3.401042836548492*^9}, 3.401042913190589*^9, 3.401129971860467*^9, 3.401132901780094*^9, 3.401133227882123*^9}] }, Open ]], Cell["Let's check that r2 is indeed all in the third quadrant:", "Text", CellChangeTimes->{{3.40114313684375*^9, 3.401143151484375*^9}}], Cell[BoxData[ RowBox[{"Graphics", "[", RowBox[{ RowBox[{"Point", "[", "r2", "]"}], ",", RowBox[{"Axes", "\[Rule]", "True"}], ",", RowBox[{"PlotRange", "\[Rule]", RowBox[{"{", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"-", "6"}], ",", "6"}], "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"-", "6"}], ",", "6"}], "}"}]}], "}"}]}]}], "]"}]], "Input", CellChangeTimes->{{3.401132853187594*^9, 3.401132856792844*^9}, { 3.4011329076111937`*^9, 3.4011330149483805`*^9}, {3.401133244238262*^9, 3.4011332775458794`*^9}, {3.401133337346055*^9, 3.40113334069875*^9}}] }, Closed]], Cell[CellGroupData[{ Cell["SplitAt", "Subsection", CellChangeTimes->{{3.4010696383179183`*^9, 3.4010696395521593`*^9}}], Cell["Robert Brambilla writes:", "Text", CellChangeTimes->{{3.401069660940457*^9, 3.401069671486184*^9}}], Cell["\<\ I have a list (very long, thousands, and unsorted) of numbers r = {n1, n2 \ ...} and for a given a number m I want to split it in the two sublists (unsorted, same order) u = {elements < m], v = {elements > m}.\ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["Probably the simplest approach is to use Select (or Cases):", "Text", CellChangeTimes->{{3.4010697020451117`*^9, 3.401069724776722*^9}, { 3.4010698222023735`*^9, 3.4010698262643795`*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"10", ",", SuperscriptBox["10", "6"]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.401069731229062*^9, 3.401069741524685*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"{", RowBox[{ RowBox[{"Cases", "[", RowBox[{"data", ",", RowBox[{"x_", "/;", RowBox[{"x", "<", "3"}]}]}], "]"}], ",", RowBox[{"Cases", "[", RowBox[{"data", ",", RowBox[{"x_", "/;", RowBox[{"x", "\[GreaterEqual]", "3"}]}]}], "]"}]}], "}"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.401069746414716*^9, 3.401069754882436*^9}, { 3.401069838684744*^9, 3.4010698585885735`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"4.531000000000003`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4010698644784822`*^9, 3.4011300327455916`*^9}] }, Open ]], Cell["\<\ Now, a much faster approach will rely on UnitStep to convert data to 0s and \ 1s, and then NonzeroPositions to extract the 1s (or 0s) as appropriate:\ \>", "Text", CellChangeTimes->{{3.401070130054616*^9, 3.4010701722992077`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Style", "[", RowBox[{ RowBox[{"Row", "[", RowBox[{"{", RowBox[{ RowBox[{"List", "/@", RowBox[{"data", "[", RowBox[{"[", RowBox[{";;", "10"}], "]"}], "]"}]}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(subtract\\\ \ \\\ 3\)]\) \>\"", ",", RowBox[{ RowBox[{"List", "/@", RowBox[{"data", "[", RowBox[{"[", RowBox[{";;", "10"}], "]"}], "]"}]}], "-", "3"}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \ \(UnitStep\)]\) \>\"", ",", RowBox[{"List", "/@", RowBox[{"UnitStep", "[", RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{";;", "10"}], "]"}], "]"}], "-", "3"}], "]"}]}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \ \(NonzeroPositions\)]\) \>\""}], "}"}], "]"}], ",", RowBox[{"ScriptSizeMultipliers", "\[Rule]", "1"}]}], "]"}]], "Input", CellChangeTimes->{{3.401143795359375*^9, 3.40114390403125*^9}, { 3.40114394021875*^9, 3.401143971875*^9}, {3.40117999984375*^9, 3.401180004890625*^9}}], Cell[BoxData[ FormBox[ StyleBox[ InterpretationBox[ RowBox[{ RowBox[{"(", "\[NoBreak]", GridBox[{ {"8.93842619743987`"}, {"5.680541827253364`"}, {"0.7334931944794687`"}, {"5.743772926278452`"}, {"9.331319473713119`"}, {"5.423379831062471`"}, {"9.070631049118338`"}, {"2.7369754038378913`"}, {"9.217716552327195`"}, {"6.07966890112616`"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(subtract\\\\ \\\\ 3\\)]\\) \"\>", "\[InvisibleSpace]", RowBox[{"(", "\[NoBreak]", GridBox[{ {"5.93842619743987`"}, {"2.6805418272533643`"}, { RowBox[{"-", "2.2665068055205313`"}]}, {"2.743772926278452`"}, {"6.331319473713119`"}, {"2.423379831062471`"}, {"6.070631049118338`"}, { RowBox[{"-", "0.2630245961621087`"}]}, {"6.217716552327195`"}, {"3.07966890112616`"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(UnitStep\\)]\\) \"\>", "\[InvisibleSpace]", RowBox[{"(", "\[NoBreak]", GridBox[{ {"1"}, {"1"}, {"0"}, {"1"}, {"1"}, {"1"}, {"1"}, {"0"}, {"1"}, {"1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(NonzeroPositions\\)]\\) \"\>"}], Row[{{{8.93842619743987}, {5.680541827253364}, {0.7334931944794687}, { 5.743772926278452}, {9.331319473713119}, {5.423379831062471}, { 9.070631049118338}, {2.7369754038378913`}, {9.217716552327195}, { 6.07966890112616}}, " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(subtract\\ \\ \ 3\)]\) ", {{5.93842619743987}, { 2.6805418272533643`}, {-2.2665068055205313`}, {2.743772926278452}, { 6.331319473713119}, {2.423379831062471}, { 6.070631049118338}, {-0.2630245961621087}, {6.217716552327195}, { 3.07966890112616}}, " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(UnitStep\)]\) \ ", {{1}, {1}, {0}, {1}, {1}, {1}, {1}, {0}, {1}, {1}}, " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(NonzeroPositions\ \)]\) "}]], StripOnInput->False, ScriptSizeMultipliers->1], TraditionalForm]], "Output", CellChangeTimes->{{3.401143959875*^9, 3.401143973046875*^9}, 3.4011800069375*^9, 3.401180052859375*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"With", "[", RowBox[{ RowBox[{"{", RowBox[{"d", "=", RowBox[{"UnitStep", "[", RowBox[{"data", "-", "3"}], "]"}]}], "}"}], ",", "\[IndentingNewLine]", RowBox[{"{", RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{"NonzeroPositions", "[", RowBox[{"BitXor", "[", RowBox[{"1", ",", "d"}], "]"}], "]"}], "]"}], "]"}], ",", RowBox[{"data", "[", RowBox[{"[", RowBox[{"NonzeroPositions", "[", "d", "]"}], "]"}], "]"}]}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.401070173549048*^9, 3.401070188015946*^9}, { 3.4010702306667356`*^9, 3.401070348526648*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.2339999999999945`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4010703224362383`*^9, 3.4011300347931433`*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r1", "===", "r2"}]], "Input", CellChangeTimes->{{3.401070324310998*^9, 3.401070325029656*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.4010703255608377`*^9, 3.401130036746193*^9}] }, Open ]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["MathGroup", FontSlant->"Italic", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]], StyleBox[": Part examples", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]] }], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.400857547422533*^9, 3.400857549751537*^9}, {3.40097442796875*^9, 3.40097443228125*^9}, { 3.40120477709375*^9, 3.401204778328125*^9}}], Cell[CellGroupData[{ Cell["Faster version of Complement", "Subsection", CellChangeTimes->{{3.401070576722888*^9, 3.4010705812870817`*^9}}], Cell[TextData[{ "A ", StyleBox["MathGroup", FontSlant->"Italic"], " poster wanted a version of Complement that was faster than Complement:" }], "Text", CellChangeTimes->{{3.4010708326654987`*^9, 3.401070871390196*^9}, { 3.4010712935718136`*^9, 3.4010712941656055`*^9}}], Cell["\<\ in the list: pp=Table[Random[Integer, {1, 1000}], {i, 1000}]; how could i know which numbers from 1 to 1000 does not exist in the pp List, \ but without using: Complement[Table[i,{i,1000}],pp] \ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell[TextData[{ "In this case, we want the integers between 1 and ", Cell[BoxData[ FormBox[ SuperscriptBox["10", "6"], TraditionalForm]]], " that are missing from data." }], "Text", CellChangeTimes->{{3.4010710197869153`*^9, 3.401071053351778*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomInteger", "[", RowBox[{ RowBox[{"{", RowBox[{"1", ",", SuperscriptBox["10", "6"]}], "}"}], ",", SuperscriptBox["10", "6"]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.401070858528846*^9, 3.401070879938384*^9}, { 3.401071055320667*^9, 3.4010710586021476`*^9}, {3.4010713228391933`*^9, 3.4010713675133553`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Complement", "[", RowBox[{ RowBox[{"Range", "[", SuperscriptBox["10", "6"], "]"}], ",", "data"}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4010710621336465`*^9, 3.401071075837736*^9}, { 3.401071328401978*^9, 3.401071328526984*^9}, {3.4010713806546535`*^9, 3.4010713810921755`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.4070000000000042`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4010710778535028`*^9, 3.4010713315740156`*^9, 3.4010713829203944`*^9, 3.4011126249243093`*^9, 3.4011301570319977`*^9}] }, Open ]], Cell["\<\ Since Complement sorts its result (and so its worst case complexity is O(n \ log n)), we should be able to come up with a nonsorting O(n) algorithm that \ beats Complement. Here is an example:\ \>", "Text", CellChangeTimes->{{3.4010711228097925`*^9, 3.401071171485094*^9}, { 3.40114325946875*^9, 3.401143329078125*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Style", "[", RowBox[{ RowBox[{"Row", "[", RowBox[{"{", RowBox[{ RowBox[{"List", "/@", RowBox[{"Range", "[", "10", "]"}]}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Part\)]\) \ \>\"", ",", RowBox[{ RowBox[{"tmp", "=", RowBox[{"Range", "[", RowBox[{"Length", "[", "data", "]"}], "]"}]}], ";", RowBox[{ RowBox[{"tmp", "[", RowBox[{"[", "data", "]"}], "]"}], "=", "0"}], ";", RowBox[{"List", "/@", RowBox[{"tmp", "[", RowBox[{"[", RowBox[{";;", "10"}], "]"}], "]"}]}]}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \ \(NonzeroEntries\)]\)\>\""}], "}"}], "]"}], ",", RowBox[{"ScriptSizeMultipliers", "\[Rule]", "1"}]}], "]"}]], "Input", CellChangeTimes->{{3.401143381734375*^9, 3.401143398265625*^9}, { 3.401143430234375*^9, 3.40114347146875*^9}, {3.40114353896875*^9, 3.401143641375*^9}, {3.401143717953125*^9, 3.40114374696875*^9}}], Cell[BoxData[ FormBox[ StyleBox[ InterpretationBox[ RowBox[{ RowBox[{"(", "\[NoBreak]", GridBox[{ {"1"}, {"2"}, {"3"}, {"4"}, {"5"}, {"6"}, {"7"}, {"8"}, {"9"}, {"10"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(Part\\)]\\) \"\>", "\[InvisibleSpace]", RowBox[{"(", "\[NoBreak]", GridBox[{ {"0"}, {"0"}, {"0"}, {"4"}, {"0"}, {"0"}, {"7"}, {"8"}, {"9"}, {"10"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(NonzeroEntries\\)]\\)\"\>"}], Row[{{{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}}, " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Part\)]\) ", {{ 0}, {0}, {0}, {4}, {0}, {0}, {7}, {8}, {9}, {10}}, " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \ \(NonzeroEntries\)]\)"}]], StripOnInput->False, ScriptSizeMultipliers->1], TraditionalForm]], "Output", CellChangeTimes->{{3.40114360859375*^9, 3.401143666578125*^9}, 3.401143747734375*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", RowBox[{"all", "=", RowBox[{"Range", "[", RowBox[{"Length", "[", "data", "]"}], "]"}]}], "}"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"all", "[", RowBox[{"[", "data", "]"}], "]"}], "=", "0"}], ";", "\[IndentingNewLine]", RowBox[{"NonzeroEntries", "[", "all", "]"}]}]}], "\[IndentingNewLine]", "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4010711773292556`*^9, 3.4010712401149254`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.21900000000000147`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4010712407868476`*^9, 3.4010713327459507`*^9, 3.4010713840767035`*^9, 3.4011126498289847`*^9, 3.4011301590953007`*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r1", "===", "r2"}]], "Input", CellChangeTimes->{{3.4010712438808155`*^9, 3.401071245724695*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.401071246021591*^9, 3.401112650591214*^9, 3.401130162072126*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Inverse permutation", "Subsection", CellChangeTimes->{{3.401205176640625*^9, 3.401205179765625*^9}}], Cell["Diana wrote", "Text", CellChangeTimes->{{3.401205190484375*^9, 3.401205192515625*^9}}], Cell["\<\ [snip] I want to figure out a clean way to code its inverse permutation. \ \>", "Program", CellChangeTimes->{{3.401205378515625*^9, 3.401205381484375*^9}}, FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["One idea is to use Ordering:", "Text", CellChangeTimes->{{3.401205255484375*^9, 3.401205263890625*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"Ordering", "[", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"10", "^", "6"}]}], "]"}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.401205275*^9, 3.401205279578125*^9}, { 3.401205348203125*^9, 3.4012053505625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Ordering", "[", "data", "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.40120528328125*^9, 3.4012052883125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.7189999999999989`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4012052898125*^9, 3.40120535384375*^9}] }, Open ]], Cell["Another idea is to use Part:", "Text", CellChangeTimes->{{3.401205292125*^9, 3.401205297828125*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", RowBox[{"tmp", "=", "data"}], "}"}], ",", RowBox[{ RowBox[{ RowBox[{"tmp", "[", RowBox[{"[", "tmp", "]"}], "]"}], "=", RowBox[{"Range", "[", RowBox[{"Length", "[", "tmp", "]"}], "]"}]}], ";", "tmp"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.401205300859375*^9, 3.401205327703125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.1410000000000006`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.401205329921875*^9, 3.401205356390625*^9}}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"r1", "===", "r2"}]], "Input", CellChangeTimes->{{3.40120535790625*^9, 3.40120535859375*^9}}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{3.401205358890625*^9}] }, Open ]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["MathGroup", FontSlant->"Italic", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]], StyleBox[": Accumulate example", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]] }], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.400857547422533*^9, 3.400857549751537*^9}, {3.40097442796875*^9, 3.40097443228125*^9}, { 3.40120480303125*^9, 3.401204807171875*^9}}], Cell[CellGroupData[{ Cell["Markov sequence", "Subsection", CellChangeTimes->{{3.40117990796875*^9, 3.401179917953125*^9}}], Cell["Yaroslav Butatov asks:", "Text", CellChangeTimes->{{3.4011180500567617`*^9, 3.4011180630646005`*^9}}], Cell["\<\ I'm looking for a fast way to sample from a Markov-1 sequence of random bits. The method below is 3600 times slower than built-in RandomInteger function, can it be made much faster? p = 0.9; (* the probability of encountering 00 or 11 *) f = RandomChoice[{p^# (1 - p)^(1 - #), p^(1 - #) (1 - p)^#} -> {1, 0}]&; NestList[f, RandomChoice[{0, 1}], 100000] \ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["\<\ Here we can think of the Markov-1 sequence as being generated by a list of \ boolean toggles that indicate whether the next element of the sequence should \ change or remain the same:\ \>", "Text", CellChangeTimes->{{3.4011197156049147`*^9, 3.4011197285354185`*^9}, { 3.401119769043647*^9, 3.401119822246133*^9}, {3.401177147703125*^9, 3.401177215046875*^9}, {3.401177248890625*^9, 3.401177249625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Grid", "[", RowBox[{ RowBox[{"{", RowBox[{"Riffle", "[", RowBox[{ RowBox[{"{", RowBox[{ "0", ",", "0", ",", "1", ",", "0", ",", "1", ",", "1", ",", "0", ",", "0", ",", "0", ",", "1", ",", "1"}], "}"}], ",", RowBox[{ RowBox[{ RowBox[{"StringReplace", "[", RowBox[{ "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(#\)]\) \>\ \"", ",", RowBox[{"\"\<#\>\"", "\[RuleDelayed]", RowBox[{"ToString", "[", "#", "]"}]}]}], "]"}], "&"}], "/@", RowBox[{"{", RowBox[{ "False", ",", "True", ",", "True", ",", "True", ",", "False", ",", "True", ",", "False", ",", "False", ",", "True", ",", "False"}], "}"}]}]}], "]"}], "\[IndentingNewLine]", "}"}], ",", RowBox[{"Spacings", "\[Rule]", ".1"}]}], "]"}]], "Input", CellChangeTimes->{{3.401179211078125*^9, 3.401179241828125*^9}}], Cell[BoxData[ FormBox[ TagBox[GridBox[{ {"0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(False\\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(True\\)]\\) \"\>", "1", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(True\\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(True\\)]\\) \"\>", "1", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(False\\)]\\) \"\>", "1", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(True\\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(False\\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(False\\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(True\\)]\\) \"\>", "1", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \ \\(False\\)]\\) \"\>", "1"} }, ColumnsEqual->False, GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}, GridBoxSpacings->{"Columns" -> {{0.1}}}, RowsEqual->False], "Grid"], TraditionalForm]], "Output", CellChangeTimes->{3.401179242609375*^9}] }, Open ]], Cell["\<\ This problem doesn't at first appear to be amenable to Listable operations, \ since we need to repeatedly apply a custom function to an initial value. However, there is at least one kernel function, Accumulate, \ that very quickly applys a particular function (Plus) to an initial value. \ \>", "Text", CellChangeTimes->{{3.401177690953125*^9, 3.401177726046875*^9}, { 3.40117793125*^9, 3.40117801340625*^9}}], Cell["\<\ If we use 0 to represent False and 1 to represent True, then we can generate \ the above sequence by prepending an initial value to the boolean list and \ using Accumulate:\ \>", "Text", CellChangeTimes->{{3.401177655171875*^9, 3.401177668453125*^9}, { 3.401178026109375*^9, 3.401178035609375*^9}, {3.40117810078125*^9, 3.40117812696875*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Grid", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"Riffle", "[", RowBox[{ RowBox[{"{", RowBox[{ "0", ",", "0", ",", "1", ",", "0", ",", "1", ",", "1", ",", "0", ",", "0", ",", "0", ",", "1", ",", "1"}], "}"}], ",", RowBox[{ RowBox[{ RowBox[{"StringReplace", "[", RowBox[{ "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(#\)]\) \ \>\"", ",", RowBox[{"\"\<#\>\"", "\[RuleDelayed]", RowBox[{"\"\<+\>\"", "<>", RowBox[{"ToString", "[", "#", "]"}]}]}]}], "]"}], "&"}], "/@", RowBox[{"Boole", "[", RowBox[{"{", RowBox[{ "False", ",", "True", ",", "True", ",", "True", ",", "False", ",", "True", ",", "False", ",", "False", ",", "True", ",", "False"}], "}"}], "]"}]}]}], "]"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"Table", "[", RowBox[{"\"\<\>\"", ",", RowBox[{"{", "10", "}"}]}], "]"}], "~", "Join", "~", RowBox[{"{", RowBox[{ RowBox[{"Style", "[", RowBox[{"\"\<\[DownArrow]\>\"", ",", "30"}], "]"}], ",", "\"\< Accumulate\>\""}], "}"}], "~", "Join", "~", RowBox[{"Table", "[", RowBox[{"SpanFromLeft", ",", RowBox[{"{", "9", "}"}]}], "]"}]}], ",", "\[IndentingNewLine]", RowBox[{"Riffle", "[", RowBox[{ RowBox[{"{", RowBox[{ "0", ",", "0", ",", "1", ",", "2", ",", "3", ",", "3", ",", "4", ",", "4", ",", "4", ",", "5", ",", "5"}], "}"}], ",", "\"\< \[DoubleLongRightArrow] \>\""}], "]"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"Table", "[", RowBox[{"\"\<\>\"", ",", RowBox[{"{", "10", "}"}]}], "]"}], "~", "Join", "~", RowBox[{"{", RowBox[{ RowBox[{"Style", "[", RowBox[{"\"\<\[DownArrow]\>\"", ",", "30"}], "]"}], ",", "\"\< modulo 2\>\""}], "}"}], "~", "Join", "~", RowBox[{"Table", "[", RowBox[{"SpanFromLeft", ",", RowBox[{"{", "9", "}"}]}], "]"}]}], ",", "\[IndentingNewLine]", RowBox[{"Riffle", "[", RowBox[{ RowBox[{"Mod", "[", RowBox[{ RowBox[{"{", RowBox[{ "0", ",", "0", ",", "1", ",", "2", ",", "3", ",", "3", ",", "4", ",", "4", ",", "4", ",", "5", ",", "5"}], "}"}], ",", "2"}], "]"}], ",", "\"\< \[DoubleLongRightArrow] \>\""}], "]"}]}], "\[IndentingNewLine]", "}"}], ",", RowBox[{"Alignment", "\[Rule]", RowBox[{"{", RowBox[{"Left", ",", RowBox[{"{", RowBox[{ "Baseline", ",", "Center", ",", "Baseline", ",", "Center", ",", "Baseline"}], "}"}]}], "}"}]}], ",", RowBox[{"Spacings", "\[Rule]", RowBox[{"{", RowBox[{"0.1", ",", "1"}], "}"}]}]}], "]"}]], "Input", CellChangeTimes->{{3.40117722184375*^9, 3.401177234265625*^9}, { 3.40117727021875*^9, 3.401177398046875*^9}, {3.401177562046875*^9, 3.4011775915*^9}, {3.40117825765625*^9, 3.401178444203125*^9}, { 3.401178497234375*^9, 3.40117858359375*^9}, {3.4011786329375*^9, 3.401178735390625*^9}, {3.40117881384375*^9, 3.40117903178125*^9}, { 3.401179084484375*^9, 3.4011791448125*^9}}], Cell[BoxData[ FormBox[ TagBox[GridBox[{ {"0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+0\ \\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+1\ \\)]\\) \"\>", "1", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+1\ \\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+1\ \\)]\\) \"\>", "1", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+0\ \\)]\\) \"\>", "1", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+1\ \\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+0\ \\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+0\ \\)]\\) \"\>", "0", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+1\ \\)]\\) \"\>", "1", "\<\" \\!\\(\\*OverscriptBox[\\(\[DoubleLongRightArrow]\\), \\(+0\ \\)]\\) \"\>", "1"}, {"\<\"\"\>", "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", \ "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", StyleBox["\<\"\[DownArrow]\"\>", StripOnInput->False, FontSize->30], "\<\" Accumulate\"\>", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]"}, {"0", "\<\" \[DoubleLongRightArrow] \"\>", "0", "\<\" \[DoubleLongRightArrow] \"\>", "1", "\<\" \[DoubleLongRightArrow] \"\>", "2", "\<\" \[DoubleLongRightArrow] \"\>", "3", "\<\" \[DoubleLongRightArrow] \"\>", "3", "\<\" \[DoubleLongRightArrow] \"\>", "4", "\<\" \[DoubleLongRightArrow] \"\>", "4", "\<\" \[DoubleLongRightArrow] \"\>", "4", "\<\" \[DoubleLongRightArrow] \"\>", "5", "\<\" \[DoubleLongRightArrow] \"\>", "5"}, {"\<\"\"\>", "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", \ "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", "\<\"\"\>", StyleBox["\<\"\[DownArrow]\"\>", StripOnInput->False, FontSize->30], "\<\" modulo 2\"\>", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]", "\[SpanFromLeft]"}, {"0", "\<\" \[DoubleLongRightArrow] \"\>", "0", "\<\" \[DoubleLongRightArrow] \"\>", "1", "\<\" \[DoubleLongRightArrow] \"\>", "0", "\<\" \[DoubleLongRightArrow] \"\>", "1", "\<\" \[DoubleLongRightArrow] \"\>", "1", "\<\" \[DoubleLongRightArrow] \"\>", "0", "\<\" \[DoubleLongRightArrow] \"\>", "0", "\<\" \[DoubleLongRightArrow] \"\>", "0", "\<\" \[DoubleLongRightArrow] \"\>", "1", "\<\" \[DoubleLongRightArrow] \"\>", "1"} }, ColumnsEqual->False, GridBoxAlignment->{ "Columns" -> {{Left}}, "Rows" -> {Baseline, Center, Baseline, Center, Baseline}}, GridBoxItemSize->{"Columns" -> {{Automatic}}, "Rows" -> {{Automatic}}}, GridBoxSpacings->{"Columns" -> {{0.1}}, "Rows" -> {{1}}}, RowsEqual->False], "Grid"], TraditionalForm]], "Output", CellChangeTimes->{{3.401178264140625*^9, 3.4011782951875*^9}, 3.401178444953125*^9, {3.401178548234375*^9, 3.401178584171875*^9}, { 3.40117865990625*^9, 3.401178664171875*^9}, {3.40117869759375*^9, 3.4011787359375*^9}, {3.40117884896875*^9, 3.401178910890625*^9}, { 3.401178971796875*^9, 3.40117903225*^9}, {3.401179118671875*^9, 3.4011791465*^9}}] }, Open ]], Cell["\<\ To generate a list where toggles occur 10% of the time, we can use the \ following:\ \>", "Text", CellChangeTimes->{{3.401179355609375*^9, 3.40117938978125*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"toggles", "=", RowBox[{"UnitStep", "[", RowBox[{"RandomInteger", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"-", "9"}], ",", "0"}], "}"}], ",", RowBox[{"10", "^", "6"}]}], "]"}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.401179390953125*^9, 3.401179407109375*^9}, { 3.401179499453125*^9, 3.401179527828125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.031000000000046435`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.401179412453125*^9, 3.40117944425*^9, {3.401179503484375*^9, 3.40117952834375*^9}}] }, Open ]], Cell["Then, the code to generate the Markov sequence is:", "Text", CellChangeTimes->{{3.401179457265625*^9, 3.401179464515625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r", "=", RowBox[{"BitAnd", "[", RowBox[{ RowBox[{"Accumulate", "[", RowBox[{"Prepend", "[", RowBox[{"toggles", ",", "0"}], "]"}], "]"}], ",", "1"}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.401118893851026*^9, 3.4011189036652136`*^9}, { 3.4011189384644327`*^9, 3.401118949182655*^9}, {3.401118995104557*^9, 3.401119186056912*^9}, {3.4011192242956767`*^9, 3.4011192255261254`*^9}, { 3.4011193205977564`*^9, 3.401119328961693*^9}, {3.4011794691875*^9, 3.401179516875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.03099999999999703`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.40111915990694*^9, 3.4011191865235977`*^9}, 3.401119225931083*^9, 3.4011193308618793`*^9, 3.4011193641930213`*^9, 3.401119419563213*^9, {3.401179520953125*^9, 3.401179536296875*^9}}] }, Open ]], Cell["This can be compared with:", "Text", CellChangeTimes->{{3.40117957*^9, 3.40117959025*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"RandomInteger", "[", RowBox[{"1", ",", RowBox[{"10", "^", "6"}]}], "]"}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.40117959240625*^9, 3.401179598125*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.016000000000010617`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401179598546875*^9}] }, Open ]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["MathGroup", FontSlant->"Italic", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]], StyleBox[": Total examples", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]] }], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.400857547422533*^9, 3.400857549751537*^9}, {3.40097442796875*^9, 3.40097443228125*^9}, { 3.401204844109375*^9, 3.401204845609375*^9}}], Cell[CellGroupData[{ Cell["Count identical submatrices", "Subsection", CellChangeTimes->{{3.401069283202891*^9, 3.4010692959551754`*^9}}], Cell["Yaroslav Bulatov wrote:", "Text", CellChangeTimes->{{3.401193863671875*^9, 3.401193866734375*^9}, { 3.401193971515625*^9, 3.401193976890625*^9}}], Cell["\<\ What is the recommended way of counting the number of matches in two lists? The natural way would be to thread over Equal, but Equal will evaluate before Thread gets to it. The method below works, but somehow feels wrong m1 = RandomInteger[{1}, {10^5, 2, 2}]; m2 = RandomInteger[{1}, {10^5, 2, 2}]; matches = Thread[temporary[m1, m2]] /. temporary -> Equal; Count[matches, True]\ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell[BoxData[{ RowBox[{ RowBox[{"m1", "=", RowBox[{"RandomInteger", "[", RowBox[{ RowBox[{"{", "1", "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"10", "^", "5"}], ",", "2", ",", "2"}], "}"}]}], "]"}]}], ";"}], "\n", RowBox[{ RowBox[{"m2", "=", RowBox[{"RandomInteger", "[", RowBox[{ RowBox[{"{", "1", "}"}], ",", RowBox[{"{", RowBox[{ RowBox[{"10", "^", "5"}], ",", "2", ",", "2"}], "}"}]}], "]"}]}], ";"}]}], "Input", CellChangeTimes->{{3.401194057328125*^9, 3.40119407915625*^9}}], Cell["Here is Yaroslav's solution:", "Text", CellChangeTimes->{{3.4011941245*^9, 3.40119413265625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"Count", "[", RowBox[{ RowBox[{ RowBox[{"Thread", "[", RowBox[{"temporary", "[", RowBox[{"m1", ",", "m2"}], "]"}], "]"}], "/.", RowBox[{"temporary", "\[Rule]", "Equal"}]}], ",", "True"}], "]"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.401194060671875*^9, 3.4011941025625*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.3590000000000006`", ",", "6306"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.40119410334375*^9, 3.40119410809375*^9}, 3.401194840515625*^9}] }, Open ]], Cell["\<\ We can do this much more quickly by applying subtracting, using Unitize and \ adding up the elements of each matrix. Then, use Total and Unitize again \ producing a 0 for identical submatrices.\ \>", "Text", CellChangeTimes->{ 3.401194688265625*^9, {3.40119472909375*^9, 3.401194782625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Row", "[", RowBox[{"{", RowBox[{ RowBox[{ RowBox[{"Column", "[", RowBox[{ RowBox[{"MatrixForm", "/@", RowBox[{"m1", "[", RowBox[{"[", RowBox[{";;", "5"}], "]"}], "]"}]}], ",", RowBox[{"ItemSize", "\[Rule]", RowBox[{"{", RowBox[{"4", ",", "3"}], "}"}]}]}], "]"}], "-", RowBox[{"Column", "[", RowBox[{ RowBox[{"MatrixForm", "/@", RowBox[{"m2", "[", RowBox[{"[", RowBox[{";;", "5"}], "]"}], "]"}]}], ",", RowBox[{"ItemSize", "\[Rule]", RowBox[{"{", RowBox[{"4", ",", "3"}], "}"}]}]}], "]"}]}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(subtract\)]\) \ \>\"", ",", RowBox[{"Column", "[", RowBox[{ RowBox[{"MatrixForm", "/@", RowBox[{ RowBox[{"(", RowBox[{"m1", "-", "m2"}], ")"}], "[", RowBox[{"[", RowBox[{";;", "5"}], "]"}], "]"}]}], ",", RowBox[{"ItemSize", "\[Rule]", RowBox[{"{", RowBox[{"4", ",", "3"}], "}"}]}]}], "]"}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Unitize\)]\) \ \>\"", ",", RowBox[{"Column", "[", RowBox[{ RowBox[{"MatrixForm", "/@", RowBox[{"Unitize", "[", RowBox[{ RowBox[{"(", RowBox[{"m1", "-", "m2"}], ")"}], "[", RowBox[{"[", RowBox[{";;", "5"}], "]"}], "]"}], "]"}]}], ",", RowBox[{"ItemSize", "\[Rule]", RowBox[{"{", RowBox[{"4", ",", "3"}], "}"}]}]}], "]"}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Total\)]\) \ \>\"", ",", RowBox[{"Column", "[", RowBox[{ RowBox[{"Total", "[", RowBox[{ RowBox[{"Unitize", "[", RowBox[{ RowBox[{"(", RowBox[{"m1", "-", "m2"}], ")"}], "[", RowBox[{"[", RowBox[{";;", "5"}], "]"}], "]"}], "]"}], ",", RowBox[{"{", RowBox[{"2", ",", "3"}], "}"}]}], "]"}], ",", RowBox[{"ItemSize", "\[Rule]", RowBox[{"{", RowBox[{"4", ",", "3"}], "}"}]}], ",", RowBox[{"Alignment", "\[Rule]", "Center"}]}], "]"}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Unitize\)]\) \ \>\"", ",", RowBox[{"Column", "[", RowBox[{ RowBox[{"Unitize", "[", RowBox[{"Total", "[", RowBox[{ RowBox[{"Unitize", "[", RowBox[{ RowBox[{"(", RowBox[{"m1", "-", "m2"}], ")"}], "[", RowBox[{"[", RowBox[{";;", "5"}], "]"}], "]"}], "]"}], ",", RowBox[{"{", RowBox[{"2", ",", "3"}], "}"}]}], "]"}], "]"}], ",", RowBox[{"ItemSize", "\[Rule]", RowBox[{"{", RowBox[{"4", ",", "3"}], "}"}]}], ",", RowBox[{"Alignment", "\[Rule]", "Center"}]}], "]"}], ",", "\"\< \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \ \(Total\)]\)\>\""}], "}"}], "]"}]], "Input", CellChangeTimes->{{3.4011941503125*^9, 3.4011945973125*^9}, { 3.401194654734375*^9, 3.4011946690625*^9}, {3.40119479071875*^9, 3.4011947933125*^9}}], Cell[BoxData[ FormBox[ InterpretationBox[ RowBox[{ RowBox[{ TagBox[GridBox[{ { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"1", "0"}, {"0", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "0"}, {"1", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "1"}, {"1", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "1"}, {"0", "0"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"1", "1"}, {"1", "0"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]} }, ColumnsEqual->False, GridBoxAlignment->{"Columns" -> {{Left}}}, GridBoxItemSize->{"Columns" -> {{4}}, "Rows" -> {{3}}}, RowsEqual->False], "Column"], "-", TagBox[GridBox[{ { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"1", "0"}, {"0", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "0"}, {"1", "0"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "1"}, {"1", "0"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"1", "1"}, {"0", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "1"}, {"1", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]} }, ColumnsEqual->False, GridBoxAlignment->{"Columns" -> {{Left}}}, GridBoxItemSize->{"Columns" -> {{4}}, "Rows" -> {{3}}}, RowsEqual->False], "Column"]}], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(subtract\\)]\\) \"\>", "\[InvisibleSpace]", TagBox[GridBox[{ { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "0"}, {"0", "0"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "0"}, {"0", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "0"}, {"0", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ { RowBox[{"-", "1"}], "0"}, {"0", RowBox[{"-", "1"}]} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"1", "0"}, {"0", RowBox[{"-", "1"}]} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]} }, ColumnsEqual->False, GridBoxAlignment->{"Columns" -> {{Left}}}, GridBoxItemSize->{"Columns" -> {{4}}, "Rows" -> {{3}}}, RowsEqual->False], "Column"], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(Unitize\\)]\\) \"\>", "\[InvisibleSpace]", TagBox[GridBox[{ { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "0"}, {"0", "0"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "0"}, {"0", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0", "0"}, {"0", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"1", "0"}, {"0", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]}, { TagBox[ RowBox[{"(", "\[NoBreak]", GridBox[{ {"1", "0"}, {"0", "1"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], Function[BoxForm`e$, MatrixForm[BoxForm`e$]]]} }, ColumnsEqual->False, GridBoxAlignment->{"Columns" -> {{Left}}}, GridBoxItemSize->{"Columns" -> {{4}}, "Rows" -> {{3}}}, RowsEqual->False], "Column"], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(Total\\)]\\) \"\>", "\[InvisibleSpace]", TagBox[GridBox[{ {"0"}, {"1"}, {"1"}, {"2"}, {"2"} }, ColumnsEqual->False, GridBoxAlignment->{"Columns" -> {{Center}}}, GridBoxItemSize->{"Columns" -> {{4}}, "Rows" -> {{3}}}, RowsEqual->False], "Column"], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(Unitize\\)]\\) \"\>", "\[InvisibleSpace]", TagBox[GridBox[{ {"0"}, {"1"}, {"1"}, {"1"}, {"1"} }, ColumnsEqual->False, GridBoxAlignment->{"Columns" -> {{Center}}}, GridBoxItemSize->{"Columns" -> {{4}}, "Rows" -> {{3}}}, RowsEqual->False], "Column"], "\[InvisibleSpace]", "\<\" \\!\\(\\*OverscriptBox[\\(\ \[DoubleLongRightArrow]\\), \\(Total\\)]\\)\"\>"}], Row[{-Column[{ MatrixForm[{{1, 0}, {0, 1}}], MatrixForm[{{0, 0}, {1, 0}}], MatrixForm[{{0, 1}, {1, 0}}], MatrixForm[{{1, 1}, {0, 1}}], MatrixForm[{{0, 1}, {1, 1}}]}, ItemSize -> {4, 3}] + Column[{ MatrixForm[{{1, 0}, {0, 1}}], MatrixForm[{{0, 0}, {1, 1}}], MatrixForm[{{0, 1}, {1, 1}}], MatrixForm[{{0, 1}, {0, 0}}], MatrixForm[{{1, 1}, {1, 0}}]}, ItemSize -> {4, 3}], " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(subtract\)]\) ", Column[{ MatrixForm[{{0, 0}, {0, 0}}], MatrixForm[{{0, 0}, {0, 1}}], MatrixForm[{{0, 0}, {0, 1}}], MatrixForm[{{-1, 0}, {0, -1}}], MatrixForm[{{1, 0}, {0, -1}}]}, ItemSize -> {4, 3}], " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Unitize\)]\) ", Column[{ MatrixForm[{{0, 0}, {0, 0}}], MatrixForm[{{0, 0}, {0, 1}}], MatrixForm[{{0, 0}, {0, 1}}], MatrixForm[{{1, 0}, {0, 1}}], MatrixForm[{{1, 0}, {0, 1}}]}, ItemSize -> {4, 3}], " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Total\)]\) ", Column[{0, 1, 1, 2, 2}, ItemSize -> {4, 3}, Alignment -> Center], " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Unitize\)]\) ", Column[{0, 1, 1, 1, 1}, ItemSize -> {4, 3}, Alignment -> Center], " \!\(\*OverscriptBox[\(\[DoubleLongRightArrow]\), \(Total\)]\)"}]], TraditionalForm]], "Output", CellChangeTimes->{{3.401194426546875*^9, 3.40119444715625*^9}, { 3.4011944936875*^9, 3.401194525203125*^9}, {3.40119459096875*^9, 3.401194619921875*^9}, 3.40119466959375*^9, 3.401194794265625*^9}] }, Open ]], Cell["Here is the code that does this:", "Text", CellChangeTimes->{{3.401194803640625*^9, 3.401194807515625*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"Length", "[", "m1", "]"}], "-", RowBox[{"Total", "[", RowBox[{"Unitize", "[", RowBox[{"Total", "[", RowBox[{ RowBox[{"Unitize", "[", RowBox[{"m1", "-", "m2"}], "]"}], ",", RowBox[{"{", RowBox[{"2", ",", "3"}], "}"}]}], "]"}], "]"}], "]"}]}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.401194828234375*^9, 3.40119483109375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.04699999999999997`", ",", "6306"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401194835671875*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Repeated Dot", "Subsection", CellChangeTimes->{{3.40119496565625*^9, 3.401194968390625*^9}}], Cell["Gregory Lypny wrote:", "Text", CellChangeTimes->{{3.4011831886875*^9, 3.4011831906875*^9}, { 3.401193589671875*^9, 3.40119359484375*^9}}], Cell["\<\ x and y are both 2000 x 3 matrices. I wanted to created a 2000 x 1 vector with each element equal to the dot product of the corresponding rows of x and y. So I tried this: Table[x[[i]].y[[i]], {i, 1, 2000}] It took more than two and a half minutes on my iBook G4. Is that normal? I've done seemingly more demanding computations in Do loops and Tables that are completed in a split second. Am I doing something wrong with this one? \ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["\<\ It turns out that Gregory was not using packed arrays for x and y (a result \ of using division with integer packed arrays). However, using the Listable \ paradigm, we can just use Times + Total to improve speed.\ \>", "Text", CellChangeTimes->{{3.401193622953125*^9, 3.401193716375*^9}, { 3.4011937766875*^9, 3.401193806421875*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"x", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"{", RowBox[{"1000000", ",", "3"}], "}"}]}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"y", "=", RowBox[{"RandomReal", "[", RowBox[{"1", ",", RowBox[{"{", RowBox[{"1000000", ",", "3"}], "}"}]}], "]"}]}], ";"}]}], "Input", CellChangeTimes->{{3.3995906184375*^9, 3.399590639390625*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"Dot", "[", RowBox[{ RowBox[{"x", "[", RowBox[{"[", "i", "]"}], "]"}], ",", RowBox[{"y", "[", RowBox[{"[", "i", "]"}], "]"}]}], "]"}], ",", RowBox[{"{", RowBox[{"i", ",", "1000000"}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"Total", "[", RowBox[{ RowBox[{"x", " ", "y"}], ",", RowBox[{"{", "2", "}"}]}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{"r1", "==", "r2"}]}], "Input", CellChangeTimes->{{3.39959064228125*^9, 3.399590712328125*^9}, { 3.401146134890625*^9, 3.401146139921875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.8900000000000001`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.39959066053125*^9, {3.39959069640625*^9, 3.39959071365625*^9}, 3.401146143*^9, 3.4011937905*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.2500000000000001`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.39959066053125*^9, {3.39959069640625*^9, 3.39959071365625*^9}, 3.401146143*^9, 3.401193790765625*^9}], Cell[BoxData[ FormBox["True", TraditionalForm]], "Output", CellChangeTimes->{ 3.39959066053125*^9, {3.39959069640625*^9, 3.39959071365625*^9}, 3.401146143*^9, 3.401193790828125*^9}] }, Open ]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["NearestFunction", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.4008589804321833`*^9, 3.400858983355161*^9}}], Cell["\<\ The new version 6 function Nearest creates a NearestFunction data structure \ that very quickly returns the nearest element of the data to a given point. \ The key thing to remember with Nearest is that the creation of the \ NearestFunction can be time consuming, but once created, applying the \ NearestFunction to data is extremely quick.\ \>", "Text", CellChangeTimes->{{3.4008660039164186`*^9, 3.4008660799471817`*^9}, { 3.40086647713214*^9, 3.40086652011624*^9}}], Cell[CellGroupData[{ Cell["Naive application of Nearest", "Subsection", CellChangeTimes->{{3.400866473257165*^9, 3.4008664748821545`*^9}, { 3.400867194002552*^9, 3.400867198096276*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"RandomReal", "[", RowBox[{"10", ",", RowBox[{"10", "^", "6"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400865990447755*^9, 3.400865998072706*^9}, { 3.400866080790927*^9, 3.400866085431522*^9}, {3.400866244914876*^9, 3.400866244961751*^9}}], Cell["A naive application of Nearest:", "Text", CellChangeTimes->{{3.4008665332724056`*^9, 3.400866537569253*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"Nearest", "[", RowBox[{"data", ",", "6"}], "]"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400866539584865*^9, 3.4008665479910617`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.6879999999999984`", ",", RowBox[{"{", "5.99999922409487`", "}"}]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008665458348255`*^9, 3.4008665493348026`*^9}, 3.401091295890625*^9, 3.4011128362173824`*^9}] }, Open ]], Cell["\<\ This seems rather slow, and it is when compared to a straightfoward Listable \ approach as described earlier:\ \>", "Text", CellChangeTimes->{{3.4008665548816423`*^9, 3.40086658258459*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{"Ordering", "[", RowBox[{ RowBox[{"Abs", "[", RowBox[{"data", "-", "6"}], "]"}], ",", "1"}], "]"}], "]"}], "]"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400866589037674*^9, 3.4008666001782274`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.07799999999999901`", ",", RowBox[{"{", "5.99999922409487`", "}"}]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4008666006000996`*^9, 3.401091296640625*^9, 3.401112852986427*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Intended application of Nearest", "Subsection", CellChangeTimes->{{3.400867206627471*^9, 3.4008672110336933`*^9}, { 3.400872912503711*^9, 3.4008729137322893`*^9}}], Cell["\<\ Of course, the above is not the proper way to appreciate Nearest and \ NearestFunction. Instead, use Nearest to create a NearestFunction:\ \>", "Text", CellChangeTimes->{{3.400866614209388*^9, 3.4008666778027306`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"(", RowBox[{"nf", "=", RowBox[{"Nearest", "[", "data", "]"}]}], ")"}], "//", "Timing"}]], "Input",\ CellChangeTimes->{{3.4008666792402215`*^9, 3.400866685599556*^9}, { 3.4011128794466724`*^9, 3.4011129049580207`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.6560000000000004`", ",", TagBox[ RowBox[{"NearestFunction", "[", RowBox[{ RowBox[{"{", RowBox[{"1000000", ",", "1"}], "}"}], ",", InterpretationBox[ RowBox[{"\<\"<\"\>", "\[InvisibleSpace]", "\<\">\"\>"}], SequenceForm["<", ">"], Editable->False]}], "]"}], False, Editable->False]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.4008666873651695`*^9, 3.401091299609375*^9, {3.401112881640026*^9, 3.401112906031364*^9}}] }, Open ]], Cell["Now, apply this NearestFunction to data:", "Text", CellChangeTimes->{{3.4008666938026285`*^9, 3.4008667044275603`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"nf", "[", "6", "]"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4008667054588037`*^9, 3.4008667096775265`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.016000000000003317`", ",", RowBox[{"{", "5.99999922409487`", "}"}]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{ 3.40086670994315*^9, 3.40109130078125*^9, {3.401112889495655*^9, 3.401112906482479*^9}}] }, Open ]], Cell["The application of NearestFunction to data is quick. ", "Text"], Cell[CellGroupData[{ Cell["Comparison of NearestFunction and Ordering approaches", "Subsubsection", CellChangeTimes->{{3.4008672470647125`*^9, 3.4008672732520447`*^9}}], Cell["Consider a secondary data source:", "Text", CellChangeTimes->{{3.400866727271164*^9, 3.4008667610834475`*^9}, 3.4008672970175176`*^9}], Cell[BoxData[ RowBox[{ RowBox[{"data2", "=", RowBox[{"RandomReal", "[", RowBox[{"10", ",", RowBox[{"10", "^", "2"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.400866763052185*^9, 3.4008667773489685`*^9}, { 3.400867054862818*^9, 3.4008670556284375`*^9}}], Cell["\<\ Here we calculate the points in data nearest to data2 using both methods:\ \>", "Text", CellChangeTimes->{{3.400867043222267*^9, 3.4008670508628435`*^9}, { 3.4008670839407563`*^9, 3.4008670991906586`*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{ RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{"Ordering", "[", RowBox[{ RowBox[{"Abs", "[", RowBox[{"data", "-", "#"}], "]"}], ",", "1"}], "]"}], "]"}], "]"}], "&"}], "/@", "data2"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4008667906613836`*^9, 3.4008668101925087`*^9}, { 3.4008670732689495`*^9, 3.4008670737689466`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"6.844000000000004`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4008668186612043`*^9, 3.400867116237425*^9, 3.401091282421875*^9, 3.40109131259375*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"nf", "/@", "data2"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400866811645624*^9, 3.400866849817255*^9}, { 3.4008669324886007`*^9, 3.4008669345667124`*^9}, {3.4008671057999916`*^9, 3.400867106393738*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"2.781000000000003`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.400866824098669*^9, 3.4008668514578695`*^9}, 3.4008669375354433`*^9, 3.400867119628028*^9, 3.401091282796875*^9, 3.401091315640625*^9}] }, Open ]], Cell["\<\ So, the NearestFunction is faster. However, it turns out there is currently \ an inefficiency in NearestFunction when it is mapped over data, and using \ Table instead of Map is considerably quicker:\ \>", "Text", CellChangeTimes->{{3.400867121065519*^9, 3.400867165049612*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"r3", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"nf", "[", "i", "]"}], ",", RowBox[{"{", RowBox[{"i", ",", "data2"}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.40086685914532*^9, 3.4008668712858677`*^9}, { 3.4008671685808396`*^9, 3.4008671691277113`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.7190000000000035`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4008668722233615`*^9, 3.400867171018324*^9, 3.401091316515625*^9}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["\<\ Comparison of NearestFunction and Ordering approaches to k-nearest neighbors\ \>", "Subsubsection", CellChangeTimes->{{3.4008673296423087`*^9, 3.400867345548457*^9}}], Cell["\<\ It turns out that Ordering[data,1] is considerably quicker than \ Ordering[data,2], and so using NearestFunction to find multiple nearest \ neighbors is even better:\ \>", "Text", CellChangeTimes->{{3.4008673558452663`*^9, 3.400867386641944*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"r1", "=", RowBox[{ RowBox[{"data", "[", RowBox[{"[", RowBox[{"Ordering", "[", RowBox[{ RowBox[{"Abs", "[", RowBox[{"data", "-", "6"}], "]"}], ",", "2"}], "]"}], "]"}], "]"}], "//", "Timing"}]}], "\[IndentingNewLine]", RowBox[{"r2", "=", RowBox[{ RowBox[{"nf", "[", RowBox[{"6", ",", "2"}], "]"}], "//", "Timing"}]}]}], "Input", CellChangeTimes->{{3.4008673944856443`*^9, 3.4008674456415663`*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.7500000000000016`", ",", RowBox[{"{", RowBox[{"5.99999922409487`", ",", "6.000008931453921`"}], "}"}]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008674203136034`*^9, 3.4008674468134336`*^9}, 3.4011129693440647`*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.030999999999997974`", ",", RowBox[{"{", RowBox[{"5.99999922409487`", ",", "6.000008931453921`"}], "}"}]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.4008674203136034`*^9, 3.4008674468134336`*^9}, 3.4011129693752146`*^9}] }, Open ]] }, Closed]] }, Closed]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["NearestFunction example", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.4008589872785172`*^9, 3.400858990467221*^9}, 3.401180424421875*^9}], Cell["\<\ Here is a recent example inspired by a Mathgroup post by Gareth Russell:\ \>", "Text", CellChangeTimes->{{3.400867485906934*^9, 3.400867492735015*^9}, { 3.400868038372148*^9, 3.4008680442002354`*^9}, {3.400868152355794*^9, 3.400868154590154*^9}, {3.40113119181567*^9, 3.40113120894317*^9}, { 3.40118058321875*^9, 3.401180583390625*^9}}], Cell["\<\ What is the fastest way to compute the nearest point to point distance \ between two data sets?\ \>", "Program", CellChangeTimes->{{3.4011990844375*^9, 3.40119908925*^9}}, FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["\<\ This is a very nice example for using NearestFunction. First, create some \ data:\ \>", "Text", CellChangeTimes->{{3.4008685717437344`*^9, 3.4008686205090475`*^9}}], Cell[BoxData[{ RowBox[{ RowBox[{"data1", "=", RowBox[{"RandomReal", "[", RowBox[{ RowBox[{"NormalDistribution", "[", RowBox[{"0", ",", ".5"}], "]"}], ",", RowBox[{"{", RowBox[{"100000", ",", "2"}], "}"}]}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"data2", "=", RowBox[{"RandomReal", "[", RowBox[{ RowBox[{"NormalDistribution", "[", RowBox[{"3", ",", ".1"}], "]"}], ",", RowBox[{"{", RowBox[{"100000", ",", "2"}], "}"}]}], "]"}]}], ";"}]}], "Input", CellChangeTimes->{{3.400868621352792*^9, 3.4008686330714664`*^9}, { 3.4008687553675594`*^9, 3.4008687977579126`*^9}, {3.400870432059953*^9, 3.4008704321380777`*^9}, {3.4008705118250675`*^9, 3.4008705153406706`*^9}, { 3.4008709452144933`*^9, 3.4008709481207433`*^9}, {3.4008710181363688`*^9, 3.4008710184176188`*^9}, {3.4008710508551188`*^9, 3.4008710515426188`*^9}, { 3.4008715106207433`*^9, 3.4008715134644933`*^9}, {3.4008716615582433`*^9, 3.4008716621051188`*^9}, {3.400872256154149*^9, 3.4008722924697623`*^9}, { 3.400872472894049*^9, 3.400872500325409*^9}, {3.40087389647501*^9, 3.4008739059618053`*^9}, {3.400874003806011*^9, 3.4008740046120787`*^9}, { 3.400874155146775*^9, 3.4008741571067677`*^9}, {3.401090632703125*^9, 3.401090635078125*^9}, {3.401130597619996*^9, 3.401130655650977*^9}, { 3.401130693976841*^9, 3.4011306958735404`*^9}, {3.401130739262494*^9, 3.401130742554286*^9}, {3.4011308046594286`*^9, 3.4011308100516973`*^9}, { 3.4011309618544817`*^9, 3.4011309627945623`*^9}, {3.40113106116617*^9, 3.40113106352217*^9}, {3.40113110031917*^9, 3.40113110264417*^9}, { 3.4011336053819733`*^9, 3.4011336055072937`*^9}, {3.401180281265625*^9, 3.401180282515625*^9}}], Cell[BoxData[ RowBox[{"plot", "=", RowBox[{"Graphics", "[", RowBox[{ RowBox[{"{", RowBox[{"GraphicsComplex", "[", RowBox[{ RowBox[{"Join", "[", RowBox[{"data1", ",", "data2"}], "]"}], ",", RowBox[{"{", RowBox[{"Blue", ",", RowBox[{"Point", "[", RowBox[{"Range", "[", RowBox[{"Length", "[", "data1", "]"}], "]"}], "]"}], ",", "Green", ",", RowBox[{"Point", "[", RowBox[{"Range", "[", RowBox[{ RowBox[{ RowBox[{"Length", "[", "data1", "]"}], "+", "1"}], ",", RowBox[{ RowBox[{"Length", "[", "data1", "]"}], "+", RowBox[{"Length", "[", "data2", "]"}]}]}], "]"}], "]"}]}], "}"}]}], "]"}], "}"}], ",", RowBox[{"Axes", "\[Rule]", "True"}]}], "]"}]}]], "Input", CellChangeTimes->{{3.4011306589741197`*^9, 3.401130792887353*^9}, { 3.4011309846200857`*^9, 3.401130985168466*^9}}], Cell["\<\ Apply Nearest to the first data set to obtain a NearestFunction:\ \>", "Text", CellChangeTimes->{{3.401180110484375*^9, 3.40118012971875*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{"(", RowBox[{"nf", "=", RowBox[{"Nearest", "[", "data1", "]"}]}], ")"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.400873924640872*^9, 3.4008739275861187`*^9}, { 3.4008739652852807`*^9, 3.4008739858865085`*^9}, {3.401180132328125*^9, 3.40118013571875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.18799999999999997`", ",", TagBox[ RowBox[{"NearestFunction", "[", RowBox[{ RowBox[{"{", RowBox[{"100000", ",", "2"}], "}"}], ",", InterpretationBox[ RowBox[{"\<\"<\"\>", "\[InvisibleSpace]", "\<\">\"\>"}], SequenceForm["<", ">"], Editable->False]}], "]"}], False, Editable->False]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.4011803656875*^9, 3.40119569975*^9}] }, Open ]], Cell["Apply the NearestFunction to the second data set:", "Text", CellChangeTimes->{{3.401180153421875*^9, 3.40118016259375*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{ RowBox[{ RowBox[{"g", "=", RowBox[{ RowBox[{"Table", "[", RowBox[{ RowBox[{"nf", "[", "i", "]"}], ",", RowBox[{"{", RowBox[{"i", ",", "data2"}], "}"}]}], "]"}], "\[LeftDoubleBracket]", RowBox[{"All", ",", "1"}], "\[RightDoubleBracket]"}]}], ";"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4008728469795513`*^9, 3.400872851484337*^9}, { 3.400874022965618*^9, 3.4008740232601423`*^9}, {3.400874069330006*^9, 3.400874093031494*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"2.6250000000000004`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.40119570375*^9}] }, Open ]], Cell["\<\ For each member of the second list, we now have the corresponding member of \ the second list that is closest, so we need to evaluate these distances and \ choose the smallest:\ \>", "Text", CellChangeTimes->{{3.40118017115625*^9, 3.40118024021875*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"(", RowBox[{"closest", "=", RowBox[{"Ordering", "[", RowBox[{ RowBox[{"Sqrt", "[", RowBox[{"Total", "[", RowBox[{ RowBox[{ RowBox[{"(", RowBox[{"g", "-", "data2"}], ")"}], "^", "2"}], ",", RowBox[{"{", "2", "}"}]}], "]"}], "]"}], ",", "1"}], "]"}]}], ")"}], "//", "Timing"}]], "Input", CellChangeTimes->{{3.4008710288863688`*^9, 3.4008710296207433`*^9}, { 3.4008710645738688`*^9, 3.4008711073551188`*^9}, {3.4008715003551188`*^9, 3.4008715024488688`*^9}, {3.4011310068686457`*^9, 3.401131024996522*^9}}], Cell[BoxData[ RowBox[{"Show", "[", RowBox[{"plot", ",", RowBox[{"Graphics", "[", RowBox[{"{", RowBox[{"Red", ",", RowBox[{"PointSize", "[", "Large", "]"}], ",", RowBox[{"Point", "[", RowBox[{ "g", "\[LeftDoubleBracket]", "closest", "\[RightDoubleBracket]"}], "]"}], ",", RowBox[{"Point", "[", RowBox[{ "data2", "\[LeftDoubleBracket]", "closest", "\[RightDoubleBracket]"}], "]"}]}], "}"}], "]"}]}], "]"}]], "Input", CellChangeTimes->{{3.401130871968737*^9, 3.4011309384464903`*^9}, { 3.401130998407926*^9, 3.401131050425686*^9}}] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["InterpolatingFunction", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.397919369590569*^9, {3.4006301372497244`*^9, 3.4006301386703253`*^9}, { 3.400853499960436*^9, 3.400853502008084*^9}, {3.400858995922405*^9, 3.400859003253297*^9}}], Cell["\<\ Interpolation with InterpolationOrder->0 is a nice technique to convert \ numerical data in a piecewise manner. Interpolation constructs an \ InterpolatingFunction object, and this construction can be time consuming. \ However, the application of this InterpolatingFunction object to data is very \ quick because InterpolatingFunction objects due a binary search to pick out \ the right piece of the interpolation.\ \>", "Text", CellChangeTimes->{{3.4010915005625*^9, 3.401091519140625*^9}, { 3.4011107832321234`*^9, 3.401110901948761*^9}}], Cell[CellGroupData[{ Cell[TextData[{ StyleBox["MathGroup", FontSlant->"Italic"], " example" }], "Subsection", CellChangeTimes->{{3.401198827609375*^9, 3.40119883090625*^9}}], Cell["Jacob Rome wrote:", "Text", CellChangeTimes->{{3.401199052484375*^9, 3.40119906046875*^9}}], Cell["\<\ I have a seemingly simple problem. I want to find the element in a list that is closest to a number I specify. In my case, I have a list of about 30,000 numbers (y[i]). I want to find the closest match for each of about 10,000 other numbers (call them x[i]). Obviously, speed is important. I've sorted the large list, and right now I'm going through each y[i] from lowest to highest and testing it to see if x[i] is less than that value. This takes about .1 seconds for each x[i]. I'm wondering if anyone has had a similar problem, and if there is a better function built-in to Mathematica. Alternatetively, I could build my own. I've just recently realized that I could also reduce the search time considerably if I sort the x[i] list as well, and only start my search from where I last left off. Any ideas on which approach would be more efficient? Thanks. \ \>", "Program", FontSize->17, Background->RGBColor[0.93, 0.93, 0.93]], Cell["\<\ This is a good problem for NearestFunction, but if we are only interested in \ the closest data point, we can boost speed by using an InterpolatingFunction \ instead.\ \>", "Text", CellChangeTimes->{{3.401199124578125*^9, 3.4011991794375*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"makeinterp", "[", "y_", "]"}], ":=", RowBox[{"Module", "[", RowBox[{ RowBox[{"{", "sy", "}"}], ",", "\[IndentingNewLine]", RowBox[{ RowBox[{"sy", "=", RowBox[{"Sort", "[", "y", "]"}]}], ";", "\[IndentingNewLine]", RowBox[{"Interpolation", "[", "\[IndentingNewLine]", RowBox[{ RowBox[{"Transpose", "[", RowBox[{"{", RowBox[{ RowBox[{"ListCorrelate", "[", RowBox[{ RowBox[{"{", RowBox[{ RowBox[{"1", "/", "2"}], ",", RowBox[{"1", "/", "2"}]}], "}"}], ",", "sy", ",", "1", ",", RowBox[{"Last", "@", "sy"}]}], "]"}], ",", "sy"}], "}"}], "]"}], ",", "\[IndentingNewLine]", RowBox[{"InterpolationOrder", "\[Rule]", "0"}]}], "\[IndentingNewLine]", "]"}]}]}], "\[IndentingNewLine]", "]"}]}]], "Input", CellChangeTimes->{{3.4008812823798923`*^9, 3.400881311410957*^9}, { 3.400926993296875*^9, 3.4009270170625*^9}}], Cell[CellGroupData[{ Cell["Illustrative example", "Subsubsection", CellChangeTimes->{{3.40119942228125*^9, 3.401199425546875*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"{", RowBox[{ "0", ",", "1", ",", "2", ",", "4", ",", "7", ",", "10", ",", "11", ",", "13"}], "}"}]}], ";"}]], "Input", CellChangeTimes->{{3.401199429546875*^9, 3.401199463390625*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"if", "=", RowBox[{"makeinterp", "[", "data", "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.401199442140625*^9, 3.401199445875*^9}}], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Show", "[", RowBox[{ RowBox[{"Plot", "[", RowBox[{ RowBox[{"if", "[", "x", "]"}], ",", RowBox[{"{", RowBox[{"x", ",", "1", ",", "13"}], "}"}]}], "]"}], ",", RowBox[{"Graphics", "[", RowBox[{"{", RowBox[{"Red", ",", RowBox[{"PointSize", "[", "Large", "]"}], ",", RowBox[{"Point", "[", RowBox[{"Transpose", "[", RowBox[{"{", RowBox[{"data", ",", "data"}], "}"}], "]"}], "]"}]}], "}"}], "]"}]}], "]"}]], "Input", CellChangeTimes->{{3.401199446953125*^9, 3.401199532203125*^9}}], Cell[BoxData[ FormBox[ GraphicsBox[{{{}, {}, {Hue[0.67, 0.6, 0.6], LineBox[CompressedData[" 1:eJxFxw0w23ccx/G/KCKJVjoiC6GeH2rrjlqHIw/M5k52ONHWM1Us1gmLMk/n sdaWrOjQuRIPrYfUStPSadF5Xmus2lX1PLTWc5gRZglpJnu47Pf93L3vcy/z mKTA0zgMwwr+6d8/y+5lYZiUgf03KQPPq1LGLm4iXylL7v5x6A9koW6z8ofJ P5Hz82ZZPS/kyBlTC4PKFfAXlr9+yNgFfyZYGs3D76iNMWOHV3yHjMDceCnH 932wj648YCIIbMfZF/K8DEwsI8csToB/pjqmyD7eRb4s8sknDILpHZkNTt0K 5Ov9HQMh4jfI7L7O55QLfyHP3b+1PpWgQj7Tfsfo+3sazP99vtFHEiXSRMav Os3UtGshk7K3g5NuaiOT9buesjt1kF+XmA8FToK7dEslMb+DV5fjby5tg83G 2GKeEhzUTG9e18Srrc/86txOQwoRvOn93bcZNHCIZmx5vj1YpXRLbjgNbpKR /Qfqwesr/Xo4mi7ysbkzj1jlYGWinEisIiA/UOT6Pa0hIsf3j4315eshV59q phlGHUCm3OBnqm7pI2/s2saLmsjIig0S9WLbQeSH3F6JWPwWst0BPCe9xgBZ yvDOKqAbIt/l54qFdeCwUZx8qReMmRaxGbPgQF+fhMTfwE0CHWGVApzen1YV swfmEJZF7+AoapswLbgn2na0wLK6McmgLrjWpXXkJBn80aPzMxtUsDBdyBdx wc+sK3QCysE5Qc7UaUMjZJuCJ3bhV8Du/gtH62qoyAv8Is/SkreRb7ue1Bsu oyFTg0dnWoqMkVmLWNmAwAS5hpKgZ5NORy6s/bTYhWeKXDdRPSLkmyEzun13 9rseQqZtvztATwXL3jMocewE8wpv2Pc+Bs9Pe49ytsB+i/IXkTLwvbW29WQF eCu5cCdDCXaQh+MK98DRWcdIpZi52lbMag0ypRIHTqWkefQQwIGH52LnD4JJ 3FaJjSV4OCcVl+QMvtRD8nDng8NkjWk67eBfrD9YdLOyQI63P3Wk4hr4QXBo JsvUEtnpxGqrQT04scBn2sPYCnlX0LxsdhxcHIdXaFSAgy5HuGdJwBYDt7Nk T8D4mcirzq/BGxuEPv42uOWOi3buDjgmM+qTr5VgxnzqVuUe2IR1sbIWs1bb hrnbKHK7jgM/0+6ab98H9i0nJo2TwPfp0apVA7DbfkHehQDw3b1zmg5C8E8S r9VSsg3y0KG4kZJycEE3t/4VwRZ5Y42aa+oHDrWYjQgtBefrbHImxeC2NS0P r4dgz8hLR7NnwFOPaY7dy2AT4kvbICk4zvua5aYcTHxVXN//BtyRzTMTqsC4 8dCIVA07tR2YXBrnapgmuCXBc9ZLC6zoOmJ8WAfsFk4SvGSDMzVXxr/JARta uUZbY/bIZz8P3iZ8CZaWEHiGSrB/ykoHYQ/ceXxMrlKB/wYXyPvG "]]}}, {RGBColor[1, 0, 0], PointSize[Large], PointBox[{{0, 0}, {1, 1}, {2, 2}, {4, 4}, {7, 7}, {10, 10}, {11, 11}, { 13, 13}}]}}, AspectRatio->NCache[GoldenRatio^(-1), 0.6180339887498948], Axes->True, AxesOrigin->{2., 0}, PlotRange->{{1, 13}, {0., 13.}}, PlotRangeClipping->True, PlotRangePadding->{ Scaled[0.02], Scaled[0.02]}], TraditionalForm]], "Output", CellChangeTimes->{{3.401199458328125*^9, 3.401199470328125*^9}, { 3.401199513796875*^9, 3.40119953271875*^9}}] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell["Large example", "Subsubsection", CellChangeTimes->{{3.40119955790625*^9, 3.401199559421875*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data", "=", RowBox[{"Sort", "@", RowBox[{"RandomReal", "[", RowBox[{"10", ",", RowBox[{"10", "^", "5"}]}], "]"}]}]}], ";"}]], "Input", CellChangeTimes->{{3.40092687253125*^9, 3.40092689584375*^9}, { 3.400927022328125*^9, 3.40092704475*^9}, {3.40109110246875*^9, 3.40109110471875*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{"Timing", "[", RowBox[{"nf", "=", RowBox[{"Nearest", "[", "data", "]"}]}], "]"}], "\[IndentingNewLine]", RowBox[{"Timing", "[", RowBox[{"if", "=", RowBox[{"makeinterp", "[", "data", "]"}]}], "]"}]}], "Input", CellChangeTimes->{{3.40119887984375*^9, 3.401198905265625*^9}, { 3.40119921825*^9, 3.401199231296875*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"1.124100812432971`*^-15", ",", TagBox[ RowBox[{"NearestFunction", "[", RowBox[{ RowBox[{"{", RowBox[{"100000", ",", "1"}], "}"}], ",", InterpretationBox[ RowBox[{"\<\"<\"\>", "\[InvisibleSpace]", "\<\">\"\>"}], SequenceForm["<", ">"], Editable->False]}], "]"}], False, Editable->False]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.401198886875*^9, 3.40119890571875*^9}, 3.40119923253125*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.5309999999999994`", ",", TagBox[ RowBox[{"InterpolatingFunction", "[", RowBox[{ RowBox[{"(", "\[NoBreak]", GridBox[{ {"0.00005519798679021193`", "9.999930946606888`"} }, GridBoxAlignment->{ "Columns" -> {{Left}}, "ColumnsIndexed" -> {}, "Rows" -> {{Baseline}}, "RowsIndexed" -> {}}, GridBoxSpacings->{"Columns" -> { Offset[0.27999999999999997`], { Offset[0.7]}, Offset[0.27999999999999997`]}, "ColumnsIndexed" -> {}, "Rows" -> { Offset[0.2], { Offset[0.4]}, Offset[0.2]}, "RowsIndexed" -> {}}], "\[NoBreak]", ")"}], ",", "\<\"<>\"\>"}], "]"}], False, Editable->False]}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{{3.401198886875*^9, 3.40119890571875*^9}, 3.401199233140625*^9}] }, Open ]], Cell["A secondary data source:", "Text", CellChangeTimes->{{3.401199248109375*^9, 3.401199251640625*^9}}], Cell[BoxData[ RowBox[{ RowBox[{"data2", "=", RowBox[{"RandomReal", "[", RowBox[{ RowBox[{"{", RowBox[{".01", ",", "9.99"}], "}"}], ",", RowBox[{"10", "^", "4"}]}], "]"}]}], ";"}]], "Input", CellChangeTimes->{{3.4008813370201683`*^9, 3.400881365129363*^9}, { 3.4008814845817237`*^9, 3.4008814918941765`*^9}}], Cell["And some timings:", "Text", CellChangeTimes->{{3.401199288796875*^9, 3.40119929215625*^9}}], Cell[CellGroupData[{ Cell[BoxData[{ RowBox[{ RowBox[{ RowBox[{"r1", "=", RowBox[{"Table", "[", RowBox[{ RowBox[{"nf", "[", "i", "]"}], ",", RowBox[{"{", RowBox[{"i", ",", "data2"}], "}"}]}], "]"}]}], ";"}], "//", "Timing"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"r2", "=", RowBox[{"if", "/@", "data2"}]}], ";"}], "//", "Timing"}]}], "Input", CellChangeTimes->{{3.40119929396875*^9, 3.40119931609375*^9}}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"3.844000000000001`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401199319984375*^9}], Cell[BoxData[ FormBox[ RowBox[{"{", RowBox[{"0.07800000000000344`", ",", "Null"}], "}"}], TraditionalForm]], "Output", CellChangeTimes->{3.401199320140625*^9}] }, Open ]], Cell[CellGroupData[{ Cell[BoxData[ RowBox[{"Max", "[", RowBox[{"Abs", "[", RowBox[{"r1", "-", "r2"}], "]"}], "]"}]], "Input", CellChangeTimes->{{3.40119931728125*^9, 3.4011993345*^9}}], Cell[BoxData[ FormBox["0.`", TraditionalForm]], "Output", CellChangeTimes->{{3.401199320484375*^9, 3.401199352234375*^9}}] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]", ButtonBox["\[ThickSpace]\[ThickSpace]\[ThickSpace]\[FilledRightTriangle]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPageNext"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowNextSlideText"], ButtonFrame->"None"] }], "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell["", "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[TextData[StyleBox["Conclusion", FontColor->RGBColor[0., 0.254032196536202, 0.7862973983367666]]], "Section", CellChangeTimes->{ 3.3979193720200853`*^9, {3.4008535116523495`*^9, 3.4008535128090353`*^9}, { 3.4008812152553225`*^9, 3.4008812189271736`*^9}}], Cell["\<\ In conclusion, my primary message is to try to incorporate PackedArrays into \ your solutions, and use the tools I've presented to make sure that unpacking \ doesn't occur. And of course, try to learn what system and internal functions \ are available to use as tools.\ \>", "Text", CellChangeTimes->{{3.401195020578125*^9, 3.401195150375*^9}, { 3.401204320453125*^9, 3.401204322125*^9}}], Cell[TextData[{ "When this talk is uploaded to the library, I will include the URLs of all \ of the quoted ", StyleBox["MathGroup", FontSlant->"Italic"], " threads." }], "Text", CellChangeTimes->{{3.4011951659375*^9, 3.401195204015625*^9}}] }, Open ]], Cell[TextData[{ ButtonBox["\[FilledLeftTriangle]\[ThickSpace]\[ThickSpace]\[ThickSpace]", BaseStyle->"SlidePreviousNextLink", ButtonFunction:>FrontEndExecute[{ FrontEndToken[ FrontEnd`ButtonNotebook[], "ScrollPagePrevious"]}], ButtonNote->FEPrivate`FrontEndResource[ "FEStrings", "SlideshowPrevSlideText"], ButtonFrame->"None"], "\[ThickSpace]\[ThickSpace]|\[ThickSpace]\[ThickSpace]" }], "PreviousNext", CellGroupingRules->"SectionGrouping", CellChangeTimes->{3.398441849219604*^9}] }, Open ]] }, ScreenStyleEnvironment->"SlideShow", EvaluationCompletionAction->"ShowTiming", WindowSize->{1020, 665}, WindowMargins->{{Automatic, 0}, {Automatic, 0}}, ShowSelection->True, Magnification->1., FrontEndVersion->"6.0 for Microsoft Windows (32-bit) (June 19, 2007)", StyleDefinitions->Notebook[{ Cell[ StyleData[StyleDefinitions -> "Default.nb"]], Cell[ StyleData["Notebook"], DockedCells -> { FEPrivate`FrontEndResource["FEExpressions", "SlideshowToolbar"], Cell[ GraphicsData[ "CompressedBitmap", "eJztvQd8VVeSJ3y54b0HGJA7udNua2Z6OkwH2z0dHBE2GRTIUSCJICQRRMbY\n\ WGAwWSJHgSSQyEFkDLbB2W13N+1OMzs9227v7PR+u9+3pmdm95ud6ZmWz9a/\n\ 6pwbnp4iwjY2+v3q6KZ3863/v+rUqcoqmF80dWbB/OLJBen95xbMLiqePC+9\n\ X+lcWuR0sixXWZZ1b7qFaUzqRuHfN3m6h7KcuLLu/Jrq9CfZyv7mNOV8o1A5\n\ f1Go3K9PJZmivK9NVt5XJ6nYVwpU/M/zVfzLecr77nxl9y+3bGWN3m851O5T\n\ 1igWzI3aRwceWUNrR1bT1IhqWja8yoqr9MnbVOm6Jera5QLV8PNhquFnQ0hy\n\ SLJpXw1vZdEZN7yVqRp+OphkoGq4NoAWX+tv3aUaftKPpC9JH9Xw40dJHiHp\n\ pRp+lEHSk+Qh1fAm5AGS+1XDG/eR/EA1/PD7JN9Vf/zhX6o/vv4dkntJ7lF/\n\ fO1ukm+TfJMO/cdXv2F51P6F+uMrX1fXTjysKjaMVjmz5+ISB22nZiA32zxl\n\ DdhG19R/KzX9ttCyvltoqu9mmurDzSa62N6baKr3RlrxKJpHNtCyXhtoWa8K\n\ usJOGRXKDsRRds9yum1Oz3LlitCc+/B6W3loYg+td6hZZ6v4g+vo54kH16nE\n\ A2uN2KrzA2td1eX+tZ7qet+a7uqOH6zugakeWBbH2ji2S+CHCewjgb3FsN8E\n\ jhDHsRI4bALnEMfpxHFiCZxpHCedwOn3wIX0wCXFcXFoNsVxwZ1x6T1wE+K4\n\ HT1wY3rgFnXHzUrgtqHZ3h238i5lDd5Bs5k78aZk7cSUmZN2cLDMxhyWDaL5\n\ gSQDeG7ALlrRfxcm++2iQ7LQ60VztOf+u2lqQCUeVyXd/IF7YvR7NIP3dqW9\n\ VuGweCOzq2mTnBqaytlHzRBu9lMzFM2wWvrt8Dr62YgDNDvyIN7rQ3jhuTlM\n\ zRhujtCKsUdpatxRmhp3jN4ja/wxkuOB5B7HueaesOj0JpxQPR9byTKjolg9\n\ sTVPrds9Sl2qv19drr/fUf/y5idi6l9+9AlP/cuP74yrf/3JnTH1r9fudNS/\n\ /pSaP7x15x3qDz+7k/b3h5/fqf7tFyw0R21M/dsv73TVv/0qzVb//ldpMfXv\n\ f50WV//+n9Jo9b//TZr6469Z8Lr/Ou0u9ce/pe2uvPQwra2oz1NlR0pUae0C\n\ WpuxcSddzoJX6AbMf5nOeN5LdPJzX6TrmvMCrZhzlZrZV3Gds1/AbCClV/HI\n\ Sq9Y3ZQ16zllzbhM8oyySs4pq+iMsqadUlbhSWVNoXsyme7R5CPKmnRYWQWH\n\ 8R+/nYS7O+kwHbrgEB0g/yBN5eEBTKyjFRNraSr/AG5mfh2tgPBcwUGLt8Za\n\ kQKSSQexy4KDNhahqYNGNGtFzLq8OtpNHh76xP00O2EfGqiwXDTj8a6Mr8LP\n\ x1WR7DVCi8fuxeKxe+it2G2EFo/iZifOa+QOeotCMnw7znnYNm630lsH2YK9\n\ UIv3cQvJZgjPbaYV2VArWRutNGo30FtcITKonF5wyDqZzqR1QzbLEcfTCU6u\n\ VVYx3eRZdNPnnqaHeo5OauE57HYBPZN5ZyC4SXNP06I5p+lIc07R1OxTNFVa\n\ b+OXNDXzBE3NOE5TM47R2unHaKoEr3sx3v6iw8AUApO/YEihU+zxp8r6D48q\n\ 69slqtO3i1WnbxY1Cy3u9xcop+9aOm26t2Pw9bUKVawuAijry9S1Zyerhl+M\n\ JFAZQTI8GVyaxZYvamzp0wK2PNgebFHvPv8ddbI6S+UtnqnSx62B9nNvQ0rH\n\ Q0oPAIYHRKF7kr2T9HbWLprN3IXPajAhxCCSgSy46/g4B+x2fbTACzawEmgB\n\ wRehcSMO3OgC3HCBG9h5NTbOrgF4QKwkBLGBIFg4tBYwArEYS+IpsARrRh8G\n\ lhhJhSkOYAS6iJsTDlAEmuokFBe+0vxTdMAvzdyjej6xRmUtL6MLWLKjgJYd\n\ O9pHXT79gHrzmbvpUB2BKDEgig1AcYEj6RpHXnyYNF3FyYmq7HCxyqssUxkV\n\ 29Xdq/bhAue95AJAoFxegJq5Cg3DzRWH4eJOap8nXXNFhKdJZkIMjFwilUNQ\n\ UnyeYITUViFByZQTJD6MiK5nbDiIKUYKN4ohaGqh2bmBpsnlR5VLWmY8C34x\n\ voYe/TgombFVeBx7sckYKHgWpr170IBfjNpNG4/cBaKwE495B8ju9hj0O71/\n\ Q7fit6LgjXpvScmjwZedyU0FOPogo+vX08sKWSs6fzAtz9lEh95OZ00nl0/X\n\ MO0QdDUUuVHu88/iEPPO0kM4A1WPuRtQ8181lkPnTyvrCw8r61tTlXXPdGXd\n\ PV1U/rdSq3znvkXK7kdnPaoad7lVit7Cfa1W6VN2qNLyZerac1NVwy9Hk64f\n\ ZUPh0+r2qPy7Qiq/d8sq/42WVf61+kdVxcZclVHyBBD/tpK/eUo+DiWf0Po9\n\ m62AnF2YMnPZu/AF8WQmLcwkRjZ4N9sS0PqDfF0/CKJ1fdzX9Z2h671W6npW\n\ 8/tF1Q+txa7CdoMb1fVuCvVus8ngJpsMga63fV0PfloP7YYvtwBUbdIZWjv5\n\ LL1wPZ9cp3qWrVMT1i9US3ZNUuurx9DJPHv2ATrB//H6F6DzofJpyw5T/F83\n\ iv8hKP4TE1TZoSKVt5sUf/k2dffKatyMOS+4UXUv1oEXqHhfnsOtnPkc1s18\n\ lhQQ5DkzjX1Nf9aiF2E6QUEJQUHxBVJI56JQMOmoWBL5hwJTACYCmw7M729N\n\ AACBqcDrW259StN9QMA6gYH+a+X/IFqWTfR/OB1qLL3y+fTCFtKdmE4v1Ox6\n\ of/g+/M1DMw53Rb93wn6v5NKX7itk8rbOksjwZcNEsTp0dx1r7K+Pl5Z35ml\n\ rHtJ7pmhUaGkESrY352jOvVZw0iAb6G2FXBAtnPahEqVt3Klunp+pmr41XiS\n\ cYQGY9uKCIwGg6KI8Ol2IgLQ4Hs+IpzcN0zlPT5HpY9fx/6L+G0keH+QoAe0\n\ Ps1mQ8PnoMnejQ85m1R8lpE9tCBzj+credgIot+rRcdn11ipXEJNKnkPSt7z\n\ lTy/uocMn2eV0RZ1j8W5J9hBpAXKCt9lWO07UPsu1D6d/hSY81PP06HSZhxT\n\ PZeuVz2XwSu7pHIy7W3P4Rz17PkHWDpC438nqvFzSeNPU3m7lqiM9VtU+pNH\n\ rNapeIc1uiO0fjoLNqe2R7CsGDoedP8iKR6i/IWk66eSxppCmmwy3bMCrevz\n\ DkKrQ6ljjxP34yZO2A/9rv/faireAdFHsx5wN9Ao+TVaVtM8/R+0TvxAw0LK\n\ fupBqGwoe4Auk/zSenH9zDzBtz6lese9Lz6icsofUxVHhqtrr30Tj9nqpK5c\n\ +b5W83/Kap5O51PfUNaXs5VF6tv67mxl/eXsptU9revUeyXdJ9jRLWl49pLV\n\ kILfQwp+tao/OVc1/NUE9An8KpfWpVD2VlTbk6b/+dBWa/tYU9rehqonpEml\n\ 7N++/Kiq3j1O5cx7zNPa57Zyf3+VexzKHQ1zeCj3HAh/rTn4WrOh47P4W86q\n\ gnpnFe8aj38Nq3c04BQhj39tk0rd9p390A9HXF+VW+yZ0Zr8mBW4aNyWVbcH\n\ 1Y2fTIVaO886nDU5NYUXaPm0izB8i6D8nmFF+KWFtarnigqVvXaFrZ6smkI/\n\ Pn66r3ru4oPqR1fupY3br9Yf4O/dUe/+8gvqygsPQuhkyg4W0rKcTatUxtrN\n\ Kn3JoRT83MhlrJt+mS5t+iVMlhhfzTO4Kmrd4FrkemxMQN9jcSFuALHSKaTf\n\ J5O2mkR3tOAI3TvC0okHtB7fFyhw/M9lqB6/75bQ5OiFWgejc631SdHj/VaL\n\ 9F0lOn0g6fjsCk3ed2nyfhDqWRQ4FDlIfKDQocmtQJWjZ4k2zli1QuVtK1Vl\n\ tbmq6tRA/p+xcjl4ux3y4HzJKPSun1HWnw0kZT5TWd+fp6zvzW1auf9lKX3c\n\ K+hOwYE6Dt7MZrS6zW1M5ZRVqOqDi1XDXxeQ5JNWnwjNHlHsrNTbqNg/mazY\n\ oddJ+jXD48HhH9adxA+qa2cz1dL1ReqeKatwtuIvSO6PvK3jPxgdn4Bm70of\n\ XyX3iu2BejcC9Y1+txzujsshFT+kWv7n7POg1W0m7W6YtKdQ8eyccaMqntm6\n\ F/a9jxffO/PH44afW7av4r2oireh4r1mVHwhyDrpeFLxF1jN22hZHXqsKh3h\n\ vqxCRZlepm/77rJK1fPpTSp7/Ur1ZPVU9WTNVHXibD/13KUH1Y9fuNduparv\n\ rVX9b37y56zqT17qC1VfN5WWZazZqDJWb1Rpc+vZ3SLq3IYmt/0zu6gV+UXg\n\ ALVp5jpCckGuL6LVT9F9oVuXT+psotbqufRQxu+H/mYbjLtVqyE8d2uocxfs\n\ 3PqscHLo8f5ap/ch4tuXpN8qrduTHTPQ7UdYj6ctqCWIXanyds5RZQcmqKoz\n\ g9SVqz9QVacHqdI9hSr9sR12Sjf8F40Sd+lr+dz3SFkXKev+Rcq6b4GyfjC/\n\ aYXes4xOaIuXSonHfSV+z6ztqvrQE+r6W0Wq4T9NJuU9CZr5r/OtzkaJQ4dr\n\ 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\n\ 307o/EF6MCt14zJEWlan/wuBMI8S"], "ConferenceGraphicCell", ImageSize -> {1279, 49}, ImageMargins -> 0]}, CellBracketOptions -> { "Color" -> RGBColor[0.739193, 0.750317, 0.747173]}], Cell[ GraphicsData[ "CompressedBitmap", "eJztvQd8VVeSJ3y54b0HGJA7udNua2Z6OkwH2z0dHBE2GRTIUSCJICQRRMbY\n\ WGAwWSJHgSSQyEFkDLbB2W13N+1OMzs9227v7PR+u9+3pmdm95ud6ZmWz9a/\n\ 6pwbnp4iwjY2+v3q6KZ3863/v+rUqcoqmF80dWbB/OLJBen95xbMLiqePC+9\n\ X+lcWuR0sixXWZZ1b7qFaUzqRuHfN3m6h7KcuLLu/Jrq9CfZyv7mNOV8o1A5\n\ f1Go3K9PJZmivK9NVt5XJ6nYVwpU/M/zVfzLecr77nxl9y+3bGWN3m851O5T\n\ 1igWzI3aRwceWUNrR1bT1IhqWja8yoqr9MnbVOm6Jera5QLV8PNhquFnQ0hy\n\ SLJpXw1vZdEZN7yVqRp+OphkoGq4NoAWX+tv3aUaftKPpC9JH9Xw40dJHiHp\n\ pRp+lEHSk+Qh1fAm5AGS+1XDG/eR/EA1/PD7JN9Vf/zhX6o/vv4dkntJ7lF/\n\ fO1ukm+TfJMO/cdXv2F51P6F+uMrX1fXTjysKjaMVjmz5+ISB22nZiA32zxl\n\ DdhG19R/KzX9ttCyvltoqu9mmurDzSa62N6baKr3RlrxKJpHNtCyXhtoWa8K\n\ usJOGRXKDsRRds9yum1Oz3LlitCc+/B6W3loYg+td6hZZ6v4g+vo54kH16nE\n\ A2uN2KrzA2td1eX+tZ7qet+a7uqOH6zugakeWBbH2ji2S+CHCewjgb3FsN8E\n\ jhDHsRI4bALnEMfpxHFiCZxpHCedwOn3wIX0wCXFcXFoNsVxwZ1x6T1wE+K4\n\ HT1wY3rgFnXHzUrgtqHZ3h238i5lDd5Bs5k78aZk7cSUmZN2cLDMxhyWDaL5\n\ gSQDeG7ALlrRfxcm++2iQ7LQ60VztOf+u2lqQCUeVyXd/IF7YvR7NIP3dqW9\n\ VuGweCOzq2mTnBqaytlHzRBu9lMzFM2wWvrt8Dr62YgDNDvyIN7rQ3jhuTlM\n\ zRhujtCKsUdpatxRmhp3jN4ja/wxkuOB5B7HueaesOj0JpxQPR9byTKjolg9\n\ sTVPrds9Sl2qv19drr/fUf/y5idi6l9+9AlP/cuP74yrf/3JnTH1r9fudNS/\n\ /pSaP7x15x3qDz+7k/b3h5/fqf7tFyw0R21M/dsv73TVv/0qzVb//ldpMfXv\n\ f50WV//+n9Jo9b//TZr6469Z8Lr/Ou0u9ce/pe2uvPQwra2oz1NlR0pUae0C\n\ WpuxcSddzoJX6AbMf5nOeN5LdPJzX6TrmvMCrZhzlZrZV3Gds1/AbCClV/HI\n\ Sq9Y3ZQ16zllzbhM8oyySs4pq+iMsqadUlbhSWVNoXsyme7R5CPKmnRYWQWH\n\ 8R+/nYS7O+kwHbrgEB0g/yBN5eEBTKyjFRNraSr/AG5mfh2tgPBcwUGLt8Za\n\ kQKSSQexy4KDNhahqYNGNGtFzLq8OtpNHh76xP00O2EfGqiwXDTj8a6Mr8LP\n\ x1WR7DVCi8fuxeKxe+it2G2EFo/iZifOa+QOeotCMnw7znnYNm630lsH2YK9\n\ UIv3cQvJZgjPbaYV2VArWRutNGo30FtcITKonF5wyDqZzqR1QzbLEcfTCU6u\n\ VVYx3eRZdNPnnqaHeo5OauE57HYBPZN5ZyC4SXNP06I5p+lIc07R1OxTNFVa\n\ b+OXNDXzBE3NOE5TM47R2unHaKoEr3sx3v6iw8AUApO/YEihU+zxp8r6D48q\n\ 69slqtO3i1WnbxY1Cy3u9xcop+9aOm26t2Pw9bUKVawuAijry9S1Zyerhl+M\n\ JFAZQTI8GVyaxZYvamzp0wK2PNgebFHvPv8ddbI6S+UtnqnSx62B9nNvQ0rH\n\ Q0oPAIYHRKF7kr2T9HbWLprN3IXPajAhxCCSgSy46/g4B+x2fbTACzawEmgB\n\ wRehcSMO3OgC3HCBG9h5NTbOrgF4QKwkBLGBIFg4tBYwArEYS+IpsARrRh8G\n\ lhhJhSkOYAS6iJsTDlAEmuokFBe+0vxTdMAvzdyjej6xRmUtL6MLWLKjgJYd\n\ O9pHXT79gHrzmbvpUB2BKDEgig1AcYEj6RpHXnyYNF3FyYmq7HCxyqssUxkV\n\ 29Xdq/bhAue95AJAoFxegJq5Cg3DzRWH4eJOap8nXXNFhKdJZkIMjFwilUNQ\n\ UnyeYITUViFByZQTJD6MiK5nbDiIKUYKN4ohaGqh2bmBpsnlR5VLWmY8C34x\n\ voYe/TgombFVeBx7sckYKHgWpr170IBfjNpNG4/cBaKwE495B8ju9hj0O71/\n\ Q7fit6LgjXpvScmjwZedyU0FOPogo+vX08sKWSs6fzAtz9lEh95OZ00nl0/X\n\ MO0QdDUUuVHu88/iEPPO0kM4A1WPuRtQ8181lkPnTyvrCw8r61tTlXXPdGXd\n\ PV1U/rdSq3znvkXK7kdnPaoad7lVit7Cfa1W6VN2qNLyZerac1NVwy9Hk64f\n\ ZUPh0+r2qPy7Qiq/d8sq/42WVf61+kdVxcZclVHyBBD/tpK/eUo+DiWf0Po9\n\ m62AnF2YMnPZu/AF8WQmLcwkRjZ4N9sS0PqDfF0/CKJ1fdzX9Z2h671W6npW\n\ 8/tF1Q+txa7CdoMb1fVuCvVus8ngJpsMga63fV0PfloP7YYvtwBUbdIZWjv5\n\ LL1wPZ9cp3qWrVMT1i9US3ZNUuurx9DJPHv2ATrB//H6F6DzofJpyw5T/F83\n\ iv8hKP4TE1TZoSKVt5sUf/k2dffKatyMOS+4UXUv1oEXqHhfnsOtnPkc1s18\n\ lhQQ5DkzjX1Nf9aiF2E6QUEJQUHxBVJI56JQMOmoWBL5hwJTACYCmw7M729N\n\ AACBqcDrW259StN9QMA6gYH+a+X/IFqWTfR/OB1qLL3y+fTCFtKdmE4v1Ox6\n\ of/g+/M1DMw53Rb93wn6v5NKX7itk8rbOksjwZcNEsTp0dx1r7K+Pl5Z35ml\n\ rHtJ7pmhUaGkESrY352jOvVZw0iAb6G2FXBAtnPahEqVt3Klunp+pmr41XiS\n\ cYQGY9uKCIwGg6KI8Ol2IgLQ4Hs+IpzcN0zlPT5HpY9fx/6L+G0keH+QoAe0\n\ Ps1mQ8PnoMnejQ85m1R8lpE9tCBzj+credgIot+rRcdn11ipXEJNKnkPSt7z\n\ lTy/uocMn2eV0RZ1j8W5J9hBpAXKCt9lWO07UPsu1D6d/hSY81PP06HSZhxT\n\ PZeuVz2XwSu7pHIy7W3P4Rz17PkHWDpC438nqvFzSeNPU3m7lqiM9VtU+pNH\n\ rNapeIc1uiO0fjoLNqe2R7CsGDoedP8iKR6i/IWk66eSxppCmmwy3bMCrevz\n\ DkKrQ6ljjxP34yZO2A/9rv/faireAdFHsx5wN9Ao+TVaVtM8/R+0TvxAw0LK\n\ fupBqGwoe4Auk/zSenH9zDzBtz6lese9Lz6icsofUxVHhqtrr30Tj9nqpK5c\n\ +b5W83/Kap5O51PfUNaXs5VF6tv67mxl/eXsptU9revUeyXdJ9jRLWl49pLV\n\ kILfQwp+tao/OVc1/NUE9An8KpfWpVD2VlTbk6b/+dBWa/tYU9rehqonpEml\n\ 7N++/Kiq3j1O5cx7zNPa57Zyf3+VexzKHQ1zeCj3HAh/rTn4WrOh47P4W86q\n\ gnpnFe8aj38Nq3c04BQhj39tk0rd9p390A9HXF+VW+yZ0Zr8mBW4aNyWVbcH\n\ 1Y2fTIVaO886nDU5NYUXaPm0izB8i6D8nmFF+KWFtarnigqVvXaFrZ6smkI/\n\ Pn66r3ru4oPqR1fupY3br9Yf4O/dUe/+8gvqygsPQuhkyg4W0rKcTatUxtrN\n\ Kn3JoRT83MhlrJt+mS5t+iVMlhhfzTO4Kmrd4FrkemxMQN9jcSFuALHSKaTf\n\ J5O2mkR3tOAI3TvC0okHtB7fFyhw/M9lqB6/75bQ5OiFWgejc631SdHj/VaL\n\ 9F0lOn0g6fjsCk3ed2nyfhDqWRQ4FDlIfKDQocmtQJWjZ4k2zli1QuVtK1Vl\n\ tbmq6tRA/p+xcjl4ux3y4HzJKPSun1HWnw0kZT5TWd+fp6zvzW1auf9lKX3c\n\ K+hOwYE6Dt7MZrS6zW1M5ZRVqOqDi1XDXxeQ5JNWnwjNHlHsrNTbqNg/mazY\n\ oddJ+jXD48HhH9adxA+qa2cz1dL1ReqeKatwtuIvSO6PvK3jPxgdn4Bm70of\n\ XyX3iu2BejcC9Y1+txzujsshFT+kWv7n7POg1W0m7W6YtKdQ8eyccaMqntm6\n\ F/a9jxffO/PH44afW7av4r2oireh4r1mVHwhyDrpeFLxF1jN22hZHXqsKh3h\n\ vqxCRZlepm/77rJK1fPpTSp7/Ur1ZPVU9WTNVHXibD/13KUH1Y9fuNduparv\n\ rVX9b37y56zqT17qC1VfN5WWZazZqDJWb1Rpc+vZ3SLq3IYmt/0zu6gV+UXg\n\ ALVp5jpCckGuL6LVT9F9oVuXT+psotbqufRQxu+H/mYbjLtVqyE8d2uocxfs\n\ 3PqscHLo8f5ap/ch4tuXpN8qrduTHTPQ7UdYj6ctqCWIXanyds5RZQcmqKoz\n\ g9SVqz9QVacHqdI9hSr9sR12Sjf8F40Sd+lr+dz3SFkXKev+Rcq6b4GyfjC/\n\ aYXes4xOaIuXSonHfSV+z6ztqvrQE+r6W0Wq4T9NJuU9CZr5r/OtzkaJQ4dr\n\ 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\n\ 307o/EF6MCt14zJEWlan/wuBMI8S"], "ConferenceGraphicCell", ImageSize -> {1279, 49}, ImageMargins -> 0], Cell[ BoxData[ RowBox[{ RowBox[{"(*", RowBox[{ "Evaluate", " ", "the", " ", "following", " ", "to", " ", "copy", " ", "the", " ", "style", " ", "of", " ", "the", " ", "cell", " ", "above", " ", "into", " ", "\[IndentingNewLine]", "the", " ", "docked", " ", "cell", " ", "style", " ", "of", " ", RowBox[{"the", " ", "'"}], RowBox[{"Notebook", "'"}], " ", "definition", " ", RowBox[{"(", RowBox[{"2", " ", "cells", " ", "above"}], ")"}], " ", "\[IndentingNewLine]", "These", " ", "two", " ", "cell", " ", "can", " ", "be", " ", "removed", " ", "once", " ", "the", " ", "docked", " ", "cell", " ", "is", " ", RowBox[{"created", "."}]}], "\[IndentingNewLine]", "*)"}], "\[IndentingNewLine]", RowBox[{ RowBox[{ RowBox[{"SelectionMove", "[", RowBox[{ RowBox[{"SelectedNotebook", "[", "]"}], ",", "Previous", ",", "Cell", ",", "2"}], "]"}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"celldata", "=", RowBox[{"NotebookRead", "[", RowBox[{"SelectedNotebook", "[", "]"}], "]"}]}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"SelectionMove", "[", RowBox[{ RowBox[{"SelectedNotebook", "[", "]"}], ",", "Previous", ",", "Cell", ",", "1"}], "]"}], ";"}], "\[IndentingNewLine]", RowBox[{ RowBox[{"SetOptions", "[", RowBox[{ RowBox[{"NotebookSelection", "[", RowBox[{"SelectedNotebook", "[", "]"}], "]"}], ",", RowBox[{"DockedCells", "\[Rule]", RowBox[{"{", RowBox[{ RowBox[{"FEPrivate`FrontEndResource", "[", RowBox[{ "\"FEExpressions\"", ",", "\"SlideshowToolbar\""}], "]"}], ",", "celldata"}], "}"}]}]}], "]"}], ";"}]}]}]], "Input", CellChangeTimes -> {{3.38831364079608*^9, 3.388313648848673*^9}, { 3.388313705453738*^9, 3.388313712402935*^9}, {3.388313761332337*^9, 3.388313848299779*^9}, {3.388313886630456*^9, 3.388314048491518*^9}, { 3.3883140891684637`*^9, 3.3883141188834057`*^9}, {3.388316871550132*^9, 3.388316908611515*^9}, {3.3883170423920717`*^9, 3.3883170826776247`*^9}, {3.388317794784313*^9, 3.388317972980825*^9}, { 3.388318143311693*^9, 3.3883181457005157`*^9}, {3.38831883644632*^9, 3.3883188696857367`*^9}, {3.388318945630301*^9, 3.388318948563595*^9}, { 3.388319004342214*^9, 3.38831900651579*^9}, {3.388319058805889*^9, 3.388319098014468*^9}, {3.388319134493579*^9, 3.388319170214745*^9}, { 3.3883194184532957`*^9, 3.388319465324798*^9}, {3.388319542581661*^9, 3.3883195480769463`*^9}, {3.388319947903751*^9, 3.388319948372787*^9}, { 3.388320318629324*^9, 3.388320350829337*^9}, {3.388830915896137*^9, 3.388830957727977*^9}, {3.388831030559073*^9, 3.388831031198735*^9}}, FontWeight -> "Bold"], Cell[ CellGroupData[{ Cell[ StyleData["Title"], CellMargins -> {{27, Inherited}, {10, 30}}, CellGroupingRules -> {"TitleGrouping", 0}, PageBreakBelow -> False, DefaultNewInlineCellStyle -> "None", InputAutoReplacements -> {"TeX" -> StyleBox[ RowBox[{"T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "LaTeX" -> StyleBox[ RowBox[{"L", StyleBox[ AdjustmentBox[ "A", BoxMargins -> {{-0.36, -0.1}, {0, 0}}, BoxBaselineShift -> -0.2], FontSize -> Smaller], "T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "mma" -> "Mathematica", "Mma" -> "Mathematica", "MMA" -> "Mathematica", "gridMathematica" -> FormBox[ RowBox[{"grid", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], "webMathematica" -> FormBox[ RowBox[{"web", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], Inherited}, LineSpacing -> {1, 11}, LanguageCategory -> "NaturalLanguage", CounterIncrements -> "Title", CounterAssignments -> {{"Section", 0}, {"Equation", 0}, { "Figure", 0}, {"Subtitle", 0}, {"Subsubtitle", 0}}, FontFamily -> "Helvetica", FontSize -> 36, FontWeight -> "Bold", FontColor -> RGBColor[0.796078, 0.0705882, 0]], Cell[ StyleData["Title", "Presentation"], CellMargins -> {{72, 50}, {10, 80}}, LineSpacing -> {1, 0}, FontSize -> 45], Cell[ StyleData["Title", "SlideShow"], CellMargins -> {{72, 50}, {10, 80}}, FontSize -> 45], Cell[ StyleData["Title", "Printout"], CellMargins -> {{2, 10}, {12, 30}}, FontSize -> 24]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Subtitle"], CellMargins -> {{60, Inherited}, {20, 15}}, CellGroupingRules -> {"TitleGrouping", 10}, PageBreakBelow -> False, DefaultNewInlineCellStyle -> "None", InputAutoReplacements -> {"TeX" -> StyleBox[ RowBox[{"T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "LaTeX" -> StyleBox[ RowBox[{"L", StyleBox[ AdjustmentBox[ "A", BoxMargins -> {{-0.36, -0.1}, {0, 0}}, BoxBaselineShift -> -0.2], FontSize -> Smaller], "T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "mma" -> "Mathematica", "Mma" -> "Mathematica", "MMA" -> "Mathematica", "gridMathematica" -> FormBox[ RowBox[{"grid", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], "webMathematica" -> FormBox[ RowBox[{"web", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], Inherited}, LanguageCategory -> "NaturalLanguage", CounterIncrements -> "Subtitle", CounterAssignments -> {{"Section", 0}, {"Equation", 0}, { "Figure", 0}, {"Subsubtitle", 0}}, FontFamily -> "Helvetica", FontSize -> 24], Cell[ StyleData["Subtitle", "Presentation"], LineSpacing -> {1, 0}, FontSize -> 30], Cell[ StyleData["Subtitle", "SlideShow"], FontSize -> 30], Cell[ StyleData["Subtitle", "Printout"], CellMargins -> {{2, 10}, {12, 8}}, FontSize -> 18]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Subsubtitle"], CellMargins -> {{27, Inherited}, {8, 2}}, CellGroupingRules -> {"TitleGrouping", 20}, PageBreakBelow -> False, DefaultNewInlineCellStyle -> "None", InputAutoReplacements -> {"TeX" -> StyleBox[ RowBox[{"T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "LaTeX" -> StyleBox[ RowBox[{"L", StyleBox[ AdjustmentBox[ "A", BoxMargins -> {{-0.36, -0.1}, {0, 0}}, BoxBaselineShift -> -0.2], FontSize -> Smaller], "T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "mma" -> "Mathematica", "Mma" -> "Mathematica", "MMA" -> "Mathematica", "gridMathematica" -> FormBox[ RowBox[{"grid", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], "webMathematica" -> FormBox[ RowBox[{"web", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], Inherited}, LanguageCategory -> "NaturalLanguage", CounterIncrements -> "Subsubtitle", CounterAssignments -> {{"Section", 0}, {"Equation", 0}, {"Figure", 0}}, StyleMenuListing -> None, FontFamily -> "Helvetica", FontSize -> 16], Cell[ StyleData["Subsubtitle", "Presentation"], CellMargins -> {{54, 10}, {20, 20}}, LineSpacing -> {1, 0}, FontSize -> 24], Cell[ StyleData["Subsubtitle", "SlideShow"], CellMargins -> {{72, 25}, {30, 10}}], Cell[ StyleData["Subsubtitle", "Printout"], CellMargins -> {{2, 10}, {12, 8}}, FontSize -> 14]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Section"], CellMargins -> {{27, Inherited}, {8, 34}}, CellGroupingRules -> {"SectionGrouping", 30}, PageBreakBelow -> False, CellFrameMargins -> 4, DefaultNewInlineCellStyle -> "None", InputAutoReplacements -> {"TeX" -> StyleBox[ RowBox[{"T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "LaTeX" -> StyleBox[ RowBox[{"L", StyleBox[ AdjustmentBox[ "A", BoxMargins -> {{-0.36, -0.1}, {0, 0}}, BoxBaselineShift -> -0.2], FontSize -> Smaller], "T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "mma" -> "Mathematica", "Mma" -> "Mathematica", "MMA" -> "Mathematica", "gridMathematica" -> FormBox[ RowBox[{"grid", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], "webMathematica" -> FormBox[ RowBox[{"web", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], Inherited}, LineSpacing -> {1, 2}, LanguageCategory -> "NaturalLanguage", CounterIncrements -> "Section", CounterAssignments -> {{"Subsection", 0}, {"Subsubsection", 0}}, FontFamily -> "Helvetica", FontSize -> 20, FontWeight -> "Bold", FontColor -> RGBColor[0., 0.28628976882581825`, 0.745967803463798]], Cell[ StyleData["Section", "Presentation"], CellFrame -> {{0, 0}, {0, 2}}, ShowGroupOpener -> True, CellMargins -> {{72, 50}, {11, 30}}, CellFrameColor -> RGBColor[1, 0.796078, 0.501961], FontSize -> 30], Cell[ StyleData["Section", "SlideShow"], CellMargins -> {{71, 50}, {11, 35}}, FontSize -> 30], Cell[ StyleData["Section", "Printout"], CellMargins -> {{2, 0}, {7, 22}}, FontSize -> 14]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Subsection"], CellDingbat -> None, ShowGroupOpener -> True, CellMargins -> {{60, Inherited}, {28, 12}}, CellGroupingRules -> {"SectionGrouping", 40}, PageBreakBelow -> False, DefaultNewInlineCellStyle -> "None", InputAutoReplacements -> {"TeX" -> StyleBox[ RowBox[{"T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "LaTeX" -> StyleBox[ RowBox[{"L", StyleBox[ AdjustmentBox[ "A", BoxMargins -> {{-0.36, -0.1}, {0, 0}}, BoxBaselineShift -> -0.2], FontSize -> Smaller], "T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "mma" -> "Mathematica", "Mma" -> "Mathematica", "MMA" -> "Mathematica", "gridMathematica" -> FormBox[ RowBox[{"grid", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], "webMathematica" -> FormBox[ RowBox[{"web", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], Inherited}, LanguageCategory -> "NaturalLanguage", CounterIncrements -> "Subsection", CounterAssignments -> {{"Subsubsection", 0}}, FontFamily -> "Helvetica", FontSize -> 16, FontWeight -> "Bold", FontColor -> RGBColor[1., 0.8104829480430304, 0.]], Cell[ StyleData["Subsection", "Presentation"], CellMargins -> {{72, 50}, {6, 15}}, LineSpacing -> {1, 0}, FontSize -> 24], Cell[ StyleData["Subsection", "SlideShow"], CellMargins -> {{99, 50}, {8, 12}}, LineSpacing -> {1, 0}, FontSize -> 24], Cell[ StyleData["Subsection", "Printout"], CellMargins -> {{21, 0}, {8, 22}}, FontSize -> 12]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Subsubsection"], CellDingbat -> None, ShowGroupOpener -> True, CellMargins -> {{60, Inherited}, {2, 12}}, CellGroupingRules -> {"SectionGrouping", 50}, PageBreakBelow -> False, DefaultNewInlineCellStyle -> "None", InputAutoReplacements -> {"TeX" -> StyleBox[ RowBox[{"T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "LaTeX" -> StyleBox[ RowBox[{"L", StyleBox[ AdjustmentBox[ "A", BoxMargins -> {{-0.36, -0.1}, {0, 0}}, BoxBaselineShift -> -0.2], FontSize -> Smaller], "T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "mma" -> "Mathematica", "Mma" -> "Mathematica", "MMA" -> "Mathematica", "gridMathematica" -> FormBox[ RowBox[{"grid", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], "webMathematica" -> FormBox[ RowBox[{"web", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], Inherited}, LanguageCategory -> "NaturalLanguage", CounterIncrements -> "Subsubsection", FontFamily -> "Helvetica", FontWeight -> "Bold", FontColor -> RGBColor[0., 0.5434805828946364, 0.7793545433737697]], Cell[ StyleData["Subsubsection", "Presentation"], CellMargins -> {{72, 50}, {6, 20}}, LineSpacing -> {1, 0}, FontSize -> 18], Cell[ StyleData["Subsubsection", "SlideShow"], CellMargins -> {{99, 50}, {6, 20}}, FontSize -> 18], Cell[ StyleData["Subsubsection", "Printout"], CellMargins -> {{2, 0}, {7, 14}}, FontSize -> 11]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Text"], CellMargins -> {{60, 10}, {7, 7}}, InputAutoReplacements -> {"TeX" -> StyleBox[ RowBox[{"T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "LaTeX" -> StyleBox[ RowBox[{"L", StyleBox[ AdjustmentBox[ "A", BoxMargins -> {{-0.36, -0.1}, {0, 0}}, BoxBaselineShift -> -0.2], FontSize -> Smaller], "T", AdjustmentBox[ "E", BoxMargins -> {{-0.075, -0.085}, {0, 0}}, BoxBaselineShift -> 0.5], "X"}]], "mma" -> "Mathematica", "Mma" -> "Mathematica", "MMA" -> "Mathematica", "gridMathematica" -> FormBox[ RowBox[{"grid", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], "webMathematica" -> FormBox[ RowBox[{"web", AdjustmentBox[ StyleBox["Mathematica", FontSlant -> "Italic"], BoxMargins -> {{-0.175, 0}, {0, 0}}]}], TextForm], Inherited}, LineSpacing -> {1, 3}, CounterIncrements -> "Text", FontFamily -> "Helvetica"], Cell[ StyleData["Text", "Presentation"], CellMargins -> {{72, 50}, {10, 10}}, LineSpacing -> {1, 5}, FontSize -> 17], Cell[ StyleData["Text", "SlideShow"], CellMargins -> {{100, 50}, {10, 10}}, FontSize -> 17], Cell[ StyleData["Text", "Printout"], CellMargins -> {{2, 2}, {6, 6}}, TextJustification -> 0.5, Hyphenation -> True, FontSize -> 10]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["SmallText"], CellMargins -> {{60, 10}, {6, 6}}, DefaultNewInlineCellStyle -> "None", LineSpacing -> {1, 3}, LanguageCategory -> "NaturalLanguage", CounterIncrements -> "SmallText", FontFamily -> "Helvetica", FontSize -> 9], Cell[ StyleData["SmallText", "Presentation"], CellMargins -> {{72, 50}, {8, 8}}, LineSpacing -> {1, 5}, FontSize -> 10], Cell[ StyleData["SmallText", "SlideShow"], CellMargins -> {{100, 50}, {8, 8}}, LineSpacing -> {1, 5}, FontSize -> 10], Cell[ StyleData["SmallText", "Printout"], CellMargins -> {{2, 2}, {5, 5}}, TextJustification -> 0.5, Hyphenation -> True, FontSize -> 7]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Author"], CellMargins -> {{90, 27}, {2, 20}}, FontFamily -> "Times", FontSize -> 24, FontSlant -> "Italic"], Cell[ StyleData["Author", "Presentation"], FontSize -> 32], Cell[ StyleData["Author", "SlideShow"], FontSize -> 32], Cell[ StyleData["Author", "Printout"], CellMargins -> {{100, 27}, {2, 20}}, FontSize -> 14]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Affiliation"], CellMargins -> {{90, 27}, {30, 12}}, FontFamily -> "Times", FontSize -> 24, FontSlant -> "Italic"], Cell[ StyleData["Affiliation", "Presentation"], FontSize -> 32], Cell[ StyleData["Affiliation", "SlideShow"], FontSize -> 32], Cell[ StyleData["Affiliation", "Printout"], CellMargins -> {{100, 27}, {2, 12}}, FontSize -> 14]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["ConferenceGraphicCell"], ShowCellBracket -> True, CellMargins -> {{0, 0}, {0, 0}}, Evaluatable -> False, PageBreakBelow -> False, ImageMargins -> {{0, 0}, {0, 0}}, ImageRegion -> {{0, 1}, {0, 1}}, Magnification -> 1, Background -> GrayLevel[1]], Cell[ StyleData["ConferenceGraphicCell", "Presentation"], ShowCellBracket -> False], Cell[ StyleData["ConferenceGraphicCell", "SlideShow"], ShowCellBracket -> False], Cell[ StyleData["ConferenceGraphicCell", "Printout"], FontSize -> 8, Magnification -> 0.75]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["GraphicNoMagnification"], CellMargins -> {{60, 10}, {7, 7}}, LineSpacing -> {1, 3}, CounterIncrements -> "Text", FontFamily -> "Helvetica", Magnification -> 1], Cell[ StyleData["GraphicNoMagnification", "Presentation"], CellMargins -> {{72, 50}, {10, 10}}, LineSpacing -> {1, 5}, FontSize -> 17], Cell[ StyleData["GraphicNoMagnification", "SlideShow"], CellMargins -> {{100, 50}, {10, 10}}, FontSize -> 17], Cell[ StyleData["GraphicNoMagnification", "Printout"], CellMargins -> {{2, 2}, {6, 6}}, FontSize -> 10]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Input"], ShowCellBracket -> True, CellMargins -> {{66, 10}, {5, 7}}, CellBracketOptions -> { "Color" -> RGBColor[0.734936, 0.713848, 0.694041]}, Evaluatable -> True, CellGroupingRules -> "InputGrouping", CellHorizontalScrolling -> True, PageBreakWithin -> False, GroupPageBreakWithin -> False, DefaultFormatType -> DefaultInputFormatType, "TwoByteSyntaxCharacterAutoReplacement" -> True, HyphenationOptions -> {"HyphenationCharacter" -> "\[Continuation]"}, AutoItalicWords -> {}, LanguageCategory -> "Mathematica", FormatType -> InputForm, ShowStringCharacters -> True, NumberMarks -> True, LinebreakAdjustments -> {0.85, 2, 10, 0, 1}, CounterIncrements -> "Input", FontWeight -> "Bold"], Cell[ StyleData["Input", "Presentation"], CellMargins -> {{72, 50}, {8, 10}}, LineSpacing -> {1, 0}, FontSize -> 18], Cell[ StyleData["Input", "SlideShow"], CellMargins -> {{100, 50}, {8, 10}}, LineSpacing -> {1, 0}, FontSize -> 18], Cell[ StyleData["Input", "Printout"], CellMargins -> {{39, 0}, {4, 6}}, LinebreakAdjustments -> {0.85, 2, 10, 1, 1}, FontSize -> 9]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["InputOnly"], ShowCellBracket -> True, CellMargins -> {{66, 10}, {7, 7}}, CellBracketOptions -> { "Color" -> RGBColor[0.734936, 0.713848, 0.694041]}, Evaluatable -> True, CellGroupingRules -> "InputGrouping", CellHorizontalScrolling -> True, DefaultFormatType -> DefaultInputFormatType, "TwoByteSyntaxCharacterAutoReplacement" -> True, HyphenationOptions -> {"HyphenationCharacter" -> "\[Continuation]"}, AutoItalicWords -> {}, LanguageCategory -> "Mathematica", FormatType -> InputForm, ShowStringCharacters -> True, NumberMarks -> True, LinebreakAdjustments -> {0.85, 2, 10, 0, 1}, CounterIncrements -> "Input", StyleMenuListing -> None, FontWeight -> "Bold"], Cell[ StyleData["InputOnly", "Presentation"], CellMargins -> {{72, Inherited}, {8, 10}}, LineSpacing -> {1, 0}, FontSize -> 18], Cell[ StyleData["InputOnly", "SlideShow"], CellMargins -> {{100, Inherited}, {8, 10}}, LineSpacing -> {1, 0}, FontSize -> 18], Cell[ StyleData["InputOnly", "Printout"], CellMargins -> {{39, 0}, {4, 6}}, LinebreakAdjustments -> {0.85, 2, 10, 1, 1}, FontSize -> 9]}, Open]], Cell[ CellGroupData[{ Cell[ StyleData["Output"], ShowCellBracket -> True, CellMargins -> {{66, 10}, {7, 5}}, CellBracketOptions -> { "Color" -> RGBColor[0.734936, 0.713848, 0.694041]}, CellEditDuplicate -> True, CellGroupingRules -> "OutputGrouping", CellHorizontalScrolling -> True, PageBreakWithin -> False, GroupPageBreakWithin -> False, GeneratedCell -> True, CellAutoOverwrite -> True, DefaultFormatType -> DefaultOutputFormatType, "TwoByteSyntaxCharacterAutoReplacement" -> True, HyphenationOptions -> { "HyphenationCharacter" -> "\[Continuation]"}, AutoItalicWords -> {}, LanguageCategory -> None, FormatType -> InputForm, CounterIncrements -> "Output"], Cell[ StyleData["Output", "Presentation"], CellMargins -> {{72, 50}, {10, 8}}, LineSpacing -> {1, 0}, FontSize -> 18], Cell[ StyleData["Output", "SlideShow"], CellMargins -> {{100, 50}, {10, 8}}, LineSpacing -> {1, 0}, FontSize -> 18], Cell[ StyleData["Output", "Printout"], CellMargins -> {{39, 0}, {6, 4}}, FontSize -> 9]}, Open]], Cell[ StyleData["PrintUsage"], Editable -> False, PageWidth -> WindowWidth, CellFrame -> {{0, 0}, {0, 3}}, CellMargins -> {{40, 3}, {4, 4}}, CellFrameColor -> RGBColor[1, 0.6000000000000001, 0], Magnification -> 1.5, Background -> RGBColor[1, 0.993332, 0.899718]], Cell[ StyleData["ConferenceGraphicCell"], CellMargins -> 0]}, Visible -> False, FrontEndVersion -> "6.0 for Microsoft Windows (32-bit) (June 19, 2007)", StyleDefinitions -> "Default.nb"] ] (* End of Notebook Content *) (* Internal cache information *) (*CellTagsOutline CellTagsIndex->{ "SlideShowHeader"->{ Cell[25589, 455, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[27998, 511, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[52580, 1223, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[60650, 1454, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[80219, 2069, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[96833, 2617, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[128746, 3630, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[153868, 4397, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[168366, 4834, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[184739, 5375, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[210711, 6105, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[221469, 6454, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[236645, 6854, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[266090, 7713, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[275752, 8031, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[283963, 8261, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[295695, 8600, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"]}, "Info3400847762-2134627"->{ Cell[103148, 2819, 2169, 35, 114, "Print", CellTags->"Info3400847762-2134627"]} } *) (*CellTagsIndex CellTagsIndex->{ {"SlideShowHeader", 390115, 10252}, {"Info3400847762-2134627", 391667, 10287} } *) (*NotebookFileOutline Notebook[{ Cell[568, 21, 23854, 393, 52, "ConferenceGraphicCell"], Cell[CellGroupData[{ Cell[24447, 418, 287, 10, 74, "Title"], Cell[24737, 430, 110, 1, 70, "Subtitle"], Cell[24850, 433, 94, 1, 59, "Author"], Cell[24947, 436, 109, 1, 79, "Affiliation"], Cell[25059, 439, 493, 11, 80, "PreviousNext"] }, Open ]], Cell[CellGroupData[{ Cell[25589, 455, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[25678, 460, 182, 2, 86, "Section"], Cell[25863, 464, 1283, 20, 150, "Text"] }, Open ]], Cell[27161, 487, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[27998, 511, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[28087, 516, 314, 5, 86, "Section"], Cell[28404, 523, 584, 9, 83, "Text"], Cell[28991, 534, 147, 3, 39, "Input"], Cell[CellGroupData[{ Cell[29163, 541, 206, 3, 49, "Subsection"], Cell[29372, 546, 280, 7, 28, "Input"], Cell[CellGroupData[{ Cell[29677, 557, 246, 3, 30, "Subsubsection"], Cell[CellGroupData[{ Cell[29948, 564, 634, 14, 28, "Input"], Cell[30585, 580, 437, 9, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[31071, 595, 114, 1, 22, "Subsubsection"], Cell[CellGroupData[{ Cell[31210, 600, 925, 22, 49, "Input"], Cell[32138, 624, 623, 11, 27, "Output"], Cell[32764, 637, 557, 8, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[33370, 651, 119, 1, 22, "Subsubsection"], Cell[CellGroupData[{ Cell[33514, 656, 462, 14, 49, "Input"], Cell[33979, 672, 290, 7, 27, "Output"], Cell[34272, 681, 224, 4, 27, "Output"] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[34557, 692, 161, 2, 41, "Subsection"], Cell[34721, 696, 249, 7, 28, "Input"], Cell[CellGroupData[{ Cell[34995, 707, 101, 1, 30, "Subsubsection"], Cell[CellGroupData[{ Cell[35121, 712, 265, 9, 28, "Input"], Cell[35389, 723, 244, 6, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[35682, 735, 105, 1, 22, "Subsubsection"], Cell[CellGroupData[{ Cell[35812, 740, 572, 17, 49, "Input"], Cell[36387, 759, 271, 7, 27, "Output"], Cell[36661, 768, 203, 4, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[36913, 778, 107, 1, 22, "Subsubsection"], Cell[CellGroupData[{ Cell[37045, 783, 868, 20, 49, "Input"], Cell[37916, 805, 681, 12, 27, "Output"], Cell[38600, 819, 613, 9, 27, "Output"] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[39274, 835, 112, 1, 41, "Subsection"], Cell[39389, 838, 339, 10, 28, "Input"], Cell[CellGroupData[{ Cell[39753, 852, 103, 1, 30, "Subsubsection"], Cell[CellGroupData[{ Cell[39881, 857, 265, 9, 28, "Input"], Cell[40149, 868, 217, 6, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[40415, 880, 105, 1, 22, "Subsubsection"], Cell[CellGroupData[{ Cell[40545, 885, 576, 17, 49, "Input"], Cell[41124, 904, 219, 6, 27, "Output"], Cell[41346, 912, 152, 3, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[41547, 921, 107, 1, 22, "Subsubsection"], Cell[CellGroupData[{ Cell[41679, 926, 870, 20, 49, "Input"], Cell[42552, 948, 648, 11, 27, "Output"], Cell[43203, 961, 583, 8, 27, "Output"] }, Open ]], Cell[43801, 972, 761, 18, 27, "PreviousNext"] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[44611, 996, 127, 1, 41, "Subsection"], Cell[44741, 999, 363, 8, 47, "Text"], Cell[45107, 1009, 103, 1, 29, "Text"], Cell[45213, 1012, 253, 6, 66, "Program"], Cell[45469, 1020, 316, 8, 28, "Input"], Cell[45788, 1030, 182, 2, 29, "Text"], Cell[45973, 1034, 1047, 29, 28, "Input"], Cell[47023, 1065, 91, 1, 29, "Text"], Cell[CellGroupData[{ Cell[47139, 1070, 129, 2, 28, "Input"], Cell[47271, 1074, 220, 6, 27, "Output"] }, Open ]], Cell[47506, 1083, 217, 5, 29, "Text"], Cell[47726, 1090, 1712, 44, 129, "Input"], Cell[49441, 1136, 130, 1, 29, "Text"], Cell[49574, 1139, 413, 8, 28, "Input"], Cell[CellGroupData[{ Cell[50012, 1151, 732, 20, 69, "Input"], Cell[50747, 1173, 328, 6, 27, "Output"], Cell[51078, 1181, 345, 7, 27, "Output"], Cell[51426, 1190, 278, 4, 27, "Output"] }, Open ]] }, Closed]] }, Open ]], Cell[51743, 1199, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[52580, 1223, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[52669, 1228, 266, 4, 86, "Section"], Cell[52938, 1234, 170, 3, 29, "Text"], Cell[CellGroupData[{ Cell[53133, 1241, 129, 1, 59, "Subsection"], Cell[53265, 1244, 313, 9, 49, "Input"], Cell[53581, 1255, 228, 6, 28, "Input"], Cell[CellGroupData[{ Cell[53834, 1265, 453, 14, 49, "Input"], Cell[54290, 1281, 218, 6, 27, "Output"], Cell[54511, 1289, 201, 5, 27, "Output"] }, Open ]], Cell[54727, 1297, 264, 5, 29, "Text"] }, Closed]], Cell[CellGroupData[{ Cell[55028, 1307, 102, 1, 51, "Subsection"], Cell[55133, 1310, 310, 6, 29, "Text"], Cell[CellGroupData[{ Cell[55468, 1320, 206, 3, 28, "Input"], Cell[55677, 1325, 2097, 35, 85, "Output"] }, Open ]], Cell[57789, 1363, 165, 3, 29, "Text"], Cell[57957, 1368, 270, 6, 28, "Input"], Cell[58230, 1376, 114, 1, 29, "Text"], Cell[CellGroupData[{ Cell[58369, 1381, 453, 14, 49, "Input"], Cell[58825, 1397, 220, 6, 27, "Output"], Cell[59048, 1405, 204, 5, 27, "Output"] }, Open ]], Cell[59267, 1413, 179, 4, 29, "Text"], Cell[59449, 1419, 267, 6, 28, "Input"] }, Closed]] }, Open ]], Cell[59743, 1429, 870, 20, 27, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[60650, 1454, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[60739, 1459, 262, 4, 71, "Section"], Cell[61004, 1465, 526, 10, 47, "Text"], Cell[CellGroupData[{ Cell[61555, 1479, 119, 1, 59, "Subsection"], Cell[61677, 1482, 225, 4, 29, "Text"], Cell[61905, 1488, 227, 6, 28, "Input"], Cell[CellGroupData[{ Cell[62157, 1498, 386, 11, 49, "Input"], Cell[62546, 1511, 219, 6, 27, "Output"], Cell[62768, 1519, 221, 6, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[63026, 1530, 123, 2, 28, "Input"], Cell[63152, 1534, 103, 2, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[63304, 1542, 185, 4, 51, "Subsection"], Cell[63492, 1548, 494, 8, 29, "Text"], Cell[63989, 1558, 225, 6, 28, "Input"], Cell[64217, 1566, 113, 1, 29, "Text"], Cell[64333, 1569, 222, 6, 28, "Input"], Cell[64558, 1577, 157, 2, 29, "Text"], Cell[64718, 1581, 221, 5, 28, "Input"], Cell[64942, 1588, 256, 3, 29, "Text"], Cell[65201, 1593, 266, 7, 28, "Input"], Cell[65470, 1602, 170, 3, 29, "Text"], Cell[CellGroupData[{ Cell[65665, 1609, 318, 10, 49, "Input"], Cell[65986, 1621, 218, 6, 27, "Output"], Cell[66207, 1629, 218, 6, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[66474, 1641, 163, 2, 51, "Subsection"], Cell[CellGroupData[{ Cell[66662, 1647, 160, 2, 30, "Subsubsection"], Cell[66825, 1651, 302, 6, 29, "Text"], Cell[CellGroupData[{ Cell[67152, 1661, 489, 11, 28, "Input"], Cell[67644, 1674, 857, 27, 179, "Output"] }, Open ]], Cell[68516, 1704, 214, 4, 29, "Text"], Cell[CellGroupData[{ Cell[68755, 1712, 210, 6, 28, "Input"], Cell[68968, 1720, 333, 8, 27, "Output"] }, Open ]], Cell[69316, 1731, 164, 3, 29, "Text"], Cell[CellGroupData[{ Cell[69505, 1738, 311, 6, 28, "Input"], Cell[69819, 1746, 300, 7, 27, "Output"] }, Open ]], Cell[70134, 1756, 127, 1, 29, "Text"], Cell[70264, 1759, 390, 12, 28, "Input"], Cell[CellGroupData[{ Cell[70679, 1775, 876, 26, 71, "Input"], Cell[71558, 1803, 222, 6, 27, "Output"], Cell[71783, 1811, 222, 6, 27, "Output"], Cell[72008, 1819, 154, 3, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[72211, 1828, 280, 3, 22, "Subsubsection"], Cell[72494, 1833, 296, 5, 29, "Text"], Cell[CellGroupData[{ Cell[72815, 1842, 289, 6, 28, "Input"], Cell[73107, 1850, 358, 8, 27, "Output"] }, Open ]], Cell[73480, 1861, 190, 4, 29, "Text"], Cell[CellGroupData[{ Cell[73695, 1869, 247, 5, 28, "Input"], Cell[73945, 1876, 835, 26, 163, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[74817, 1907, 255, 6, 28, "Input"], Cell[75075, 1915, 204, 3, 27, "Output"] }, Open ]], Cell[75294, 1921, 552, 13, 155, "Text"], Cell[CellGroupData[{ Cell[75871, 1938, 473, 13, 28, "Input"], Cell[76347, 1953, 192, 5, 27, "Output"] }, Open ]], Cell[76554, 1961, 224, 4, 29, "Text"], Cell[76781, 1967, 231, 6, 28, "Input"], Cell[CellGroupData[{ Cell[77037, 1977, 1271, 35, 69, "Input"], Cell[78311, 2014, 360, 8, 27, "Output"], Cell[78674, 2024, 361, 8, 27, "Output"], Cell[79038, 2034, 293, 5, 27, "Output"] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[79382, 2045, 800, 19, 27, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[80219, 2069, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[80308, 2074, 313, 5, 71, "Section"], Cell[80624, 2081, 584, 11, 47, "Text"], Cell[81211, 2094, 291, 5, 29, "Text"], Cell[CellGroupData[{ Cell[81527, 2103, 151, 2, 59, "Subsection"], Cell[81681, 2107, 255, 7, 29, "Text"], Cell[81939, 2116, 350, 9, 28, "Input"], Cell[CellGroupData[{ Cell[82314, 2129, 144, 2, 28, "Input"], Cell[82461, 2133, 171, 3, 27, "Output"] }, Open ]], Cell[82647, 2139, 211, 5, 29, "Text"], Cell[CellGroupData[{ Cell[82883, 2148, 159, 2, 30, "Subsubsection"], Cell[83045, 2152, 233, 5, 29, "Text"], Cell[CellGroupData[{ Cell[83303, 2161, 192, 5, 28, "Input"], Cell[83498, 2168, 146, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[83681, 2176, 141, 2, 28, "Input"], Cell[83825, 2180, 151, 3, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[84025, 2189, 165, 2, 22, "Subsubsection"], Cell[CellGroupData[{ Cell[84215, 2195, 571, 17, 49, "Input"], Cell[84789, 2214, 151, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[84977, 2222, 358, 9, 49, "Input"], Cell[85338, 2233, 100, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[85475, 2240, 469, 14, 49, "Input"], Cell[85947, 2256, 101, 2, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[86097, 2264, 167, 2, 22, "Subsubsection"], Cell[86267, 2268, 222, 5, 29, "Text"], Cell[CellGroupData[{ Cell[86514, 2277, 260, 6, 49, "Input"], Cell[86777, 2285, 123, 2, 27, "Output"] }, Open ]], Cell[86915, 2290, 126, 1, 29, "Text"], Cell[CellGroupData[{ Cell[87066, 2295, 383, 10, 69, "Input"], Cell[87452, 2307, 121, 2, 27, "Output"], Cell[87576, 2311, 122, 2, 27, "Output"] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[87759, 2320, 109, 1, 51, "Subsection"], Cell[87871, 2323, 308, 5, 47, "Text"], Cell[CellGroupData[{ Cell[88204, 2332, 106, 1, 30, "Subsubsection"], Cell[CellGroupData[{ Cell[88335, 2337, 288, 6, 49, "Input"], Cell[88626, 2345, 203, 5, 27, "Output"], Cell[88832, 2352, 125, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[88994, 2359, 256, 5, 49, "Input"], Cell[89253, 2366, 203, 5, 27, "Output"], Cell[89459, 2373, 124, 2, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[89632, 2381, 109, 1, 22, "Subsubsection"], Cell[89744, 2384, 165, 3, 29, "Text"], Cell[CellGroupData[{ Cell[89934, 2391, 177, 4, 28, "Input"], Cell[90114, 2397, 158, 4, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[90309, 2406, 256, 5, 49, "Input"], Cell[90568, 2413, 157, 4, 27, "Output"], Cell[90728, 2419, 102, 2, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[90879, 2427, 98, 1, 22, "Subsubsection"], Cell[90980, 2430, 271, 5, 29, "Text"], Cell[CellGroupData[{ Cell[91276, 2439, 344, 8, 49, "Input"], Cell[91623, 2449, 185, 5, 27, "Output"], Cell[91811, 2456, 123, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[91971, 2463, 346, 8, 49, "Input"], Cell[92320, 2473, 152, 4, 27, "Output"], Cell[92475, 2479, 99, 2, 27, "Output"] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[92635, 2488, 110, 1, 51, "Subsection"], Cell[92748, 2491, 316, 5, 47, "Text"] }, Closed]], Cell[CellGroupData[{ Cell[93101, 2501, 152, 2, 51, "Subsection"], Cell[93256, 2505, 264, 7, 29, "Text"], Cell[CellGroupData[{ Cell[93545, 2516, 157, 2, 28, "Input"], Cell[93705, 2520, 563, 12, 27, "Output"] }, Open ]], Cell[94283, 2535, 135, 1, 29, "Text"], Cell[94421, 2538, 264, 6, 28, "Input"], Cell[94688, 2546, 130, 1, 29, "Text"], Cell[94821, 2549, 333, 10, 49, "Input"], Cell[CellGroupData[{ Cell[95179, 2563, 194, 5, 28, "Input"], Cell[95376, 2570, 223, 5, 21, "Message"], Cell[95602, 2577, 163, 5, 27, "Output"] }, Open ]], Cell[95780, 2585, 189, 4, 29, "Text"] }, Closed]] }, Open ]], Cell[95996, 2593, 800, 19, 27, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[96833, 2617, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[96922, 2622, 432, 6, 71, "Section"], Cell[CellGroupData[{ Cell[97379, 2632, 94, 1, 59, "Subsection"], Cell[97476, 2635, 188, 2, 29, "Text"], Cell[97667, 2639, 359, 9, 28, "Input"], Cell[98029, 2650, 158, 2, 29, "Text"], Cell[CellGroupData[{ Cell[98212, 2656, 493, 12, 28, "Input"], Cell[98708, 2670, 348, 8, 27, "Output"] }, Open ]], Cell[99071, 2681, 101, 1, 29, "Text"], Cell[CellGroupData[{ Cell[99197, 2686, 459, 11, 28, "Input"], Cell[99659, 2699, 195, 5, 27, "Output"] }, Open ]], Cell[99869, 2707, 186, 2, 29, "Text"], Cell[CellGroupData[{ Cell[100080, 2713, 170, 4, 28, "Input"], Cell[100253, 2719, 152, 4, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[100442, 2728, 112, 1, 30, "Subsubsection"], Cell[100557, 2731, 103, 1, 29, "Text"], Cell[100663, 2734, 352, 9, 129, "Program"], Cell[101018, 2745, 192, 4, 29, "Text"], Cell[101213, 2751, 990, 30, 129, "Input"], Cell[CellGroupData[{ Cell[102228, 2785, 170, 4, 28, "Input"], Cell[102401, 2791, 171, 5, 27, "Output"] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[102633, 2803, 150, 2, 51, "Subsection"], Cell[102786, 2807, 221, 4, 29, "Text"], Cell[CellGroupData[{ Cell[103032, 2815, 113, 2, 28, "Input"], Cell[103148, 2819, 2169, 35, 114, "Print", CellTags->"Info3400847762-2134627"] }, Open ]], Cell[105332, 2857, 226, 3, 29, "Text"], Cell[105561, 2862, 219, 4, 29, "Text"], Cell[105783, 2868, 237, 6, 28, "Input"], Cell[CellGroupData[{ Cell[106045, 2878, 322, 10, 28, "Input"], Cell[106370, 2890, 197, 5, 31, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[106604, 2900, 273, 8, 28, "Input"], Cell[106880, 2910, 192, 5, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[107109, 2920, 291, 9, 28, "Input"], Cell[107403, 2931, 168, 5, 27, "Output"] }, Open ]], Cell[107586, 2939, 188, 4, 29, "Text"], Cell[107777, 2945, 91, 1, 28, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[107905, 2951, 98, 1, 51, "Subsection"], Cell[108006, 2954, 257, 5, 29, "Text"], Cell[108266, 2961, 541, 10, 129, "Program"], Cell[108810, 2973, 385, 11, 49, "Input"], Cell[109198, 2986, 133, 1, 29, "Text"], Cell[CellGroupData[{ Cell[109356, 2991, 645, 19, 69, "Input"], Cell[110004, 3012, 271, 6, 27, "Output"], Cell[110278, 3020, 270, 6, 27, "Output"], Cell[110551, 3028, 203, 3, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[110803, 3037, 161, 2, 51, "Subsection"], Cell[110967, 3041, 345, 6, 29, "Text"] }, Closed]], Cell[CellGroupData[{ Cell[111349, 3052, 95, 1, 51, "Subsection"], Cell[111447, 3055, 228, 4, 29, "Text"], Cell[111678, 3061, 419, 9, 28, "Input"], Cell[CellGroupData[{ Cell[112122, 3074, 273, 7, 28, "Input"], Cell[112398, 3083, 284, 7, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[112719, 3095, 618, 17, 28, "Input"], Cell[113340, 3114, 312, 7, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[113689, 3126, 149, 3, 28, "Input"], Cell[113841, 3131, 145, 3, 27, "Output"] }, Open ]], Cell[114001, 3137, 120, 1, 29, "Text"], Cell[114124, 3140, 255, 7, 28, "Input"], Cell[CellGroupData[{ Cell[114404, 3151, 430, 14, 49, "Input"], Cell[114837, 3167, 167, 5, 27, "Output"], Cell[115007, 3174, 169, 5, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[115213, 3184, 146, 3, 28, "Input"], Cell[115362, 3189, 97, 2, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[115508, 3197, 98, 1, 51, "Subsection"], Cell[115609, 3200, 755, 14, 101, "Text"], Cell[CellGroupData[{ Cell[116389, 3218, 123, 1, 30, "Subsubsection"], Cell[116515, 3221, 285, 9, 28, "Input"], Cell[CellGroupData[{ Cell[116825, 3234, 460, 15, 28, "Input"], Cell[117288, 3251, 190, 5, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[117515, 3261, 227, 7, 28, "Input"], Cell[117745, 3270, 218, 6, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[118000, 3281, 387, 12, 28, "Input"], Cell[118390, 3295, 219, 6, 27, "Output"] }, Open ]] }, Closed]] }, Closed]], Cell[CellGroupData[{ Cell[118670, 3308, 99, 1, 51, "Subsection"], Cell[118772, 3311, 242, 4, 29, "Text"], Cell[119017, 3317, 251, 7, 28, "Input"], Cell[CellGroupData[{ Cell[119293, 3328, 179, 5, 28, "Input"], Cell[119475, 3335, 171, 5, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[119683, 3345, 219, 3, 30, "Subsubsection"], Cell[119905, 3350, 364, 6, 47, "Text"], Cell[CellGroupData[{ Cell[120294, 3360, 206, 5, 28, "Input"], Cell[120503, 3367, 495, 13, 61, "Output"] }, Open ]], Cell[121013, 3383, 128, 1, 29, "Text"], Cell[121144, 3386, 280, 9, 28, "Input"], Cell[CellGroupData[{ Cell[121449, 3399, 197, 5, 28, "Input"], Cell[121649, 3406, 151, 4, 27, "Output"] }, Open ]], Cell[121815, 3413, 175, 4, 29, "Text"], Cell[CellGroupData[{ Cell[122015, 3421, 385, 11, 49, "Input"], Cell[122403, 3434, 169, 5, 27, "Output"], Cell[122575, 3441, 100, 2, 27, "Output"] }, Open ]], Cell[122690, 3446, 270, 5, 29, "Text"] }, Closed]], Cell[CellGroupData[{ Cell[122997, 3456, 125, 1, 22, "Subsubsection"], Cell[123125, 3459, 242, 4, 29, "Text"], Cell[123370, 3465, 319, 9, 28, "Input"], Cell[CellGroupData[{ Cell[123714, 3478, 571, 17, 28, "Input"], Cell[124288, 3497, 165, 5, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[124490, 3507, 220, 6, 28, "Input"], Cell[124713, 3515, 1450, 36, 61, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[126200, 3556, 219, 6, 28, "Input"], Cell[126422, 3564, 1436, 36, 61, "Output"] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[127909, 3606, 800, 19, 27, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[128746, 3630, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[128835, 3635, 317, 5, 71, "Section"], Cell[129155, 3642, 359, 8, 47, "Text"], Cell[CellGroupData[{ Cell[129539, 3654, 106, 1, 59, "Subsection"], Cell[129648, 3657, 235, 5, 29, "Text"], Cell[CellGroupData[{ Cell[129908, 3666, 379, 8, 49, "Input"], Cell[130290, 3676, 281, 7, 27, "Output"], Cell[130574, 3685, 147, 3, 27, "Output"] }, Open ]], Cell[130736, 3691, 129, 1, 29, "Text"], Cell[CellGroupData[{ Cell[130890, 3696, 163, 3, 28, "Input"], Cell[131056, 3701, 121, 2, 27, "Output"] }, Open ]], Cell[131192, 3706, 115, 1, 29, "Text"], Cell[CellGroupData[{ Cell[131332, 3711, 368, 10, 49, "Input"], Cell[131703, 3723, 543, 12, 27, "Output"], Cell[132249, 3737, 122, 2, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[132408, 3744, 172, 3, 28, "Input"], Cell[132583, 3749, 151, 3, 27, "Output"] }, Open ]], Cell[132749, 3755, 272, 5, 29, "Text"], Cell[133024, 3762, 467, 13, 49, "Input"], Cell[CellGroupData[{ Cell[133516, 3779, 291, 8, 49, "Input"], Cell[133810, 3789, 195, 5, 27, "Output"], Cell[134008, 3796, 194, 5, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[134251, 3807, 153, 2, 51, "Subsection"], Cell[134407, 3811, 243, 5, 29, "Text"], Cell[134653, 3818, 302, 8, 30, "Input"], Cell[CellGroupData[{ Cell[134980, 3830, 237, 7, 28, "Input"], Cell[135220, 3839, 311, 7, 21, "Message"], Cell[135534, 3848, 215, 6, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[135786, 3859, 268, 8, 28, "Input"], Cell[136057, 3869, 167, 4, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[136273, 3879, 210, 6, 51, "Subsection"], Cell[136486, 3887, 146, 2, 29, "Text"], Cell[136635, 3891, 679, 17, 255, "Program"], Cell[137317, 3910, 124, 1, 29, "Text"], Cell[137444, 3913, 393, 11, 28, "Input"], Cell[CellGroupData[{ Cell[137862, 3928, 548, 17, 28, "Input"], Cell[138413, 3947, 251, 7, 27, "Output"] }, Open ]], Cell[138679, 3957, 354, 6, 29, "Text"], Cell[CellGroupData[{ Cell[139058, 3967, 104, 1, 30, "Subsubsection"], Cell[139165, 3970, 158, 3, 29, "Text"], Cell[CellGroupData[{ Cell[139348, 3977, 621, 18, 49, "Input"], Cell[139972, 3997, 206, 5, 27, "Output"], Cell[140181, 4004, 154, 3, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[140384, 4013, 167, 5, 22, "Subsubsection"], Cell[140554, 4020, 257, 6, 29, "Text"], Cell[140814, 4028, 264, 6, 28, "Input"], Cell[141081, 4036, 237, 4, 29, "Text"], Cell[CellGroupData[{ Cell[141343, 4044, 639, 15, 49, "Input"], Cell[141985, 4061, 344, 8, 21, "Message"], Cell[142332, 4071, 347, 8, 21, "Message"], Cell[142682, 4081, 345, 8, 21, "Message"], Cell[143030, 4091, 602, 13, 21, "Message"], Cell[143635, 4106, 295, 7, 27, "Output"], Cell[143933, 4115, 224, 4, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[144194, 4124, 621, 15, 49, "Input"], Cell[144818, 4141, 317, 7, 21, "Message"], Cell[145138, 4150, 317, 7, 21, "Message"], Cell[145458, 4159, 319, 7, 21, "Message"], Cell[145780, 4168, 574, 12, 21, "Message"], Cell[146357, 4182, 277, 6, 21, "Message"], Cell[146637, 4190, 275, 6, 21, "Message"], Cell[146915, 4198, 275, 6, 21, "Message"], Cell[147193, 4206, 573, 11, 21, "Message"], Cell[147769, 4219, 264, 6, 27, "Output"], Cell[148036, 4227, 194, 3, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[148267, 4235, 630, 15, 49, "Input"], Cell[148900, 4252, 319, 7, 21, "Message"], Cell[149222, 4261, 319, 7, 21, "Message"], Cell[149544, 4270, 317, 7, 21, "Message"], Cell[149864, 4279, 576, 12, 21, "Message"], Cell[150443, 4293, 261, 6, 27, "Output"], Cell[150707, 4301, 194, 3, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[150950, 4310, 110, 1, 22, "Subsubsection"], Cell[151063, 4313, 459, 9, 65, "Text"], Cell[CellGroupData[{ Cell[151547, 4326, 854, 24, 49, "Input"], Cell[152404, 4352, 321, 8, 27, "Output"], Cell[152728, 4362, 252, 5, 27, "Output"] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[153031, 4373, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[153868, 4397, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[153957, 4402, 315, 5, 86, "Section"], Cell[154275, 4409, 411, 7, 83, "Text"], Cell[CellGroupData[{ Cell[154711, 4420, 143, 2, 49, "Subsection"], Cell[154857, 4424, 229, 6, 28, "Input"], Cell[CellGroupData[{ Cell[155111, 4434, 372, 9, 49, "Input"], Cell[155486, 4445, 579, 16, 27, "Output"], Cell[156068, 4463, 243, 6, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[156360, 4475, 149, 2, 41, "Subsection"], Cell[156512, 4479, 261, 7, 28, "Input"], Cell[CellGroupData[{ Cell[156798, 4490, 321, 9, 49, "Input"], Cell[157122, 4501, 193, 5, 27, "Output"], Cell[157318, 4508, 194, 5, 27, "Output"] }, Open ]], Cell[157527, 4516, 243, 5, 29, "Text"] }, Closed]], Cell[CellGroupData[{ Cell[157807, 4526, 115, 1, 41, "Subsection"], Cell[157925, 4529, 442, 7, 29, "Text"], Cell[CellGroupData[{ Cell[158392, 4540, 276, 6, 28, "Input"], Cell[158671, 4548, 182, 4, 27, "Output"] }, Open ]], Cell[158868, 4555, 158, 3, 29, "Text"], Cell[CellGroupData[{ Cell[159051, 4562, 1582, 42, 45, "Input"], Cell[160636, 4606, 1580, 47, 69, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[162265, 4659, 116, 1, 41, "Subsection"], Cell[162384, 4662, 446, 7, 47, "Text"], Cell[162833, 4671, 162, 4, 28, "Input"], Cell[162998, 4677, 127, 1, 29, "Text"], Cell[CellGroupData[{ Cell[163150, 4682, 623, 19, 28, "Input"], Cell[163776, 4703, 240, 6, 27, "Output"] }, Open ]], Cell[164031, 4712, 122, 1, 29, "Text"], Cell[CellGroupData[{ Cell[164178, 4717, 772, 19, 28, "Input"], Cell[164953, 4738, 390, 8, 27, "Output"] }, Open ]], Cell[165358, 4749, 142, 1, 29, "Text"], Cell[CellGroupData[{ Cell[165525, 4754, 988, 26, 28, "Input"], Cell[166516, 4782, 345, 7, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[166898, 4794, 288, 4, 28, "Input"], Cell[167189, 4800, 301, 5, 27, "Output"] }, Open ]] }, Closed]] }, Open ]], Cell[167529, 4810, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[168366, 4834, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[168455, 4839, 507, 7, 86, "Section"], Cell[168965, 4848, 210, 4, 39, "Text"], Cell[169178, 4854, 119, 1, 39, "Text"], Cell[169300, 4857, 407, 10, 39, "Input"], Cell[169710, 4869, 119, 1, 39, "Text"], Cell[169832, 4872, 471, 12, 39, "Input"], Cell[CellGroupData[{ Cell[170328, 4888, 101, 1, 49, "Subsection"], Cell[CellGroupData[{ Cell[170454, 4893, 181, 4, 28, "Input"], Cell[170638, 4899, 256, 6, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[170931, 4910, 186, 3, 28, "Input"], Cell[171120, 4915, 217, 6, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[171386, 4927, 101, 1, 41, "Subsection"], Cell[171490, 4930, 321, 8, 28, "Input"], Cell[171814, 4940, 103, 1, 29, "Text"], Cell[CellGroupData[{ Cell[171942, 4945, 214, 6, 28, "Input"], Cell[172159, 4953, 215, 6, 27, "Output"] }, Open ]], Cell[172389, 4962, 96, 1, 29, "Text"], Cell[CellGroupData[{ Cell[172510, 4967, 428, 11, 28, "Input"], Cell[172941, 4980, 369, 9, 21, "Message"], Cell[173313, 4991, 258, 7, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[173608, 5003, 256, 5, 28, "Input"], Cell[173867, 5010, 168, 3, 27, "Output"] }, Open ]], Cell[174050, 5016, 182, 4, 29, "Text"], Cell[CellGroupData[{ Cell[174257, 5024, 270, 8, 28, "Input"], Cell[174530, 5034, 273, 7, 21, "Message"], Cell[174806, 5043, 169, 5, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[175012, 5053, 211, 4, 28, "Input"], Cell[175226, 5059, 100, 2, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[175375, 5067, 206, 6, 41, "Subsection"], Cell[175584, 5075, 96, 1, 29, "Text"], Cell[175683, 5078, 414, 8, 129, "Program"], Cell[176100, 5088, 198, 4, 29, "Text"], Cell[CellGroupData[{ Cell[176323, 5096, 113, 1, 30, "Subsubsection"], Cell[CellGroupData[{ Cell[176461, 5101, 301, 8, 28, "Input"], Cell[176765, 5111, 479, 15, 27, "Output"] }, Open ]], Cell[177259, 5129, 460, 8, 47, "Text"], Cell[CellGroupData[{ Cell[177744, 5141, 142, 3, 28, "Input"], Cell[177889, 5146, 291, 7, 21, "Message"], Cell[178183, 5155, 424, 13, 27, "Output"] }, Open ]], Cell[178622, 5171, 218, 5, 29, "Text"], Cell[CellGroupData[{ Cell[178865, 5180, 383, 10, 28, "Input"], Cell[179251, 5192, 300, 8, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[179588, 5205, 398, 10, 28, "Input"], Cell[179989, 5217, 324, 8, 27, "Output"] }, Open ]], Cell[180328, 5228, 132, 1, 29, "Text"], Cell[CellGroupData[{ Cell[180485, 5233, 134, 2, 28, "Input"], Cell[180622, 5237, 255, 6, 27, "Output"] }, Open ]], Cell[180892, 5246, 158, 3, 29, "Text"], Cell[CellGroupData[{ Cell[181075, 5253, 166, 4, 28, "Input"], Cell[181244, 5259, 256, 6, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[181549, 5271, 105, 1, 22, "Subsubsection"], Cell[181657, 5274, 111, 1, 29, "Text"], Cell[181771, 5277, 353, 10, 28, "Input"], Cell[182127, 5289, 156, 3, 29, "Text"], Cell[CellGroupData[{ Cell[182308, 5296, 970, 29, 69, "Input"], Cell[183281, 5327, 199, 5, 27, "Output"], Cell[183483, 5334, 218, 6, 27, "Output"], Cell[183704, 5342, 147, 3, 27, "Output"] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[183902, 5351, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[184739, 5375, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[184828, 5380, 545, 11, 86, "Section"], Cell[185376, 5393, 511, 8, 61, "Text"], Cell[CellGroupData[{ Cell[185912, 5405, 131, 1, 49, "Subsection"], Cell[186046, 5408, 87, 1, 29, "Text"], Cell[186136, 5411, 390, 8, 108, "Program"], Cell[186529, 5421, 181, 4, 29, "Text"], Cell[186713, 5427, 609, 15, 30, "Input"], Cell[187325, 5444, 649, 17, 28, "Input"], Cell[187977, 5463, 122, 1, 29, "Text"], Cell[CellGroupData[{ Cell[188124, 5468, 330, 11, 28, "Input"], Cell[188457, 5481, 292, 7, 27, "Output"] }, Open ]], Cell[188764, 5491, 170, 2, 29, "Text"], Cell[CellGroupData[{ Cell[188959, 5497, 611, 19, 49, "Input"], Cell[189573, 5518, 268, 6, 27, "Output"], Cell[189844, 5526, 268, 6, 27, "Output"] }, Open ]], Cell[190127, 5535, 369, 7, 29, "Text"], Cell[CellGroupData[{ Cell[190521, 5546, 1673, 46, 64, "Input"], Cell[192197, 5594, 5387, 143, 179, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[197621, 5742, 1603, 37, 149, "Input"], Cell[199227, 5781, 648, 11, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[199912, 5797, 321, 5, 28, "Input"], Cell[200236, 5804, 477, 7, 27, "Output"] }, Open ]], Cell[200728, 5814, 137, 1, 29, "Text"], Cell[200868, 5817, 626, 16, 28, "Input"] }, Closed]], Cell[CellGroupData[{ Cell[201531, 5838, 99, 1, 41, "Subsection"], Cell[201633, 5841, 106, 1, 29, "Text"], Cell[201742, 5844, 296, 7, 87, "Program"], Cell[202041, 5853, 196, 2, 29, "Text"], Cell[202240, 5857, 228, 6, 30, "Input"], Cell[CellGroupData[{ Cell[202493, 5867, 539, 16, 28, "Input"], Cell[203035, 5885, 194, 5, 27, "Output"] }, Open ]], Cell[203244, 5893, 241, 4, 29, "Text"], Cell[CellGroupData[{ Cell[203510, 5901, 1161, 30, 64, "Input"], Cell[204674, 5933, 3835, 97, 179, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[208546, 6035, 807, 23, 49, "Input"], Cell[209356, 6060, 195, 5, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[209588, 6070, 119, 2, 28, "Input"], Cell[209710, 6074, 125, 2, 27, "Output"] }, Open ]] }, Closed]] }, Open ]], Cell[209874, 6081, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[210711, 6105, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[210800, 6110, 526, 11, 86, "Section"], Cell[CellGroupData[{ Cell[211351, 6125, 118, 1, 49, "Subsection"], Cell[211472, 6128, 277, 7, 29, "Text"], Cell[211752, 6137, 276, 8, 108, "Program"], Cell[212031, 6147, 257, 7, 31, "Text"], Cell[212291, 6156, 417, 11, 30, "Input"], Cell[CellGroupData[{ Cell[212733, 6171, 405, 11, 30, "Input"], Cell[213141, 6184, 270, 6, 27, "Output"] }, Open ]], Cell[213426, 6193, 332, 6, 29, "Text"], Cell[CellGroupData[{ Cell[213783, 6203, 1048, 26, 36, "Input"], Cell[214834, 6231, 2093, 61, 179, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[216964, 6297, 629, 18, 89, "Input"], Cell[217596, 6317, 271, 6, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[217904, 6328, 121, 2, 28, "Input"], Cell[218028, 6332, 148, 3, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[218225, 6341, 107, 1, 41, "Subsection"], Cell[218335, 6344, 93, 1, 29, "Text"], Cell[218431, 6347, 223, 7, 87, "Program"], Cell[218657, 6356, 110, 1, 29, "Text"], Cell[218770, 6359, 306, 8, 28, "Input"], Cell[CellGroupData[{ Cell[219101, 6371, 204, 6, 28, "Input"], Cell[219308, 6379, 188, 5, 27, "Output"] }, Open ]], Cell[219511, 6387, 107, 1, 29, "Text"], Cell[CellGroupData[{ Cell[219643, 6392, 496, 15, 28, "Input"], Cell[220142, 6409, 193, 5, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[220372, 6419, 117, 2, 28, "Input"], Cell[220492, 6423, 101, 2, 27, "Output"] }, Open ]] }, Closed]] }, Open ]], Cell[220632, 6430, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[221469, 6454, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[221558, 6459, 531, 11, 86, "Section"], Cell[CellGroupData[{ Cell[222114, 6474, 102, 1, 49, "Subsection"], Cell[222219, 6477, 108, 1, 29, "Text"], Cell[222330, 6480, 437, 10, 171, "Program"], Cell[222770, 6492, 418, 7, 29, "Text"], Cell[CellGroupData[{ Cell[223213, 6503, 957, 24, 63, "Input"], Cell[224173, 6529, 1290, 29, 33, "Output"] }, Open ]], Cell[225478, 6561, 422, 8, 65, "Text"], Cell[225903, 6571, 358, 7, 29, "Text"], Cell[CellGroupData[{ Cell[226286, 6582, 3316, 83, 197, "Input"], Cell[229605, 6667, 3624, 73, 147, "Output"] }, Open ]], Cell[233244, 6743, 172, 4, 29, "Text"], Cell[CellGroupData[{ Cell[233441, 6751, 439, 13, 28, "Input"], Cell[233883, 6766, 241, 7, 27, "Output"] }, Open ]], Cell[234139, 6776, 132, 1, 29, "Text"], Cell[CellGroupData[{ Cell[234296, 6781, 590, 14, 28, "Input"], Cell[234889, 6797, 341, 7, 27, "Output"] }, Open ]], Cell[235245, 6807, 97, 1, 29, "Text"], Cell[CellGroupData[{ Cell[235367, 6812, 228, 6, 28, "Input"], Cell[235598, 6820, 171, 5, 27, "Output"] }, Open ]] }, Closed]] }, Open ]], Cell[235808, 6830, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[236645, 6854, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[236734, 6859, 528, 11, 86, "Section"], Cell[CellGroupData[{ Cell[237287, 6874, 117, 1, 49, "Subsection"], Cell[237407, 6877, 154, 2, 29, "Text"], Cell[237564, 6881, 463, 14, 255, "Program"], Cell[238030, 6897, 561, 19, 49, "Input"], Cell[238594, 6918, 104, 1, 29, "Text"], Cell[CellGroupData[{ Cell[238723, 6923, 357, 10, 28, "Input"], Cell[239083, 6935, 217, 6, 27, "Output"] }, Open ]], Cell[239315, 6944, 305, 6, 29, "Text"], Cell[CellGroupData[{ Cell[239645, 6954, 3210, 91, 109, "Input"], Cell[242858, 7047, 18430, 506, 225, "Output"] }, Open ]], Cell[261303, 7556, 114, 1, 29, "Text"], Cell[CellGroupData[{ Cell[261442, 7561, 439, 13, 28, "Input"], Cell[261884, 7576, 170, 5, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[262103, 7587, 99, 1, 41, "Subsection"], Cell[262205, 7590, 146, 2, 29, "Text"], Cell[262354, 7594, 531, 13, 234, "Program"], Cell[262888, 7609, 346, 6, 29, "Text"], Cell[263237, 7617, 448, 14, 49, "Input"], Cell[CellGroupData[{ Cell[263710, 7635, 797, 25, 69, "Input"], Cell[264510, 7662, 252, 7, 27, "Output"], Cell[264765, 7671, 257, 7, 27, "Output"], Cell[265025, 7680, 189, 4, 27, "Output"] }, Open ]] }, Closed]] }, Open ]], Cell[265253, 7689, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[266090, 7713, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[266179, 7718, 316, 5, 86, "Section"], Cell[266498, 7725, 481, 8, 83, "Text"], Cell[CellGroupData[{ Cell[267004, 7737, 167, 2, 49, "Subsection"], Cell[267174, 7741, 325, 8, 28, "Input"], Cell[267502, 7751, 115, 1, 29, "Text"], Cell[CellGroupData[{ Cell[267642, 7756, 184, 4, 28, "Input"], Cell[267829, 7762, 285, 7, 27, "Output"] }, Open ]], Cell[268129, 7772, 200, 4, 29, "Text"], Cell[CellGroupData[{ Cell[268354, 7780, 309, 9, 28, "Input"], Cell[268666, 7791, 257, 7, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[268972, 7804, 172, 2, 41, "Subsection"], Cell[269147, 7808, 229, 4, 29, "Text"], Cell[CellGroupData[{ Cell[269401, 7816, 265, 7, 28, "Input"], Cell[269669, 7825, 567, 17, 27, "Output"] }, Open ]], Cell[270251, 7845, 126, 1, 29, "Text"], Cell[CellGroupData[{ Cell[270402, 7850, 154, 3, 28, "Input"], Cell[270559, 7855, 282, 8, 27, "Output"] }, Open ]], Cell[270856, 7866, 69, 0, 29, "Text"], Cell[CellGroupData[{ Cell[270950, 7870, 148, 1, 30, "Subsubsection"], Cell[271101, 7873, 145, 2, 29, "Text"], Cell[271249, 7877, 281, 7, 28, "Input"], Cell[271533, 7886, 218, 4, 29, "Text"], Cell[CellGroupData[{ Cell[271776, 7894, 486, 14, 28, "Input"], Cell[272265, 7910, 238, 6, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[272540, 7921, 299, 7, 28, "Input"], Cell[272842, 7930, 292, 7, 27, "Output"] }, Open ]], Cell[273149, 7940, 289, 5, 29, "Text"], Cell[CellGroupData[{ Cell[273463, 7949, 373, 11, 28, "Input"], Cell[273839, 7962, 218, 6, 27, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[274106, 7974, 177, 3, 22, "Subsubsection"], Cell[274286, 7979, 257, 5, 29, "Text"], Cell[CellGroupData[{ Cell[274568, 7988, 479, 14, 49, "Input"], Cell[275050, 8004, 306, 8, 27, "Output"], Cell[275359, 8014, 308, 8, 27, "Output"] }, Open ]] }, Closed]] }, Closed]] }, Open ]] }, Open ]], Cell[CellGroupData[{ Cell[275752, 8031, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[275841, 8036, 346, 5, 86, "Section"], Cell[276190, 8043, 354, 6, 39, "Text"], Cell[276547, 8051, 238, 6, 45, "Program"], Cell[276788, 8059, 175, 4, 39, "Text"], Cell[276966, 8065, 1763, 34, 67, "Input"], Cell[278732, 8101, 986, 26, 148, "Input"], Cell[279721, 8129, 153, 3, 39, "Text"], Cell[CellGroupData[{ Cell[279899, 8136, 315, 8, 39, "Input"], Cell[280217, 8146, 506, 15, 38, "Output"] }, Open ]], Cell[280738, 8164, 130, 1, 39, "Text"], Cell[CellGroupData[{ Cell[280893, 8169, 522, 14, 39, "Input"], Cell[281418, 8185, 165, 5, 38, "Output"] }, Open ]], Cell[281598, 8193, 264, 5, 61, "Text"], Cell[281865, 8200, 626, 16, 39, "Input"], Cell[282494, 8218, 617, 16, 39, "Input"] }, Open ]], Cell[283126, 8237, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[283963, 8261, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[284052, 8266, 320, 5, 86, "Section"], Cell[284375, 8273, 553, 9, 83, "Text"], Cell[CellGroupData[{ Cell[284953, 8286, 157, 5, 49, "Subsection"], Cell[285113, 8293, 98, 1, 29, "Text"], Cell[285214, 8296, 944, 17, 318, "Program"], Cell[286161, 8315, 254, 5, 29, "Text"], Cell[286418, 8322, 1027, 26, 149, "Input"], Cell[CellGroupData[{ Cell[287470, 8352, 110, 1, 30, "Subsubsection"], Cell[287583, 8355, 259, 7, 28, "Input"], Cell[287845, 8364, 172, 4, 28, "Input"], Cell[CellGroupData[{ Cell[288042, 8372, 587, 17, 28, "Input"], Cell[288632, 8391, 2084, 41, 245, "Output"] }, Open ]] }, Closed]], Cell[CellGroupData[{ Cell[290765, 8438, 103, 1, 22, "Subsubsection"], Cell[290871, 8441, 347, 9, 28, "Input"], Cell[CellGroupData[{ Cell[291243, 8454, 358, 8, 49, "Input"], Cell[291604, 8464, 538, 16, 31, "Output"], Cell[292145, 8482, 943, 25, 27, "Output"] }, Open ]], Cell[293103, 8510, 106, 1, 29, "Text"], Cell[293212, 8513, 340, 9, 28, "Input"], Cell[293555, 8524, 98, 1, 29, "Text"], Cell[CellGroupData[{ Cell[293678, 8529, 449, 14, 49, "Input"], Cell[294130, 8545, 168, 5, 27, "Output"], Cell[294301, 8552, 170, 5, 27, "Output"] }, Open ]], Cell[CellGroupData[{ Cell[294508, 8562, 172, 4, 28, "Input"], Cell[294683, 8568, 124, 2, 27, "Output"] }, Open ]] }, Closed]] }, Closed]] }, Open ]], Cell[294858, 8576, 800, 19, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]], Cell[CellGroupData[{ Cell[295695, 8600, 64, 1, 4, "SlideShowNavigationBar", CellTags->"SlideShowHeader"], Cell[CellGroupData[{ Cell[295784, 8605, 265, 4, 86, "Section"], Cell[296052, 8611, 401, 7, 61, "Text"], Cell[296456, 8620, 246, 7, 40, "Text"] }, Open ]], Cell[296717, 8630, 509, 12, 80, "PreviousNext", CellGroupingRules->"SectionGrouping"] }, Open ]] } ] *) (* End of internal cache information *)