forked from CalculusWithJulia/CalculusWithJulia.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vectors.html
2671 lines (2064 loc) · 302 KB
/
vectors.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link
href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css"
rel="stylesheet">
<style>
.julia {display: block; font-family: "Source Code Pro";
color:#0033CC;
}
.hljl {font-family: "Source Code Pro";
color:#0033CC;
}
body { padding-top: 60px; }
h5:before {content:"\2746\ ";}
h6:before {content:"\2742\ ";}
pre {display: block;}
th, td {
padding: 15px;
text-align: left;
border-bottom: 1px solid #ddd;
}
tr:hover {background-color: #f5f5f5;}
.admonition-title:before {content:"\2746\ ";}
.admonition-title { color:#0033CC}
</style>
<!-- .julia:before {content: "julia> "} -->
<style></style>
<script src="https://code.jquery.com/jquery.js"></script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
inlineMath: [ ["\$","\$"], ["\\(","\\)"]]
},
displayAlign: "left",
displayIndent: "5%"
});
</script>
<!-- not TeX-AMS-MML_HTMLorMML-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML" async></script>
</script>
<script>
window.PlotlyConfig = {MathJaxConfig: 'local'}
</script>
<script src="https://cdn.plot.ly/plotly-latest.min.js"></script>
<script type="text/javascript">
$( document ).ready(function() {
$("h1").each(function(index) {
var title = $( this ).text()
$("#page_title").html("<strong>" + title + "</strong>");
document.title = title
});
$( "h2" ).each(function( index ) {
var nm = $( this ).text();
var id = $.trim(nm).replace(/ /g,'');
this.id = id
$("#page_dropdown").append("<li><a href='#" + id + "'>" + nm + "</a></li>");
});
$('[data-toggle="popover"]').popover();
});
</script>
</head>
<body data-spy="scroll" >
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="#" id="page_title"></a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
Jump to... <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu" id="page_dropdown"></ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</nav>
<header>
</header>
<div class="title">
</div>
<div class="container-fluid">
<div class="span10 offset1">
<h1>Vectors and matrices</h1>
<p>In <a href="../precalc/vectors.html">vectors</a> we introduced the concept of a vector. A <a href="https://en.wikipedia.org/wiki/Euclidean_vector">vector</a> mathematically is a geometric object with two attributes a magnitude and a direction. (The direction is undefined in the case the magnitude is <span class="math">$0$</span>.) Vectors are typically visualized with an arrow, where the anchoring of the arrow is context dependent and is not particular to a given vector.</p>
<p>Vectors and points are related, but distinct. Let's focus on 3 dimensions. Mathematically, the notation for a point is <span class="math">$p=(x,y,z)$</span> while the notation for a vector is <span class="math">$\vec{v} = \langle x, y, z \rangle$</span>. The <span class="math">$i$</span>th component in a vector is referenced by a subscript: <span class="math">$v_i$</span>. With this, we may write a typical vector as <span class="math">$\vec{v} = \langle v_1, v_2, \dots, v_n \rangle$</span> and a vector in <span class="math">$n=3$</span> as <span class="math">$\vec{v} =\langle v_1, v_2, v_3 \rangle$</span>. The different grouping notation distinguishes the two objects. As another example, the notation <span class="math">$\{x, y, z\}$</span> indicates a set. Vectors and points may be <em>identified</em> by anchoring the vector at the origin. Set's are quite different from both, as the order of their entries is not unique.</p>
<p>In <code>Julia</code>, the notation to define a point and a vector would be identical, using square brackets to group like-type values: <code>[x, y, z]</code>. The notation <code>(x,y,z)</code> would form a <a href="https://en.wikipedia.org/wiki/Euclidean_vector">tuple</a> which though similar in many respects, tuples do not have the operations associated with a point or a vector defined for them.</p>
<p>The square bracket constructor has some subtleties:</p>
<ul>
<li><p><code>[x,y,z]</code> calls <code>vect</code> and creates a 1-dimensional array</p>
</li>
<li><p><code>[x; y; z]</code> calls <code>vcat</code> to <strong>v</strong>ertically con<strong>cat</strong>enate values together. With simple numbers the two are identical, but not in other cases. (For example, is <code>A</code> is a matrix then <code>[A,A]</code> is a vector of matrices, <code>[A;A]</code> is a matrix combined from the two pieces.</p>
</li>
<li><p><code>[x y z]</code> calls <code>hcat</code> to <strong>h</strong>orizontally con<strong>cat</strong>enate values together. If <code>x</code>, <code>y</code> are numbers then <code>[x y]</code> is <em>not</em> a vector, but rather a 2D array with a single row and two columns.</p>
</li>
<li><p>finally <code>[w x; y z]</code> calls <code>hvcat</code> to horizontally and vertically concatenate values together to create a container in two dimensions, like a matrix.</p>
</li>
</ul>
<p>(A vector, mathematically, is a one-dimensional collection of numbers, a matrix a two-dimensional <em>rectangular</em> collection of numbers, and an array an <span class="math">$n$</span>-dimensional rectangular-like collection of numbers. In <code>Julia</code>, a vector can hold a collection of objects of arbitrary type, though generally all of the same type.)</p>
<h2>Vector addition, scalar multiplication</h2>
<p>As seen earlier, vectors have some arithmetic operations defined for them. As a typical use of vectors, mathematically, is to collect the <span class="math">$x$</span>, <span class="math">$y$</span>, and <span class="math">$z$</span> (in 3D) components together, operations like addition and subtraction operate component wise. With this, addition can be visualized geometrically: put the tail of <span class="math">$\vec{v}$</span> at the tip of <span class="math">$\vec{u}$</span> and draw a vector from the tail of <span class="math">$\vec{u}$</span> to the tip of <span class="math">$\vec{v}$</span> and you have <span class="math">$\vec{u}+\vec{v}$</span>. This is identical by <span class="math">$\vec{v} + \vec{u}$</span> as vector addition is commutative. Unless <span class="math">$\vec{u}$</span> and <span class="math">$\vec{v}$</span> are parallel or one has <span class="math">$0$</span> length, the addition will create a vector with a different direction from the two.</p>
<p>Another operation for vectors is <em>scalar</em> multiplication. Geometrically this changes the magnitude, but not the direction of a vector, when the <em>scalar</em> is positive. Scalar multiplication is defined component wise, like addition so the <span class="math">$i$</span>th component of <span class="math">$c \vec{v}$</span> is <span class="math">$c$</span> times the <span class="math">$i$</span>th component of <span class="math">$\vec{v}$</span>. When the scalar is negative, the direction is "reversed."</p>
<p>To illustrate we first load our package and define two 3D vectors:</p>
<pre class='hljl'>
<span class='hljl-k'>using</span><span class='hljl-t'> </span><span class='hljl-n'>CalculusWithJulia</span><span class='hljl-t'>
</span><span class='hljl-n'>u</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>3</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>4</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>3</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span>
</pre>
<pre class="output">
([1, 2, 3], [4, 3, 2])
</pre>
<p>The sum is component-wise summation (<code>1+4, 2+3, 3+2</code>):</p>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>v</span>
</pre>
<pre class="output">
3-element Array{Int64,1}:
5
5
5
</pre>
<p>For addition, as the components must pair off, the two vectors being added must be the same dimension.</p>
<p>Scalar multiplication by <code>2</code>, say, multiplies each entry by <code>2</code>:</p>
<pre class='hljl'>
<span class='hljl-ni'>2</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-n'>u</span>
</pre>
<pre class="output">
3-element Array{Int64,1}:
2
4
6
</pre>
<h2>The length and direction of a vector</h2>
<p>If a vector <span class="math">$\vec{v} = \langle v_1, v_2, \dots, v_n\rangle$</span> then the <em>norm</em> (also Euclidean norm or length) of <span class="math">$\vec{v}$</span> is defined by:</p>
<p class="math">\[
~
\| \vec{v} \| = \sqrt{ v_1^2 + v_2^2 + \cdots + v_n^2}.
~
\]</p>
<p>The definition of a norm leads to a few properties. First, if <span class="math">$c$</span> is a scalar, <span class="math">$\| c\vec{v} \| = |c| \| \vec{v} \|$</span>–which says scalar multiplication by <span class="math">$c$</span> changes the length by <span class="math">$|c|$</span>. (Sometimes, scalar multiplication is described as "scaling by....") The other property is an analog of the triangle inequality, in which for any two vectors <span class="math">$\| \vec{v} + \vec{w} \| \leq \| \vec{v} \| + \| \vec{w} \|$</span>. The right hand side is equal only when the two vectors are parallel and addition is viewed as laying them end to end.</p>
<p>A vector with length <span class="math">$1$</span> is called a <em>unit</em> vector. Dividing a non-zero vector by its norm will yield a unit vector, a consequence of the first property above. Unit vectors are often written with a "hat:" <span class="math">$\hat{v}$</span>.</p>
<p>The direction indicated by <span class="math">$\vec{v}$</span> can be visualized as an angle in 2 or 3 dimensions, but in higher dimensions, visualization is harder. For 2-dimensions, we might associate with a vector, it's unit vector. This in turn may be identified with a point on the unit circle, which from basic trigonometry can be associated with an angle. Something similar, can be done in 3 dimensions, using two angles. However, the "direction" of a vector is best thought of in terms of its associated unit vector. With this, we have a decomposition of a vector <span class="math">$\vec{v}$</span> into a magnitude scalar and a direction when we write <span class="math">$\vec{v} = \|\vec{v}\| \cdot (\vec{v} / \|\vec{v}\|)=\|\vec{v}\| \hat{v}$</span>.</p>
<h2>Visualization of vectors</h2>
<p>Vectors may be visualized in 2 or 3 dimensions using <code>Plots</code>. In 2 dimensions, the <code>quiver</code> function may be used. To graph a vector, it must have its tail placed at a point, so two values are needed.</p>
<p>To plot <code>u=[1,2]</code> from <code>p=[0,0]</code> we have the following usage:</p>
<pre class='hljl'>
<span class='hljl-k'>using</span><span class='hljl-t'> </span><span class='hljl-n'>Plots</span><span class='hljl-t'>
</span><span class='hljl-nf'>gr</span><span class='hljl-p'>()</span><span class='hljl-t'> </span><span class='hljl-cs'># better arrows than plotly()</span><span class='hljl-t'>
</span><span class='hljl-nf'>quiver</span><span class='hljl-p'>([</span><span class='hljl-ni'>0</span><span class='hljl-p'>],[</span><span class='hljl-ni'>0</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-n'>quiver</span><span class='hljl-oB'>=</span><span class='hljl-p'>([</span><span class='hljl-ni'>1</span><span class='hljl-p'>],[</span><span class='hljl-ni'>2</span><span class='hljl-p'>]))</span>
</pre>
<img src="data:image/png;base64,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" />
<p>The cumbersome syntax is typical here. We naturally describe vectors and points using <code>[a,b,c]</code> to combine them, but the plotting functions want to plot many such at a time and expect vectors containing just the <code>x</code> values, just the <code>y</code> values, etc. The above usage looks a bit odd, as these vectors of <code>x</code> and <code>y</code> values have only one entry. Converting from the one representation to the other requires reshaping the data, which we will do with the following function from the <code>CalculusWithJulia</code> package:</p>
<pre class='hljl'>
<span class='hljl-nf'>unzip</span><span class='hljl-p'>(</span><span class='hljl-n'>vs</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-nf'>Tuple</span><span class='hljl-p'>(</span><span class='hljl-nf'>eltype</span><span class='hljl-p'>(</span><span class='hljl-nf'>first</span><span class='hljl-p'>(</span><span class='hljl-n'>vs</span><span class='hljl-p'>))[</span><span class='hljl-n'>xyz</span><span class='hljl-p'>[</span><span class='hljl-n'>j</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-k'>for</span><span class='hljl-t'> </span><span class='hljl-n'>xyz</span><span class='hljl-t'> </span><span class='hljl-kp'>in</span><span class='hljl-t'> </span><span class='hljl-n'>vs</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-k'>for</span><span class='hljl-t'> </span><span class='hljl-n'>j</span><span class='hljl-t'> </span><span class='hljl-kp'>in</span><span class='hljl-t'> </span><span class='hljl-nf'>eachindex</span><span class='hljl-p'>(</span><span class='hljl-nf'>first</span><span class='hljl-p'>(</span><span class='hljl-n'>vs</span><span class='hljl-p'>)))</span>
</pre>
<p>This takes a vector of vectors, and returns a tuple containing the <code>x</code> values, the <code>y</code> values, etc. So if <code>u=[1,2,3]</code>, the <code>unzip([u])</code> becomes <code>([1],[2],[3])</code>. And if <code>v=[4,5,6]</code>, then <code>unzip([u,v])</code> becomes <code>([1,4],[2,5],[3,6])</code>, etc. (The <code>zip</code> function in base does essentially the reverse operation.)</p>
<p>With <code>unzip</code> defined, we can plot a 2-D vector <code>v</code> anchored at point <code>p</code> through <code>quiver(unzip([p])..., quiver=unzip([v]))</code>.</p>
<p>To illustrate, the following defines 3 vectors (the third through addition), then graphs all three, though in different starting points to emphasize the geometric interpretation of vector addition.</p>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>4</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>w</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-t'>
</span><span class='hljl-n'>p</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>0</span><span class='hljl-p'>,</span><span class='hljl-ni'>0</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-nf'>quiver</span><span class='hljl-p'>(</span><span class='hljl-nf'>unzip</span><span class='hljl-p'>([</span><span class='hljl-n'>p</span><span class='hljl-p'>])</span><span class='hljl-oB'>...</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>quiver</span><span class='hljl-oB'>=</span><span class='hljl-nf'>unzip</span><span class='hljl-p'>([</span><span class='hljl-n'>u</span><span class='hljl-p'>]))</span><span class='hljl-t'>
</span><span class='hljl-nf'>quiver!</span><span class='hljl-p'>(</span><span class='hljl-nf'>unzip</span><span class='hljl-p'>([</span><span class='hljl-n'>u</span><span class='hljl-p'>])</span><span class='hljl-oB'>...</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>quiver</span><span class='hljl-oB'>=</span><span class='hljl-nf'>unzip</span><span class='hljl-p'>([</span><span class='hljl-n'>v</span><span class='hljl-p'>]))</span><span class='hljl-t'>
</span><span class='hljl-nf'>quiver!</span><span class='hljl-p'>(</span><span class='hljl-nf'>unzip</span><span class='hljl-p'>([</span><span class='hljl-n'>p</span><span class='hljl-p'>])</span><span class='hljl-oB'>...</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>quiver</span><span class='hljl-oB'>=</span><span class='hljl-nf'>unzip</span><span class='hljl-p'>([</span><span class='hljl-n'>w</span><span class='hljl-p'>]))</span>
</pre>
<img src="data:image/png;base64,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" />
<p>Plotting a 3-d vector is not supported in all toolkits with <code>quiver</code>. A line segment may be substituted and can be produced with <code>plot(unzip([p,p+v])...)</code>. To avoid all these details, the <code>CalculusWithJulia</code> provides the <code>arrow!</code> function to <em>add</em> a vector to an existing plot. The function requires a point, <code>p</code>, and the vector, <code>v</code>:</p>
<p>With this, the above simplifies to:</p>
<pre class='hljl'>
<span class='hljl-nf'>plot</span><span class='hljl-p'>(</span><span class='hljl-n'>legend</span><span class='hljl-oB'>=</span><span class='hljl-kc'>false</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>u</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>u</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>w</span><span class='hljl-p'>)</span>
</pre>
<img src="data:image/png;base64,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" />
<p>The distinction between a point and a vector within <code>Julia</code> is only mental. We use the same storage type. Mathematically, we can <strong>identify</strong> a point and a vector, by considering the vector with its tail placed at the origin. In this case, the tip of the arrow is located at the point. But this is only an identification, though a useful one. It allows us to "add" a point and a vector (e.g., writing <span class="math">$P + \vec{v}$</span>) by imagining the point as a vector anchored at the origin.</p>
<p>To see that a unit vector has the same "direction" as the vector, we might draw them with different widths:</p>
<pre class='hljl'>
<span class='hljl-k'>using</span><span class='hljl-t'> </span><span class='hljl-n'>LinearAlgebra</span><span class='hljl-t'>
</span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>3</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>/</span><span class='hljl-t'> </span><span class='hljl-nf'>norm</span><span class='hljl-p'>(</span><span class='hljl-n'>v</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-n'>p</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>0</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>0</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-nf'>plot</span><span class='hljl-p'>(</span><span class='hljl-n'>legend</span><span class='hljl-oB'>=</span><span class='hljl-kc'>false</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>u</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>linewidth</span><span class='hljl-oB'>=</span><span class='hljl-ni'>5</span><span class='hljl-p'>)</span>
</pre>
<img src="data:image/png;base64,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" />
<p>The <code>norm</code> function is in the standard library, <code>LinearAlgebra</code>, which must be loaded first through the command <code>using LinearAlgebra</code>. (Though here it is redundant, as that package is loaded when the <code>CalculusWithJulia</code> package is loaded.)</p>
<h2>Aside: review of <code>Julia</code>'s use of dots to work with containers</h2>
<p><code>Julia</code> makes use of the dot, "<code>.</code>", in a few ways to simplify usage when containers, such as vectors, are involved:</p>
<ul>
<li><p><strong>Splatting</strong>. The use of three dots, "<code>...</code>", to "splat" the values from a container like a vector (or tuple) into <em>arguments</em> of a function can be very convenient. It was used above in the definition for the <code>arrow!</code> function: essentially <code>quiver!(unzip([p])..., quiver=unzip([v]))</code>. The <code>quiver</code> function expects 2 (or 3) arguments describing the <code>xs</code> and <code>ys</code> (and sometimes <code>zs</code>). The <code>unzip</code> function returns these in a container, so splatting is used to turn the values in the container into distinct arguments of the function. Whereas the <code>quiver</code> argument expects a tuple of vectors, so no splatting is used for that part of the definition. Another use of splatting we will see is with functions of vectors. These can be defined in terms of the vector's components or the vector as a whole, as below:</p>
</li>
</ul>
<pre class='hljl'>
<span class='hljl-nf'>f</span><span class='hljl-p'>(</span><span class='hljl-n'>x</span><span class='hljl-p'>,</span><span class='hljl-n'>y</span><span class='hljl-p'>,</span><span class='hljl-n'>z</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>x</span><span class='hljl-oB'>^</span><span class='hljl-ni'>2</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>y</span><span class='hljl-oB'>^</span><span class='hljl-ni'>2</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>z</span><span class='hljl-oB'>^</span><span class='hljl-ni'>2</span><span class='hljl-t'>
</span><span class='hljl-nf'>f</span><span class='hljl-p'>(</span><span class='hljl-n'>v</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>]</span><span class='hljl-oB'>^</span><span class='hljl-ni'>2</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-p'>[</span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span><span class='hljl-oB'>^</span><span class='hljl-ni'>2</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-p'>[</span><span class='hljl-ni'>3</span><span class='hljl-p'>]</span><span class='hljl-oB'>^</span><span class='hljl-ni'>2</span>
</pre>
<pre class="output">
f (generic function with 2 methods)
</pre>
<p>The first uses the components and is arguably, much easier to read. The second uses indexing in the function body to access the components. Both uses have their merits. If a function is easier to write in terms of its components, but an interface expects a vector of components as it argument, then splatting can be useful, to go from one style to another, similar to this:</p>
<pre class='hljl'>
<span class='hljl-nf'>g</span><span class='hljl-p'>(</span><span class='hljl-n'>x</span><span class='hljl-p'>,</span><span class='hljl-n'>y</span><span class='hljl-p'>,</span><span class='hljl-n'>z</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>x</span><span class='hljl-oB'>^</span><span class='hljl-ni'>2</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>y</span><span class='hljl-oB'>^</span><span class='hljl-ni'>2</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>z</span><span class='hljl-oB'>^</span><span class='hljl-ni'>2</span><span class='hljl-t'>
</span><span class='hljl-nf'>g</span><span class='hljl-p'>(</span><span class='hljl-n'>v</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-nf'>g</span><span class='hljl-p'>(</span><span class='hljl-n'>v</span><span class='hljl-oB'>...</span><span class='hljl-p'>)</span>
</pre>
<pre class="output">
g (generic function with 2 methods)
</pre>
<p>The splatting will mean <code>g(v)</code> eventually calls <code>g(x,y,z)</code> through <code>Julia</code>'s multiple dispatch machinery when <code>v = [x,y,z]</code>.</p>
<p>(The three dots can also appear in the definition of the arguments to a function, but there the usage is not splatting but rather a specification of a variable number of arguments.)</p>
<ul>
<li><p><strong>Broadcasting</strong>. For a univariate function, <code>f</code>, and vector, <code>xs</code>, the call <code>f.(xs)</code> <em>broadcasts</em> <code>f</code> over each value of <code>xs</code> and returns a container holding all the values. This is a compact alternative to a comprehension when a function is defined. The <code>map</code> function is similar. When <code>f</code> depends on more than one value, broadcasting can still be used: <code>f.(xs, ys)</code> will broadcast <code>f</code> over values formed from <em>both</em> <code>xs</code> and <code>ys</code>. The <code>map</code> function is similar, but broadcasting has the extra feature of attempting to match up the shapes of <code>xs</code> and <code>ys</code> when they are not identical. (See the help page for <code>broadcast</code> for more details.)</p>
</li>
</ul>
<p>For example, if <code>xs</code> is a vector and <code>ys</code> a scalar, then the value in <code>ys</code> is repeated many times to match up with the values of <code>xs</code>. Or if <code>xs</code> and <code>ys</code> have different dimensions, the values of one will be repeated. Consider this:</p>
<pre class='hljl'>
<span class='hljl-n'>xs</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>ys</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>0</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-nf'>f</span><span class='hljl-p'>(</span><span class='hljl-n'>x</span><span class='hljl-p'>,</span><span class='hljl-n'>y</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>x</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>y</span><span class='hljl-t'>
</span><span class='hljl-n'>f</span><span class='hljl-oB'>.</span><span class='hljl-p'>(</span><span class='hljl-n'>xs</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>ys</span><span class='hljl-p'>)</span>
</pre>
<pre class="output">
2-element Array{Int64,1}:
0
2
</pre>
<p>This matches <code>xs</code> and <code>ys</code> to pass <code>(0,0)</code> and then <code>(1,1)</code> to <code>f</code>, returning <code>0</code> and <code>2</code>. Now consider</p>
<pre class='hljl'>
<span class='hljl-n'>xs</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>0</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-p'>];</span><span class='hljl-t'> </span><span class='hljl-n'>ys</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>0</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-cs'># xs is a column vector, ys a row vector</span><span class='hljl-t'>
</span><span class='hljl-n'>f</span><span class='hljl-oB'>.</span><span class='hljl-p'>(</span><span class='hljl-n'>xs</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>ys</span><span class='hljl-p'>)</span>
</pre>
<pre class="output">
2×2 Array{Int64,2}:
0 1
1 2
</pre>
<p>The two dimensions are different so for each value of <code>xs</code> the vector of <code>ys</code> is broadcast. This returns a matrix now.</p>
<p>At times using the "apply" notation: <code>x |> f</code>, in place of using <code>f(x)</code> is useful, as it can move the wrapping function to the right of the expression. To broadcast, <code>.|></code> is available.</p>
<p>At times the automatic broadcasting is not as desired. A case involving "pairs" will come up where we want to broadcast the pair as a whole, not the two sides.</p>
<h2>The dot product</h2>
<p>There is no concept of multiplying two vectors, or for that matter dividing two vectors. However, there are two operations between vectors that are somewhat similar to multiplication, these being the dot product and the cross product. Each has an algebraic definition, but their geometric properties are what motivate their usage. We begin by discussing the dot product.</p>
<p>The dot product between two vectors can be viewed algebraically in terms of the following product. If <span class="math">$\vec{v} = \langle v_1, v_2, \dots, v_n\rangle$</span> and <span class="math">$\vec{w} = \langle w_1, w_2, \dots, w_n\rangle$</span>, then the <em>dot product</em> of <span class="math">$\vec{v}$</span> and <span class="math">$\vec{w}$</span> is defined by:</p>
<p class="math">\[
~
\vec{v} \cdot \vec{w} = v_1 w_1 + v_2 w_2 + \cdots + v_n w_n.
~
\]</p>
<p>From this, we can see the relationship between the norm, or Euclidean length of a vector: <span class="math">$\vec{v} \cdot \vec{v} = \| \vec{v} \|^2$</span>. We can also see that the dot product is commutative, that is <span class="math">$\vec{v} \cdot \vec{w} = \vec{w} \cdot \vec{v}$</span>.</p>
<p>The dot product has an important geometrical interpolation. Two (non-parallel) vectors will lie in the same "plane", even in higher dimensions. Within this plane, there will be an angle between them within <span class="math">$[0, \pi]$</span>. Call this angle <span class="math">$\theta$</span>. (This means the angle between the two vectors is the same regardless of their order of consideration.) Then</p>
<p class="math">\[
~
\vec{v} \cdot \vec{w} = \|\vec{v}\| \|\vec{w}\| \cos(\theta).
~
\]</p>
<p>If we denoted <span class="math">$\hat{v} = \vec{v} / \| \vec{v} \|$</span>, the unit vector in the direction of <span class="math">$\vec{v}$</span>, then by dividing, we see that <span class="math">$\cos(\theta) = \hat{v} \cdot \hat{w}$</span>. That is the angle does not depend on the magnitude of the vectors involved.</p>
<p>The dot product is computed in <code>Julia</code> by the <code>dot</code> function, which is in the <code>LinearAlgebra</code> package of the standard library. This must be loaded (as above) before its use either directly or through the <code>CalculusWithJulia</code> package:</p>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-nf'>dot</span><span class='hljl-p'>(</span><span class='hljl-n'>u</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-p'>)</span>
</pre>
<pre class="output">
4
</pre>
<div class="admonition note"><p class="admonition-title">Note</p><p>In <code>Julia</code>, the unicode operator entered by <code>\cdot[tab]</code> can also be used to mirror the math notation:</p>
</div>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-cs'># u \cdot[tab] v</span>
</pre>
<pre class="output">
4
</pre>
<p>Continuing, to find the angle between <span class="math">$\vec{u}$</span> and <span class="math">$\vec{v}$</span>, we might do this:</p>
<pre class='hljl'>
<span class='hljl-n'>ctheta</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-nf'>dot</span><span class='hljl-p'>(</span><span class='hljl-n'>u</span><span class='hljl-oB'>/</span><span class='hljl-nf'>norm</span><span class='hljl-p'>(</span><span class='hljl-n'>u</span><span class='hljl-p'>),</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-oB'>/</span><span class='hljl-nf'>norm</span><span class='hljl-p'>(</span><span class='hljl-n'>v</span><span class='hljl-p'>))</span><span class='hljl-t'>
</span><span class='hljl-nf'>acos</span><span class='hljl-p'>(</span><span class='hljl-n'>ctheta</span><span class='hljl-p'>)</span>
</pre>
<pre class="output">
0.6435011087932845
</pre>
<p>The cosine of <span class="math">$\pi/2$</span> is <span class="math">$0$</span>, so two vectors which are at right angles to each other will have a dot product of <span class="math">$0$</span>:</p>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-ni'>1</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>v</span>
</pre>
<pre class="output">
0
</pre>
<p>In two dimensions, we learn that a perpendicular line to a line with slope <span class="math">$m$</span> will have slope <span class="math">$-1/m$</span>. From a 2-dimensional vector, say <span class="math">$\vec{u} = \langle u_1, u_2 \rangle$</span> the slope is <span class="math">$u_2/u_1$</span> so a perpendicular vector to <span class="math">$\vec{u}$</span> will be <span class="math">$\langle u_2, -u_1 \rangle$</span>, as above. For higher dimensions, where the angle is harder to visualize, the dot product defines perpendicularness, or <em>orthogonality</em>.</p>
<p>For example, these two vectors are orthogonal, as their dot product is <span class="math">$0$</span>, even though we can't readily visualize them:</p>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>3</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>4</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>5</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-oB'>-</span><span class='hljl-ni'>30</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>4</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>3</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>v</span>
</pre>
<pre class="output">
0
</pre>
<h4>Projection</h4>
<p>From right triangle trigonometry, we learn that <span class="math">$\cos(\theta) = \text{adjacent}/\text{hypotenuse}$</span>. If we use a vector, <span class="math">$\vec{h}$</span> for the hypotenuse, and <span class="math">$\vec{a} = \langle 1, 0 \rangle$</span>, we have this picture:</p>
<pre class='hljl'>
<span class='hljl-n'>h</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>3</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>a</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>0</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-cs'># unit vector</span><span class='hljl-t'>
</span><span class='hljl-n'>h_hat</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>h</span><span class='hljl-t'> </span><span class='hljl-oB'>/</span><span class='hljl-t'> </span><span class='hljl-nf'>norm</span><span class='hljl-p'>(</span><span class='hljl-n'>h</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-n'>theta</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-nf'>acos</span><span class='hljl-p'>(</span><span class='hljl-n'>h_hat</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>a</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>plot</span><span class='hljl-p'>(</span><span class='hljl-n'>legend</span><span class='hljl-oB'>=</span><span class='hljl-kc'>false</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>([</span><span class='hljl-ni'>0</span><span class='hljl-p'>,</span><span class='hljl-ni'>0</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-n'>h</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>([</span><span class='hljl-ni'>0</span><span class='hljl-p'>,</span><span class='hljl-ni'>0</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-nf'>norm</span><span class='hljl-p'>(</span><span class='hljl-n'>h</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-nf'>cos</span><span class='hljl-p'>(</span><span class='hljl-n'>theta</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-n'>a</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>([</span><span class='hljl-ni'>0</span><span class='hljl-p'>,</span><span class='hljl-ni'>0</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-n'>a</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>linewidth</span><span class='hljl-oB'>=</span><span class='hljl-ni'>3</span><span class='hljl-p'>)</span>
</pre>
<img src="data:image/png;base64,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" />
<p>We used vectors to find the angle made by <code>h</code>, and from there, using the length of the hypotenuse is <code>norm(h)</code>, we can identify the length of the adjacent side, it being the length of the hypotenuse times the cosine of <span class="math">$\theta$</span>. Geometrically, we call the vector <code>norm(h) * cos(theta) * a</code> the <em>projection</em> of <span class="math">$\vec{h}$</span> onto <span class="math">$\vec{a}$</span>, the word coming from the shadow <span class="math">$\vec{h}$</span> would cast on the direction of <span class="math">$\vec{a}$</span> were there light coming perpendicular to <span class="math">$\vec{a}$</span>.</p>
<p>The projection can be made for any pair of vectors, and in any dimension <span class="math">$n > 1$</span>. The projection of <span class="math">$\vec{u}$</span> on <span class="math">$\vec{v}$</span> would be a vector of length <span class="math">$\vec{u}$</span> (the hypotenuse) times the cosine of the angle in the direction of <span class="math">$\vec{v}$</span>. In dot-product notation:</p>
<p class="math">\[
~
proj_{\vec{v}}(\vec{u}) = \| \vec{u} \| \frac{\vec{u}\cdot\vec{v}}{\|\vec{u}\|\|\vec{v}\|} \frac{\vec{v}}{\|\vec{v}\|}.
~
\]</p>
<p>This can simplify. After cancelling, and expressing norms in terms of dot products, we have:</p>
<p class="math">\[
~
proj_{\vec{v}}(\vec{u}) = \frac{\vec{u} \cdot \vec{v}}{\vec{v} \cdot \vec{v}} \vec{v} = (\vec{u} \cdot \hat{v}) \hat{v},
~
\]</p>
<p>where <span class="math">$\hat{v}$</span> is the unit vector in the direction of <span class="math">$\vec{v}$</span>.</p>
<h5>Example</h5>
<p>A pendulum, a bob on a string, swings back and forth due to the force of gravity. When the bob is displaced from rest by an angle <span class="math">$\theta$</span>, then the tension force of the string on the bob is directed along the string and has magnitude given by the <em>projection</em> of the force due to gravity.</p>
<p>A <a href="https://en.wikipedia.org/wiki/Free_body_diagram">force diagram</a> is a useful visualization device of physics to illustrate the applied forces involved in a scenario. In this case the bob has two forces acting on it: a force due to tension in the string of unknown magnitude, but in the direction of the string; and a force due to gravity. The latter is in the downward direction and has magnitude <span class="math">$mg$</span>, <span class="math">$g=9.8m/sec^2$</span> being the gravitational constant.</p>
<pre class='hljl'>
<span class='hljl-n'>theta</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>pi</span><span class='hljl-oB'>/</span><span class='hljl-ni'>12</span><span class='hljl-t'>
</span><span class='hljl-n'>mass</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>gravity</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-oB'>/</span><span class='hljl-nfB'>9.8</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-nfB'>9.8</span><span class='hljl-t'>
</span><span class='hljl-n'>l</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-oB'>-</span><span class='hljl-nf'>sin</span><span class='hljl-p'>(</span><span class='hljl-n'>theta</span><span class='hljl-p'>),</span><span class='hljl-t'> </span><span class='hljl-nf'>cos</span><span class='hljl-p'>(</span><span class='hljl-n'>theta</span><span class='hljl-p'>)]</span><span class='hljl-t'>
</span><span class='hljl-n'>p</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-n'>l</span><span class='hljl-t'>
</span><span class='hljl-n'>Fg</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>0</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-n'>mass</span><span class='hljl-oB'>*</span><span class='hljl-n'>gravity</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-nf'>plot</span><span class='hljl-p'>(</span><span class='hljl-n'>legend</span><span class='hljl-oB'>=</span><span class='hljl-kc'>false</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>l</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>Fg</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>scatter!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-oB'>:</span><span class='hljl-ni'>1</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-n'>p</span><span class='hljl-p'>[</span><span class='hljl-ni'>2</span><span class='hljl-oB'>:</span><span class='hljl-ni'>2</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-n'>markersize</span><span class='hljl-oB'>=</span><span class='hljl-ni'>5</span><span class='hljl-p'>)</span>
</pre>
<img src="data:image/png;base64,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" />
<p>The magnitude of the tension force is exactly that of the force of gravity projected onto <span class="math">$\vec{l}$</span>, as the bob is not accelerating in that direction. The component of the gravity force in the perpendicular direction is the part of the gravitational force that causes acceleration in the pendulum. Here we find the projection onto <span class="math">$\vec{l}$</span> and visualize the two components of the gravitational force.</p>
<pre class='hljl'>
<span class='hljl-nf'>plot</span><span class='hljl-p'>(</span><span class='hljl-n'>legend</span><span class='hljl-oB'>=</span><span class='hljl-kc'>false</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>aspect_ratio</span><span class='hljl-oB'>=:</span><span class='hljl-n'>equal</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>l</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>Fg</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>scatter!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-oB'>:</span><span class='hljl-ni'>1</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-n'>p</span><span class='hljl-p'>[</span><span class='hljl-ni'>2</span><span class='hljl-oB'>:</span><span class='hljl-ni'>2</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-n'>markersize</span><span class='hljl-oB'>=</span><span class='hljl-ni'>5</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-n'>proj</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>(</span><span class='hljl-n'>Fg</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>l</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>/</span><span class='hljl-t'> </span><span class='hljl-p'>(</span><span class='hljl-n'>l</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>l</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-n'>l</span><span class='hljl-t'> </span><span class='hljl-cs'># force of gravity in direction of tension</span><span class='hljl-t'>
</span><span class='hljl-n'>porth</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>Fg</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-t'> </span><span class='hljl-n'>proj</span><span class='hljl-t'> </span><span class='hljl-cs'># force of gravity perpendicular to tension</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>proj</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>arrow!</span><span class='hljl-p'>(</span><span class='hljl-n'>p</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>porth</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>linewidth</span><span class='hljl-oB'>=</span><span class='hljl-ni'>3</span><span class='hljl-p'>)</span>
</pre>
<img src="data:image/png;base64,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" />
<h5>Example</h5>
<p>Starting with three vectors, we can create three orthogonal vectors using projection and subtraction. The creation of <code>porth</code> above is the pattern we will exploit.</p>
<p>Let's begin with three vectors in <span class="math">$R^3$</span>:</p>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>3</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>w</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>4</span><span class='hljl-p'>]</span>
</pre>
<pre class="output">
3-element Array{Int64,1}:
1
2
4
</pre>
<p>We can find a vector from <code>v</code> orthogonal to <code>u</code> using:</p>
<pre class='hljl'>
<span class='hljl-nf'>unit_vec</span><span class='hljl-p'>(</span><span class='hljl-n'>u</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>/</span><span class='hljl-t'> </span><span class='hljl-nf'>norm</span><span class='hljl-p'>(</span><span class='hljl-n'>u</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-nf'>projection</span><span class='hljl-p'>(</span><span class='hljl-n'>u</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>(</span><span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-nf'>unit_vec</span><span class='hljl-p'>(</span><span class='hljl-n'>v</span><span class='hljl-p'>))</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-nf'>unit_vec</span><span class='hljl-p'>(</span><span class='hljl-n'>v</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-n'>vorth</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-t'> </span><span class='hljl-nf'>projection</span><span class='hljl-p'>(</span><span class='hljl-n'>v</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>u</span><span class='hljl-p'>)</span><span class='hljl-t'>
</span><span class='hljl-n'>worth</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-n'>w</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-t'> </span><span class='hljl-nf'>projection</span><span class='hljl-p'>(</span><span class='hljl-n'>w</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>u</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-t'> </span><span class='hljl-nf'>projection</span><span class='hljl-p'>(</span><span class='hljl-n'>w</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>vorth</span><span class='hljl-p'>)</span>
</pre>
<pre class="output">
3-element Array{Float64,1}:
-0.33333333333333265
-0.3333333333333336
0.33333333333333354
</pre>
<p>We can verify the orthogonality through:</p>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>vorth</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>worth</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>vorth</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>worth</span>
</pre>
<pre class="output">
(-3.3306690738754696e-16, 8.881784197001252e-16, 3.677613769070831e-16)
</pre>
<p>This only works when the three vectors do not all lie in the same plane. In general, this is the beginnings of the <a href="https://en.wikipedia.org/wiki/Gram-Schmidt_process">Gram-Schmidt</a> process for creating <em>orthogonal</em> vectors from a collection of vectors.</p>
<h4>Algebraic properties</h4>
<p>The dot product is similar to multiplication, but different, as it is an operation defined between vectors of the same dimension. However, many algebraic properties carry over:</p>
<ul>
<li><p>commutative: <span class="math">$\vec{u} \cdot \vec{v} = \vec{v} \cdot \vec{u}$</span></p>
</li>
<li><p>scalar multiplication: <span class="math">$(c\vec{u})\cdot\vec{v} = c(\vec{u}\cdot\vec{v})$</span>.</p>
</li>
<li><p>distributive <span class="math">$\vec{u} \cdot (\vec{v} + \vec{w}) = \vec{u} \cdot \vec{v} + \vec{u} \cdot \vec{w}$</span></p>
</li>
</ul>
<p>The last two can be combined: <span class="math">$\vec{u}\cdot(s \vec{v} + t \vec{w}) = s(\vec{u}\cdot\vec{v}) + t (\vec{u}\cdot\vec{w})$</span>.</p>
<p>But associative does not make sense, as <span class="math">$(\vec{u} \cdot \vec{v}) \cdot \vec{w}$</span> does not make sense as two dot products: the result of the first is not a vector, but a scalar.</p>
<h2>Matrices</h2>
<p>Algebraically, the dot product of two vectors–pair off by components, multiply these, then add– is a common operation. Take for example, the general equation of a line, or a plane:</p>
<p class="math">\[
~
ax + by = c, \quad ax + by + cz = d.
~
\]</p>
<p>The left hand sides are in the form of a dot product, in this case <span class="math">$\langle a,b \rangle \cdot \langle x, y\rangle$</span> and <span class="math">$\langle a,b,c \rangle \cdot \langle x, y, z\rangle$</span> respectively. When there is a system of equations, something like:</p>
<p class="math">\[
~
\begin{array}{}
3x &+& 4y &- &5z &= 10\\
3x &-& 5y &+ &7z &= 11\\
-3x &+& 6y &+ &9z &= 12,
\end{array}
~
\]</p>
<p>Then we might think of <span class="math">$3$</span> vectors <span class="math">$\langle 3,4,-5\rangle$</span>, <span class="math">$\langle 3,-5,7\rangle$</span>, and <span class="math">$\langle -3,6,9\rangle$</span> being dotted with <span class="math">$\langle x,y,z\rangle$</span>. Mathematically, matrices and their associated algebra are used to represent this. In this example, the system of equations above would be represented by a matrix and two vectors:</p>
<p class="math">\[
~
M = \left[
\begin{array}{}
3 & 4 & -5\\
5 &-5 & 7\\
-3& 6 & 9
\end{array}
\right],\quad
\vec{x} = \langle x, y , z\rangle,\quad
\vec{b} = \langle 10, 11, 12\rangle,
~
\]</p>
<p>and the expression <span class="math">$M\vec{x} = \vec{b}$</span>. The matrix <span class="math">$M$</span> is a rectangular collection of numbers or expressions arranged in rows and columns with certain algebraic definitions. There are <span class="math">$m$</span> rows and <span class="math">$n$</span> columns in an <span class="math">$m\times n$</span> matrix. In this example <span class="math">$m=n=3$</span>, and in such a case the matrix is called square. A vector, like <span class="math">$\vec{x}$</span> is usually identified with the <span class="math">$n \times 1$</span> matrix (a column vector). Were that done, the system of equations would be written <span class="math">$Mx=b$</span>.</p>
<p>If we refer to a matrix <span class="math">$M$</span> by its components, a convention is to use <span class="math">$(M)_{ij}$</span> or <span class="math">$m_{ij}$</span> to denote the entry in the <span class="math">$i$</span>th <em>row</em> and <span class="math">$j$</span>th <em>column</em>. Following <code>Julia</code>'s syntax, we would use <span class="math">$m_{i:}$</span> to refer to <em>all</em> entries in the <span class="math">$i$</span>th row, and <span class="math">$m_{:j}$</span> to denote <em>all</em> entries in the <span class="math">$j$</span> column.</p>
<p>In addition to square matrices, there are some other common types of matrices worth naming: square matrices with <span class="math">$0$</span> entries below the diagonal are called upper triangular; square matrices with <span class="math">$0$</span> entries above the diagonal are called lower triangular matrices; square matrices which are <span class="math">$0$</span> except possibly along the diagonal are diagonal matrices; and a diagonal matrix whose diagonal entries are all <span class="math">$1$</span> is called an identify matrix.</p>
<p>Matrices, like vectors, have scalar multiplication defined for them. then scalar multiplication of a matrix <span class="math">$M$</span> by <span class="math">$c$</span> just multiplies each entry by <span class="math">$c$</span>, so the new matrix would have components defined by <span class="math">$cm_{ij}$</span>.</p>
<p>Matrices of the same size, like vectors, have addition defined for them. As with scalar multiplication, addition is defined component wise. So <span class="math">$A+B$</span> is the matrix with <span class="math">$ij$</span> entry <span class="math">$A_{ij} + B_{ij}$</span>.</p>
<h3>Matrix multiplication</h3>
<p>Matrix multiplication may be viewed as a collection of dot product operations. First, matrix multiplication is only defined between <span class="math">$A$</span> and <span class="math">$B$</span>, as <span class="math">$AB$</span>, if the size of <span class="math">$A$</span> is <span class="math">$m\times n$</span> and the size of <span class="math">$B$</span> is <span class="math">$n \times k$</span>. That is the number of columns of <span class="math">$A$</span> must match the number of rows of <span class="math">$B$</span> for the left multiplication of <span class="math">$AB$</span> to be defined. It this is so, then we have the <span class="math">$ij$</span> entry of <span class="math">$AB$</span> is:</p>
<p class="math">\[
~
(AB)_{ij} = A_{i:} \cdot B_{:j}.
~
\]</p>
<p>That is, if we view the <span class="math">$i$</span>th row of <span class="math">$A$</span> and the <span class="math">$j$</span>th column of B as <em>vectors</em>, then the <span class="math">$ij$</span> entry is the dot product.</p>
<p>This is why <span class="math">$M$</span> in the example above, has the coefficients for each equation in a row and not a column, and why <span class="math">$\vec{x}$</span> is thought of as a <span class="math">$n\times 1$</span> matrix (a column vector) and not as a row vector.</p>
<p>Matrix multiplication between <span class="math">$A$</span> and <span class="math">$B$</span> is not, in general, commutative. Not only may the sizes not permit <span class="math">$BA$</span> to be found when <span class="math">$AB$</span> may be, there is just no guarantee when the sizes match that the components will be the same.</p>
<hr />
<p>Matrices have other operations defined on them. We mention three here:</p>
<ul>
<li><p>The tranpose of a matrix flips the difference between row and column, so the <span class="math">$ij$</span> entry of the transpose is the <span class="math">$ji$</span> entry of the matrix. This means the transpose will have size <span class="math">$n \times m$</span> when <span class="math">$M$</span> has size <span class="math">$m \times n$</span>. Mathematically, the transpose is denoted <span class="math">$M^t$</span>.</p>
</li>
<li><p>The <em>determinant</em> of a <em>square</em> matrix is a number that can be used to characterize the matrix. The determinant may be computed different ways, but its <a href="https://en.wikipedia.org/wiki/Leibniz_formula_for_determinants">definition</a> by the Leibniz formula is common. Two special cases are all we need. The <span class="math">$2\times 2$</span> case and the <span class="math">$3 \times 3$</span> case:</p>
</li>
</ul>
<p class="math">\[
~
\left|
\begin{array}{}
a&b\\
c&d
\end{array}
\right| =
ad - bc, \quad
\left|
\begin{array}{}
a&b&c\\
d&e&f\\
g&h&i
\end{array}
\right| =
a \left|
\begin{array}{}
e&f\\
h&i
\end{array}
\right|
- b \left|
\begin{array}{}
d&f\\
g&i
\end{array}
\right|
+c \left|
\begin{array}{}
d&e\\
g&h
\end{array}
\right|.
~
\]</p>
<p>The <span class="math">$3\times 3$</span> case shows how determinants may be <a href="https://en.wikipedia.org/wiki/Determinant#Definition">computed recursively</a>, using "cofactor" expansion.</p>
<ul>
<li><p>The <em>inverse</em> of a square matrix. If <span class="math">$M$</span> is a square matrix and its determinant is non-zero, then there is an <em>inverse</em> matrix, denoted <span class="math">$M^{-1}$</span>, with the properties that <span class="math">$MM^{-1} = M^{-1}M = I$</span>, where <span class="math">$I$</span> is the diagonal matrix of all <span class="math">$1$</span>s called the identify matrix.</p>
</li>
</ul>
<h3>Matrices in Julia</h3>
<p>As mentioned previously, a matrix in <code>Julia</code> is defined component by component with <code>[]</code>. We separate row entries with spaces and columns with semicolons:</p>
<pre class='hljl'>
<span class='hljl-n'>M</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>3</span><span class='hljl-t'> </span><span class='hljl-ni'>4</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-ni'>5</span><span class='hljl-p'>;</span><span class='hljl-t'> </span><span class='hljl-ni'>5</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-ni'>5</span><span class='hljl-t'> </span><span class='hljl-ni'>7</span><span class='hljl-p'>;</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-ni'>3</span><span class='hljl-t'> </span><span class='hljl-ni'>6</span><span class='hljl-t'> </span><span class='hljl-ni'>9</span><span class='hljl-p'>]</span>
</pre>
<pre class="output">
3×3 Array{Int64,2}:
3 4 -5
5 -5 7
-3 6 9
</pre>
<p>Space is the separator, which means computing a component during definition (i.e., writing <code>2 + 3</code> in place of <code>5</code>) can be problematic, as no space can be used in the computation, lest it be parsed as a separator.</p>
<p>Vectors are defined similarly. As they are <em>column</em> vectors, we use a semicolon (or a comma) to separate:</p>
<pre class='hljl'>
<span class='hljl-n'>b</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>10</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>11</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>12</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-cs'># not b = [10 11 12], which would a row vector.</span>
</pre>
<pre class="output">
3-element Array{Int64,1}:
10
11
12
</pre>
<p>In <code>Julia</code>, entries in a matrix (or a vector) are stored in a container with a type wide enough accomodate each entry. Here the type is SymPy's <code>Sym</code> type:</p>
<pre class='hljl'>
<span class='hljl-k'>using</span><span class='hljl-t'> </span><span class='hljl-n'>SymPy</span><span class='hljl-t'>
</span><span class='hljl-nd'>@vars</span><span class='hljl-t'> </span><span class='hljl-n'>x1</span><span class='hljl-t'> </span><span class='hljl-n'>x2</span><span class='hljl-t'> </span><span class='hljl-n'>x3</span><span class='hljl-t'>
</span><span class='hljl-n'>x</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-n'>x1</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>x2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>x3</span><span class='hljl-p'>]</span>
</pre>
<div class="well well-sm">\[ \left[ \begin{array}{r}x_{1}\\x_{2}\\x_{3}\end{array} \right] \]</div>
<p>Matrices may also be defined from blocks. This example shows how to make two column vectors into a matrix:</p>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>10</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>11</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>12</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>13</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>14</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-ni'>15</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-p'>[</span><span class='hljl-n'>u</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-cs'># horizontally combine</span>
</pre>
<pre class="output">
3×2 Array{Int64,2}:
10 13
11 14
12 15
</pre>
<p>Vertically combining the two will stack themL</p>
<pre class='hljl'>
<span class='hljl-p'>[</span><span class='hljl-n'>u</span><span class='hljl-p'>;</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-p'>]</span>
</pre>
<pre class="output">
6-element Array{Int64,1}:
10
11
12
13
14
15
</pre>
<p>Scalar multiplication will just work as expected:</p>
<pre class='hljl'>
<span class='hljl-ni'>2</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-n'>M</span>
</pre>
<pre class="output">
3×3 Array{Int64,2}:
6 8 -10
10 -10 14
-6 12 18
</pre>
<p>Matrix addition is also straightforward:</p>
<pre class='hljl'>
<span class='hljl-n'>M</span><span class='hljl-t'> </span><span class='hljl-oB'>+</span><span class='hljl-t'> </span><span class='hljl-n'>M</span>
</pre>
<pre class="output">
3×3 Array{Int64,2}:
6 8 -10
10 -10 14
-6 12 18
</pre>
<p>Matrix addition expects matrices of the same size. An error will otherwise be thrown. However, if addition is <em>broadcasted</em> then the sizes need only be commensurate. For example, this will add <code>1</code> to each entry of <code>M</code>:</p>
<pre class='hljl'>
<span class='hljl-n'>M</span><span class='hljl-t'> </span><span class='hljl-oB'>.+</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span>
</pre>
<pre class="output">
3×3 Array{Int64,2}:
4 5 -4
6 -4 8
-2 7 10
</pre>
<p>Matrix multiplication is defined by <code>*</code>:</p>
<pre class='hljl'>
<span class='hljl-n'>M</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-n'>M</span>
</pre>
<pre class="output">
3×3 Array{Int64,2}:
44 -38 -32
-31 87 3
-6 12 138
</pre>
<p>We can then see how the system of equations is represented with matrices:</p>
<pre class='hljl'>
<span class='hljl-n'>M</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-n'>x</span><span class='hljl-t'> </span><span class='hljl-oB'>-</span><span class='hljl-t'> </span><span class='hljl-n'>b</span>
</pre>
<div class="well well-sm">\[ \left[ \begin{array}{r}3 x_{1} + 4 x_{2} - 5 x_{3} - 10\\5 x_{1} - 5 x_{2} + 7 x_{3} - 11\\- 3 x_{1} + 6 x_{2} + 9 x_{3} - 12\end{array} \right] \]</div>
<p>Here we use <code>SymPy</code> to verify the above:</p>
<pre class='hljl'>
<span class='hljl-n'>A</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-nf'>symbols</span><span class='hljl-p'>(</span><span class='hljl-s'>"A</span><span class='hljl-si'>$i$j</span><span class='hljl-s'>"</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>real</span><span class='hljl-oB'>=</span><span class='hljl-kc'>true</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-k'>for</span><span class='hljl-t'> </span><span class='hljl-n'>i</span><span class='hljl-t'> </span><span class='hljl-kp'>in</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-oB'>:</span><span class='hljl-ni'>3</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>j</span><span class='hljl-t'> </span><span class='hljl-kp'>in</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-oB'>:</span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>B</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-nf'>symbols</span><span class='hljl-p'>(</span><span class='hljl-s'>"B</span><span class='hljl-si'>$i$j</span><span class='hljl-s'>"</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>real</span><span class='hljl-oB'>=</span><span class='hljl-kc'>true</span><span class='hljl-p'>)</span><span class='hljl-t'> </span><span class='hljl-k'>for</span><span class='hljl-t'> </span><span class='hljl-n'>i</span><span class='hljl-t'> </span><span class='hljl-kp'>in</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-oB'>:</span><span class='hljl-ni'>2</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>j</span><span class='hljl-t'> </span><span class='hljl-kp'>in</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-oB'>:</span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span>
</pre>
<div class="well well-sm">\[\left[ \begin{array}{rr}B_{11}&B_{12}\\B_{21}&B_{22}\end{array}\right]\]</div>
<p>The matrix product has the expected size: the number of rows of <code>A</code> (3) by the number of columns of <code>B</code> (2):</p>
<pre class='hljl'>
<span class='hljl-n'>A</span><span class='hljl-oB'>*</span><span class='hljl-n'>B</span>
</pre>
<div class="well well-sm">\[\left[ \begin{array}{rr}A_{11} B_{11} + A_{12} B_{21}&A_{11} B_{12} + A_{12} B_{22}\\A_{21} B_{11} + A_{22} B_{21}&A_{21} B_{12} + A_{22} B_{22}\\A_{31} B_{11} + A_{32} B_{21}&A_{31} B_{12} + A_{32} B_{22}\end{array}\right]\]</div>
<p>This confirms how each entry (<code>(A*B)[i,j]</code>) is from a dot product (<code>A[i,:] ⋅ B[:,j]</code>):</p>
<pre class='hljl'>
<span class='hljl-p'>[</span><span class='hljl-t'> </span><span class='hljl-p'>(</span><span class='hljl-n'>A</span><span class='hljl-oB'>*</span><span class='hljl-n'>B</span><span class='hljl-p'>)[</span><span class='hljl-n'>i</span><span class='hljl-p'>,</span><span class='hljl-n'>j</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-oB'>==</span><span class='hljl-t'> </span><span class='hljl-n'>A</span><span class='hljl-p'>[</span><span class='hljl-n'>i</span><span class='hljl-p'>,</span><span class='hljl-oB'>:</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-oB'>⋅</span><span class='hljl-t'> </span><span class='hljl-n'>B</span><span class='hljl-p'>[</span><span class='hljl-oB'>:</span><span class='hljl-p'>,</span><span class='hljl-n'>j</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-k'>for</span><span class='hljl-t'> </span><span class='hljl-n'>i</span><span class='hljl-t'> </span><span class='hljl-kp'>in</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-oB'>:</span><span class='hljl-ni'>3</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>j</span><span class='hljl-t'> </span><span class='hljl-kp'>in</span><span class='hljl-t'> </span><span class='hljl-ni'>1</span><span class='hljl-oB'>:</span><span class='hljl-ni'>2</span><span class='hljl-p'>]</span>
</pre>
<pre class="output">
3×2 Array{Bool,2}:
1 1
1 1
1 1
</pre>
<p>When the multiplication is broadcasted though, with <code>.*</code>, the operation will be component wise:</p>
<pre class='hljl'>
<span class='hljl-n'>M</span><span class='hljl-t'> </span><span class='hljl-oB'>.*</span><span class='hljl-t'> </span><span class='hljl-n'>M</span><span class='hljl-t'> </span><span class='hljl-cs'># component wise (Hadamard product)</span>
</pre>
<pre class="output">
3×3 Array{Int64,2}:
9 16 25
25 25 49
9 36 81
</pre>
<hr />
<p>The determinant is found through <code>det</code> provided by the built-in <code>LinearAlgebra</code> package:</p>
<pre class='hljl'>
<span class='hljl-k'>using</span><span class='hljl-t'> </span><span class='hljl-n'>LinearAlgebra</span><span class='hljl-t'> </span><span class='hljl-cs'># loaded with the CalculusWithJulia package</span><span class='hljl-t'>
</span><span class='hljl-nf'>det</span><span class='hljl-p'>(</span><span class='hljl-n'>M</span><span class='hljl-p'>)</span>
</pre>
<pre class="output">
-600.0
</pre>
<hr />
<p>The transpose of a matrix is found through <code>transpose</code> which doesn't create a new object, but rather an object which knows to switch indices when referenced:</p>
<pre class='hljl'>
<span class='hljl-nf'>transpose</span><span class='hljl-p'>(</span><span class='hljl-n'>M</span><span class='hljl-p'>)</span>
</pre>
<pre class="output">
3×3 LinearAlgebra.Transpose{Int64,Array{Int64,2}}:
3 5 -3
4 -5 6
-5 7 9
</pre>
<p>For matrices with <em>real</em> numbers, the transpose can be performed with the postfix operation <code>'</code>:</p>
<pre class='hljl'>
<span class='hljl-n'>M</span><span class='hljl-oB'>'</span>
</pre>
<pre class="output">
3×3 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
3 5 -3
4 -5 6
-5 7 9
</pre>
<p>(However, this is not true for matrices with complex numbers as <code>'</code> is the "adjoint," that is, the transpose of the matrix <em>after</em> taking complex conjugates.)</p>
<p>With <code>u</code> and <code>v</code>, vectors from above, we have:</p>
<pre class='hljl'>
<span class='hljl-p'>[</span><span class='hljl-n'>u</span><span class='hljl-oB'>'</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-oB'>'</span><span class='hljl-p'>]</span><span class='hljl-t'> </span><span class='hljl-cs'># [u v] was a 3 × 2 matrix, above</span>
</pre>
<pre class="output">
1×6 LinearAlgebra.Adjoint{Int64,Array{Int64,1}}:
10 11 12 13 14 15
</pre>
<p>and</p>
<pre class='hljl'>
<span class='hljl-p'>[</span><span class='hljl-n'>u</span><span class='hljl-oB'>'</span><span class='hljl-p'>;</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-oB'>'</span><span class='hljl-p'>]</span>
</pre>
<pre class="output">
2×3 Array{Int64,2}:
10 11 12
13 14 15
</pre>
<div class="alert alert-info" role="alert">
<div class="markdown"><p>The adjoint is defined <em>recursively</em> in <code>Julia</code>. In the <code>CalculusWithJulia</code> package, we overload the ''' notation for <em>functions</em> to yield a univariate derivative found with automatic differentiation. This can lead to problems: if we have a matrix of functions, <code>M</code>, and took the transpose with <code>M'</code>, then the entries of <code>M'</code> would be the derivatives of the functions in <code>M</code>–not the original functions. This is very much likely to not be what is desired. The <code>CalculusWithJulia</code> package commits <strong>type piracy</strong> here <em>and</em> abuses the generic idea for ''' in Julia. In general type piracy is very much frowned upon, as it can change expected behaviour. It is defined in <code>CalculusWithJulia</code>, as that package is intended only to act as a means to ease users into the wider package ecosystem of <code>Julia</code>.</p>
</div>
</div>
<hr />
<p>The dot product and matrix multiplication are related, and mathematically identified through the relation: <span class="math">$\vec{u} \cdot \vec{v} = u^t v$</span>, where the right hand side identifies <span class="math">$\vec{u}$</span> and <span class="math">$\vec{v}$</span> with a <span class="math">$n\times 1$</span> column matrix, and <span class="math">$u^t$</span> is the transpose, or a <span class="math">$1\times n$</span> row matrix. However, mathematically the left side is a scalar, but the right side a <span class="math">$1\times 1$</span> matrix. While distinct, the two are identified as the same. This is similar to the useful identification of a point and a vector. Within <code>Julia</code>, these identifications are context dependent. <code>Julia</code> stores vectors as 1-dimensional arrays, transposes as <span class="math">$1$</span>-dimensional objects, and matrices as <span class="math">$2$</span>-dimensional arrays. The product of a transpose and a vector is a scalar:</p>
<pre class='hljl'>
<span class='hljl-n'>u</span><span class='hljl-p'>,</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-oB'>=</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-ni'>2</span><span class='hljl-p'>],</span><span class='hljl-t'> </span><span class='hljl-p'>[</span><span class='hljl-ni'>3</span><span class='hljl-p'>,</span><span class='hljl-ni'>5</span><span class='hljl-p'>,</span><span class='hljl-ni'>8</span><span class='hljl-p'>]</span><span class='hljl-t'>
</span><span class='hljl-n'>u</span><span class='hljl-oB'>'</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-n'>v</span><span class='hljl-t'> </span><span class='hljl-cs'># a scalar</span>
</pre>
<pre class="output">
24
</pre>
<p>But if we make <code>u</code> a matrix (here by "<code>reshape</code>ing" in a matrix with <span class="math">$1$</span> row and <span class="math">$3$</span> columns), we will get a matrix (actually a vector) in return:</p>
<pre class='hljl'>
<span class='hljl-nf'>reshape</span><span class='hljl-p'>(</span><span class='hljl-n'>u</span><span class='hljl-p'>,(</span><span class='hljl-ni'>1</span><span class='hljl-p'>,</span><span class='hljl-ni'>3</span><span class='hljl-p'>))</span><span class='hljl-t'> </span><span class='hljl-oB'>*</span><span class='hljl-t'> </span><span class='hljl-n'>v</span>
</pre>