]> gitweb.factorcode.org Git - factor.git/blob - basis/math/vectors/vectors-docs.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / basis / math / vectors / vectors-docs.factor
1 USING: help.markup help.syntax math math.functions sequences ;
2 IN: math.vectors
3
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."
6 $nl
7 "Acting on vectors by a scalar:"
8 { $subsection vneg }
9 { $subsection v*n }
10 { $subsection n*v }
11 { $subsection v/n }
12 { $subsection n/v }
13 { $subsection v+n }
14 { $subsection n+v }
15 { $subsection v-n }
16 { $subsection n-v }
17 "Vector unary operations:"
18 { $subsection vneg }
19 { $subsection vabs }
20 { $subsection vsqrt }
21 { $subsection vfloor }
22 { $subsection vceiling }
23 { $subsection vtruncate }
24 "Vector/vector binary operations:"
25 { $subsection v+ }
26 { $subsection v- }
27 { $subsection v+- }
28 { $subsection v* }
29 { $subsection v/ }
30 "Saturated arithmetic (only on " { $link "specialized-arrays" } "):"
31 { $subsection vs+ }
32 { $subsection vs- }
33 { $subsection vs* }
34 "Comparisons:"
35 { $subsection vmax }
36 { $subsection vmin }
37 "Bitwise operations:"
38 { $subsection vbitand }
39 { $subsection vbitandn }
40 { $subsection vbitor }
41 { $subsection vbitxor }
42 { $subsection vlshift }
43 { $subsection vrshift }
44 "Shuffling:"
45 { $subsection vshuffle }
46 "Inner product and norm:"
47 { $subsection v. }
48 { $subsection norm }
49 { $subsection norm-sq }
50 { $subsection normalize }
51 "Comparing vectors:"
52 { $subsection distance }
53 { $subsection v~ }
54 "Other functions:"
55 { $subsection vsupremum }
56 { $subsection vinfimum }
57 { $subsection trilerp }
58 { $subsection bilerp }
59 { $subsection vlerp }
60 { $subsection vnlerp }
61 { $subsection vbilerp } ;
62
63 ABOUT: "math-vectors"
64
65 HELP: vneg
66 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
67 { $description "Negates each element of " { $snippet "u" } "." } ;
68
69 HELP: vabs
70 { $values { "u" "a sequence of numbers" } { "v" "a sequence of non-negative real numbers" } }
71 { $description "Takes the absolute value of each element of " { $snippet "u" } "." } ;
72
73 HELP: vsqrt
74 { $values { "u" "a sequence of non-negative real numbers" } { "v" "a sequence of non-negative real numbers" } }
75 { $description "Takes the square root of each element of " { $snippet "u" } "." }
76 { $warning "For performance reasons, this does not work with negative inputs, unlike " { $link sqrt } "." } ;
77
78 HELP: vfloor
79 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } }
80 { $description "Takes the " { $link floor } " of each element of " { $snippet "u" } "." } ;
81
82 HELP: vceiling
83 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } }
84 { $description "Takes the " { $link ceiling } " of each element of " { $snippet "u" } "." } ;
85
86 HELP: vtruncate
87 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } }
88 { $description "Truncates each element of " { $snippet "u" } "." } ;
89
90 HELP: n+v
91 { $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
92 { $description "Adds " { $snippet "n" } " to each element of " { $snippet "u" } "." } ;
93
94 HELP: v+n
95 { $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
96 { $description "Adds " { $snippet "n" } " to each element of " { $snippet "u" } "." } ;
97
98 HELP: n-v
99 { $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
100 { $description "Subtracts each element of " { $snippet "u" } " from " { $snippet "n" } "." } ;
101
102 HELP: v-n
103 { $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
104 { $description "Subtracts " { $snippet "n" } " from each element of " { $snippet "u" } "." } ;
105
106 HELP: n*v
107 { $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
108 { $description "Multiplies each element of " { $snippet "u" } " by " { $snippet "n" } "." } ;
109
110 HELP: v*n
111 { $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
112 { $description "Multiplies each element of " { $snippet "u" } " by " { $snippet "n" } "." } ;
113
114 HELP: n/v
115 { $values { "n" "a number" } { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } }
116 { $description "Divides " { $snippet "n" } " by each element of " { $snippet "u" } "." }
117 { $errors "May throw an error if a division by zero occurs; see " { $link "division-by-zero" } "." } ;
118
119 HELP: v/n
120 { $values { "u" "a sequence of numbers" } { "n" "a number" } { "v" "a sequence of numbers" } }
121 { $description "Divides each element of " { $snippet "u" } " by " { $snippet "n" } "." }
122 { $errors "May throw an error if a division by zero occurs; see " { $link "division-by-zero" } "." } ;
123
124 HELP: v+
125 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
126 { $description "Adds " { $snippet "u" } " and " { $snippet "v" } " component-wise." } ;
127
128 HELP: v-
129 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
130 { $description "Subtracts " { $snippet "v" } " from " { $snippet "u" } " component-wise." } ;
131
132 HELP: v+-
133 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
134 { $description "Adds and subtracts alternate elements of " { $snippet "v" } " and " { $snippet "u" } " component-wise." }
135 { $examples
136     { $example
137         "USING: math.vectors prettyprint ;"
138         "{ 1 2 3 } { 2 3 2 } v+- ."
139         "{ -1 5 1 }"
140     }
141 } ;
142
143 HELP: [v-]
144 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
145 { $description "Subtracts " { $snippet "v" } " from " { $snippet "u" } " component-wise; any components which become negative are set to zero." } ;
146
147 HELP: v*
148 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
149 { $description "Multiplies " { $snippet "u" } " and " { $snippet "v" } " component-wise." } ;
150
151 HELP: v/
152 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
153 { $description "Divides " { $snippet "u" } " by " { $snippet "v" } " component-wise." }
154 { $errors "May throw an error if a division by zero occurs; see " { $link "division-by-zero" } "." } ;
155
156 HELP: vmax
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 maximum of the corresponding elements from " { $snippet "u" } " andd " { $snippet "v" } "." }
159 { $examples { $example "USING: math.vectors prettyprint ;" "{ 1 2 5 } { -7 6 3 } vmax ." "{ 1 6 5 }" } } ;
160
161 HELP: vmin
162 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
163 { $description "Creates a sequence where each element is the minimum of the corresponding elements from " { $snippet "u" } " andd " { $snippet "v" } "." }
164 { $examples { $example "USING: math.vectors prettyprint ;" "{ 1 2 5 } { -7 6 3 } vmin ." "{ -7 2 3 }" } } ;
165
166 HELP: v.
167 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "x" "a real number" } }
168 { $description "Computes the dot product of two vectors." } ;
169
170 HELP: vs+
171 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
172 { $description "Adds " { $snippet "u" } " and " { $snippet "v" } " component-wise with saturation." }
173 { $examples
174     "With saturation:"
175     { $example
176         "USING: alien.c-types math.vectors prettyprint specialized-arrays ;"
177         "SPECIALIZED-ARRAY: uchar"
178         "uchar-array{ 100 200 150 } uchar-array{ 70 70 70 } vs+ ."
179         "uchar-array{ 170 255 220 }"
180     }
181     "Without saturation:"
182     { $example
183         "USING: alien.c-types math.vectors prettyprint specialized-arrays ;"
184         "SPECIALIZED-ARRAY: uchar"
185         "uchar-array{ 100 200 150 } uchar-array{ 70 70 70 } v+ ."
186         "uchar-array{ 170 14 220 }"
187     }
188 } ;
189
190 HELP: vs-
191 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
192 { $description "Subtracts " { $snippet "v" } " from " { $snippet "u" } " component-wise with saturation." } ;
193
194 HELP: vs*
195 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "w" "a sequence of numbers" } }
196 { $description "Multiplies " { $snippet "u" } " and " { $snippet "v" } " component-wise with saturation." } ;
197
198 HELP: vbitand
199 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
200 { $description "Takes the bitwise and of " { $snippet "u" } " and " { $snippet "v" } " component-wise." }
201 { $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." } ;
202
203 HELP: vbitandn
204 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
205 { $description "Takes the bitwise and-not of " { $snippet "u" } " and " { $snippet "v" } " component-wise, where " { $snippet "x and-not y" } " is defined as " { $snippet "not(x) and y" } "." }
206 { $notes "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." } ;
207
208 HELP: vbitor
209 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
210 { $description "Takes the bitwise or of " { $snippet "u" } " and " { $snippet "v" } " component-wise." }
211 { $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." } ;
212
213 HELP: vbitxor
214 { $values { "u" "a sequence of real numbers" } { "v" "a sequence of real numbers" } { "w" "a sequence of real numbers" } }
215 { $description "Takes the bitwise exclusive or of " { $snippet "u" } " and " { $snippet "v" } " component-wise." }
216 { $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." } ;
217
218 HELP: vlshift
219 { $values { "u" "a sequence of integers" } { "n" "a non-negative integer" } { "w" "a sequence of integers" } }
220 { $description "Shifts each element of " { $snippet "u" } " to the left by " { $snippet "n" } " bits." }
221 { $notes "Undefined behavior will result if " { $snippet "n" } " is negative." } ;
222
223 HELP: vrshift
224 { $values { "u" "a sequence of integers" } { "n" "a non-negative integer" } { "w" "a sequence of integers" } }
225 { $description "Shifts each element of " { $snippet "u" } " to the right by " { $snippet "n" } " bits." }
226 { $notes "Undefined behavior will result if " { $snippet "n" } " is negative." } ;
227
228 HELP: hlshift
229 { $values { "u" "a SIMD array" } { "n" "a non-negative integer" } { "w" "a SIMD array" } }
230 { $description "Shifts the entire SIMD array to the left by " { $snippet "n" } " bytes. This word may only be used in a context where the compiler can statically infer that the input is a SIMD array." } ;
231
232 HELP: hrshift
233 { $values { "u" "a SIMD array" } { "n" "a non-negative integer" } { "w" "a SIMD array" } }
234 { $description "Shifts the entire SIMD array to the right by " { $snippet "n" } " bytes. This word may only be used in a context where the compiler can statically infer that the input is a SIMD array." } ;
235
236 HELP: vshuffle
237 { $values { "u" "a SIMD array" } { "perm" "an array of integers" } { "v" "a SIMD array" } }
238 { $description "Permutes the elements of a SIMD array. Duplicate entries are allowed in the permutation." }
239 { $examples
240     { $example
241         "USING: alien.c-types math.vectors math.vectors.simd" "prettyprint ;"
242         "SIMD: int"
243         "int-4{ 69 42 911 13 } { 1 3 2 3 } vshuffle ."
244         "int-4{ 42 13 911 13 }"
245     }
246 } ;
247
248 HELP: norm-sq
249 { $values { "v" "a sequence of numbers" } { "x" "a non-negative real number" } }
250 { $description "Computes the squared length of a mathematical vector." } ;
251
252 HELP: norm
253 { $values { "v" "a sequence of numbers" } { "x" "a non-negative real number" } }
254 { $description "Computes the length of a mathematical vector." } ;
255
256 HELP: normalize
257 { $values { "u" "a sequence of numbers, not all zero" } { "v" "a sequence of numbers" } }
258 { $description "Outputs a vector with the same direction as " { $snippet "u" } " but length 1." } ;
259
260 HELP: distance
261 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "x" "a non-negative real number" } }
262 { $description "Outputs the Euclidean distance between two vectors." } ;
263
264 HELP: set-axis
265 { $values { "u" "a sequence of numbers" } { "v" "a sequence of numbers" } { "axis" "a sequence of 0/1" } { "w" "a sequence of numbers" } }
266 { $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." }
267 { $examples { $example "USING: math.vectors prettyprint ;" "{ 1 2 3 } { 4 5 6 } { 0 1 0 } set-axis ." "{ 1 5 3 }" } } ;
268
269 { 2map v+ v- v* v/ } related-words
270
271 { 2reduce v. } related-words
272
273 { vs+ vs- vs* } related-words