1 USING: help.markup help.syntax math math.functions sequences ;
4 ARTICLE: "math-vectors" "Vector arithmetic"
5 "Any Factor sequence can be used to represent a mathematical vector, however for best performance, the sequences defined by the " { $vocab-link "specialized-arrays" } " and " { $vocab-link "math.vectors.simd" } " vocabularies should be used."
7 "Acting on vectors by a scalar:"
17 "Vector unary operations:"
21 { $subsection vfloor }
22 { $subsection vceiling }
23 { $subsection vtruncate }
24 "Vector/vector binary operations:"
30 "Saturated arithmetic (only on " { $link "specialized-arrays" } "):"
38 { $subsection vbitand }
39 { $subsection vbitor }
40 { $subsection vbitxor }
41 "Inner product and norm:"
44 { $subsection norm-sq }
45 { $subsection normalize }
47 { $subsection distance }
50 { $subsection vsupremum }
51 { $subsection vinfimum }
52 { $subsection trilerp }
53 { $subsection bilerp }
55 { $subsection vnlerp }
56 { $subsection vbilerp } ;
61 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
62 { $description "Negates each element of " { $snippet "u" } "." } ;
65 { $values { "u" "a sequence of numbers" } { "v" "a sequence of non-negative real numbers" } }
66 { $description "Takes the absolute value of each element of " { $snippet "u" } "." } ;
69 { $values { "u" "a sequence of non-negative real numbers" } { "v" "a sequence of non-negative real numbers" } }
70 { $description "Takes the square root of each element of " { $snippet "u" } "." }
71 { $warning "For performance reasons, this does not work with negative inputs, unlike " { $link sqrt } "." } ;
74 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } }
75 { $description "Takes the " { $link floor } " of each element of " { $snippet "u" } "." } ;
78 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } }
79 { $description "Takes the " { $link ceiling } " of each element of " { $snippet "u" } "." } ;
82 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } }
83 { $description "Truncates each element of " { $snippet "u" } "." } ;
86 { $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
87 { $description "Adds " { $snippet "n" } " to each element of " { $snippet "u" } "." } ;
90 { $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
91 { $description "Adds " { $snippet "n" } " to each element of " { $snippet "u" } "." } ;
94 { $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
95 { $description "Subtracts each element of " { $snippet "u" } " from " { $snippet "n" } "." } ;
98 { $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
99 { $description "Subtracts " { $snippet "n" } " from each element of " { $snippet "u" } "." } ;
102 { $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
103 { $description "Multiplies each element of " { $snippet "u" } " by " { $snippet "n" } "." } ;
106 { $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
107 { $description "Multiplies each element of " { $snippet "u" } " by " { $snippet "n" } "." } ;
110 { $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
111 { $description "Divides " { $snippet "n" } " by each element of " { $snippet "u" } "." }
112 { $errors "May throw an error if a division by zero occurs; see " { $link "division-by-zero" } "." } ;
115 { $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
116 { $description "Divides each element of " { $snippet "u" } " by " { $snippet "n" } "." }
117 { $errors "May throw an error if a division by zero occurs; see " { $link "division-by-zero" } "." } ;
120 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
121 { $description "Adds " { $snippet "u" } " and " { $snippet "v" } " component-wise." } ;
124 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
125 { $description "Subtracts " { $snippet "v" } " from " { $snippet "u" } " component-wise." } ;
128 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
129 { $description "Adds and subtracts alternate elements of " { $snippet "v" } " and " { $snippet "u" } " component-wise." }
132 "USING: math.vectors prettyprint ;"
133 "{ 1 2 3 } { 2 3 2 } v+- ."
139 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
140 { $description "Subtracts " { $snippet "v" } " from " { $snippet "u" } " component-wise; any components which become negative are set to zero." } ;
143 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
144 { $description "Multiplies " { $snippet "u" } " and " { $snippet "v" } " component-wise." } ;
147 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
148 { $description "Divides " { $snippet "u" } " by " { $snippet "v" } " component-wise." }
149 { $errors "May throw an error if a division by zero occurs; see " { $link "division-by-zero" } "." } ;
152 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
153 { $description "Creates a sequence where each element is the maximum of the corresponding elements from " { $snippet "u" } " andd " { $snippet "v" } "." }
154 { $examples { $example "USING: math.vectors prettyprint ;" "{ 1 2 5 } { -7 6 3 } vmax ." "{ 1 6 5 }" } } ;
157 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
158 { $description "Creates a sequence where each element is the minimum of the corresponding elements from " { $snippet "u" } " andd " { $snippet "v" } "." }
159 { $examples { $example "USING: math.vectors prettyprint ;" "{ 1 2 5 } { -7 6 3 } vmin ." "{ -7 2 3 }" } } ;
162 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "x" "a real number" } }
163 { $description "Computes the real-valued dot product." }
165 "This word can also take complex number sequences as input, however mathematically it will compute the wrong result. The complex-valued dot product is defined differently:"
166 { $code "0 [ conjugate * + ] 2reduce" }
170 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
171 { $description "Adds " { $snippet "u" } " and " { $snippet "v" } " component-wise with saturation." }
175 "USING: math.vectors prettyprint specialized-arrays ;"
176 "SPECIALIZED-ARRAY: uchar"
177 "uchar-array{ 100 200 150 } uchar-array{ 70 70 70 } vs+ ."
178 "uchar-array{ 170 255 220 }"
180 "Without saturation:"
182 "USING: math.vectors prettyprint specialized-arrays ;"
183 "SPECIALIZED-ARRAY: uchar"
184 "uchar-array{ 100 200 150 } uchar-array{ 70 70 70 } v+ ."
185 "uchar-array{ 170 14 220 }"
190 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
191 { $description "Subtracts " { $snippet "v" } " from " { $snippet "u" } " component-wise with saturation." } ;
194 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
195 { $description "Multiplies " { $snippet "u" } " and " { $snippet "v" } " component-wise with saturation." } ;
198 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
199 { $description "Takes the bitwise and of " { $snippet "u" } " and " { $snippet "v" } " component-wise." }
200 { $notes "Unlike " { $link bitand } ", this word may be used on a specialized array of floats or doubles, in which case the bitwise representation of the floating point numbers is operated upon." } ;
203 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
204 { $description "Takes the bitwise or of " { $snippet "u" } " and " { $snippet "v" } " component-wise." }
205 { $notes "Unlike " { $link bitor } ", this word may be used on a specialized array of floats or doubles, in which case the bitwise representation of the floating point numbers is operated upon." } ;
208 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
209 { $description "Takes the bitwise exclusive or of " { $snippet "u" } " and " { $snippet "v" } " component-wise." }
210 { $notes "Unlike " { $link bitxor } ", this word may be used on a specialized array of floats or doubles, in which case the bitwise representation of the floating point numbers is operated upon." } ;
213 { $values { "v" "a sequence of numbers" } { "x" "a non-negative real number" } }
214 { $description "Computes the squared length of a mathematical vector." } ;
217 { $values { "v" "a sequence of numbers" } { "x" "a non-negative real number" } }
218 { $description "Computes the length of a mathematical vector." } ;
221 { $values { "u" "a sequence of numbers, not all zero" } { "v" "a sequence of numbers" } }
222 { $description "Outputs a vector with the same direction as " { $snippet "u" } " but length 1." } ;
225 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "x" "a non-negative real number" } }
226 { $description "Outputs the Euclidean distance between two vectors." } ;
229 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "axis" "a sequence of 0/1" } { "w" "a sequence of numbers" } }
230 { $description "Using " { $snippet "w" } " as a template, creates a new sequence containing corresponding elements from " { $snippet "u" } " in place of 0, and corresponding elements from " { $snippet "v" } " in place of 1." }
231 { $examples { $example "USING: math.vectors prettyprint ;" "{ 1 2 3 } { 4 5 6 } { 0 1 0 } set-axis ." "{ 1 5 3 }" } } ;
233 { 2map v+ v- v* v/ } related-words
235 { 2reduce v. } related-words
237 { vs+ vs- vs* } related-words