source: issm/trunk/src/m/array/arrayoperations.js@ 22758

Last change on this file since 22758 was 22758, checked in by Mathieu Morlighem, 7 years ago

merged trunk-jpl and trunk for revision 22757

File size: 9.6 KB
Line 
1function ArrayMax(array){ //{{{
2 //Calculate array max using for loop instead of Math.max.apply(null, array) to avoid recursive stack overflow in mobile browsers
3
4 var max=-Infinity;
5
6 for (var i=0;i<array.length; i++) {
7 max=Math.max(max,array[i]);
8 }
9
10 return max;
11} //}}}
12function ArrayMax2D(array){ //{{{
13
14 var max=-Infinity;
15
16 for (var i=0;i<array.length;i++){
17 var subarray=array[i];
18 max=Math.max(max,ArrayMax(subarray));
19 }
20
21 return max;
22} //}}}
23function ArrayMin(array){ //{{{
24 //Calculate array min using for loop instead of Math.min.apply(null, array) to avoid recursive stack overflow in mobile browsers
25
26 var min=Infinity;
27
28 for (var i=0;i<array.length; i++) {
29 min=Math.min(min,array[i]);
30 }
31
32 return min;
33} //}}}
34function ArrayMin2D(array){ //{{{
35
36 var min=Infinity;
37
38 for (var i=0;i<array.length;i++){
39 var subarray=array[i];
40 min=Math.min(min,ArrayMin(subarray));
41 }
42
43 return min;
44} //}}}
45function ArraySum(array){ //{{{
46 var sum=0;
47 for(var i=0;i<array.length;i++)sum+=array[i];
48 return sum;
49} //}}}
50function ArrayXPY(){ //{{{
51 if (arguments.length<2)throw Error("ArrayXPY error message: sum has to be for at least two arrays!");
52
53 //check internal consistency of arrays provided!:
54 var firstarray=arguments[0];
55 var firstsize=firstarray.length;
56
57 for(var a=1;a<arguments.length;a++){
58 var array=arguments[a];
59 if(array.length!=firstsize)throw Error("ArrayXPY error message: arrays provided as arguments are not of the same length!");
60 }
61
62 //do the sum:
63 var sum=NewArrayFill(firstsize,0);
64 for(var a=0;a<arguments.length;a++){
65 var array=arguments[a];
66 for(var i=0;i<array.length;i++){
67 sum[i]+=array[i];
68 }
69 }
70 return sum;
71
72} //}}}
73function ArrayOr(){ //{{{
74 if (arguments.length<2)throw Error("ArrayOr error message: sum has to be for at least two arrays!");
75
76 //check internal consistency of arrays provided!:
77 var firstarray=arguments[0];
78 var firstsize=firstarray.length;
79
80 for(var a=1;a<arguments.length;a++){
81 var array=arguments[a];
82 if(array.length!=firstsize)throw Error("ArrayOr error message: arrays provided as arguments are not of the same length!");
83 }
84
85 //do the or:
86 var or=NewArrayFill(firstsize,0);
87 for(var a=0;a<arguments.length;a++){
88 var array=arguments[a];
89 for(var i=0;i<array.length;i++){
90 or[i] = or[i] | array[i];
91 }
92 }
93 return or;
94
95} //}}}
96function ArrayTranspose(array) { //{{{
97 return Object.keys(array[0]).map(function(column) {
98 return array.map(function(row) {
99 return row[column];
100 });
101 });
102} //}}}
103function ArrayConcat(a, b) { //{{{
104 // Make sure that both typed arrays are of the same type
105 if(Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) {
106 throw 'The types of the two arguments passed for parameters a and b do not match.';
107 }
108 var c;
109 if(a instanceof Float64Array) {
110 c = new a.constructor(a.length + b.length);
111 c.set(a);
112 c.set(b, a.length);
113 }
114 else {
115 c = clone(a).concat(clone(b));
116 }
117 return c;
118} //}}}
119function ListToMatrix(list, elementsPerSubArray) { //{{{
120 var matrix = [], i, k;
121
122 for (i = 0, k = -1; i < list.length; i++) {
123 if (i % elementsPerSubArray === 0) {
124 k++;
125 matrix[k] = [];
126 }
127
128 matrix[k].push(list[i]);
129 }
130
131 return matrix;
132} //}}}
133function MatrixToList(matrixin) { //{{{
134
135 var matrix=matrixin;
136
137 if (!IsArray(matrix[0])) return matrix;
138 else{
139 var width = matrix[0].length;
140 var length = matrix.length;
141 var list= new Array(width*length);
142
143 for(var i=0;i<length;i++){
144 for(var j=0;j<width;j++){
145 list[i*width+j]=matrix[i][j];
146 }
147 }
148 return list;
149 }
150} //}}}
151function IsArray(object) { //{{{
152
153 var type=Object.prototype.toString.call( object );
154 if( type === '[object Array]' ) return 1;
155 if( type === '[object Float64Array]' ) return 1;
156 if( type === '[object Float32Array]' ) return 1;
157 if( type === '[object Int32Array]' ) return 1;
158 if( type === '[object Int16Array]' ) return 1;
159 if( type === '[object Uint32Array]' ) return 1;
160 if( type === '[object Uint16Array]' ) return 1;
161 if( type === '[object Uint8Array]' ) return 1;
162 return 0;
163
164} //}}}
165function ArrayNot(array) { //{{{
166
167 var notarray=array.slice();
168 for (var i=0;i<array.length;i++)notarray[i]=-array[i];
169 return notarray;
170} //}}}
171function ArrayCopy(array) { //{{{
172
173 var copy=[];
174 for(var i=0;i<array.length;i++)copy[i]=array[i];
175 return copy;
176} //}}}
177function ArrayPow(array,coefficient) { //{{{
178
179 var powarray=array.slice();
180 for (var i=0;i<array.length;i++)powarray[i]=Math.pow(array[i],coefficient);
181 return powarray;
182} //}}}
183function ArraySqrt(array) { //{{{
184
185 var sqrtarray=array.slice();
186 for (var i=0;i<array.length;i++)sqrtarray[i]=Math.sqrt(array[i]);
187 return sqrtarray;
188} //}}}
189function ArrayScale(array,alpha) { //{{{
190
191 var scalearray=array.slice();
192 for (var i=0;i<array.length;i++)scalearray[i]=array[i]*alpha;
193 return scalearray;
194} //}}}
195function ArrayMag(array1,array2) { //{{{
196
197 var arraymag=NewArrayFill(array1.length,0);
198 for (var i=0;i<array1.length;i++)arraymag[i]=Math.sqrt(Math.pow(array1[i],2)+Math.pow(array2[i],2));
199 return arraymag;
200} //}}}
201function ArrayAnyNaN(array) { //{{{
202
203 if(IsArray(array[0])){
204 for(var i=0;i<array.length;i++){
205 for(var j=0;j<array[0].length;j++){
206 if (Number.isNaN(array[i][j])) return 1;
207 }
208 }
209 }
210 else{
211 for(var i=0;i<array.length;i++){
212 if (Number.isNaN(array[i])) return 1;
213 }
214 }
215 return 0;
216} //}}}
217function ArrayUnique(arr) { //{{{
218
219 return arr.reverse().filter(function (e, i, arr) {
220 return arr.indexOf(e, i+1) === -1;
221 }).reverse();
222} //}}}
223function ArraySort(array) { //{{{
224
225 return array.sort(function(a, b) {
226 return a - b;
227 });
228
229} //}}}
230function ArrayAnyEqual(array,value) { //{{{
231
232 if(!Number.isNaN(value)){
233 for(var i=0;i<array.length;i++){
234 if (array[i]==value)return 1;
235 }
236 }
237 else{
238 for(var i=0;i<array.length;i++){
239 if (Number.isNaN(array[i]))return 1;
240 }
241 }
242 return 0;
243} //}}}
244function ArrayAnyBelowOrEqual(array,value) { //{{{
245
246 for(var i=0;i<array.length;i++){
247 if (array[i]<=value)return 1;
248 }
249 return 0;
250} //}}}
251function ArrayAnyBelowStrict(array,value) { //{{{
252
253 for(var i=0;i<array.length;i++){
254 if (array[i]<value)return 1;
255 }
256 return 0;
257} //}}}
258function ArrayAnyAboveOrEqual(array,value) { //{{{
259
260 for(var i=0;i<array.length;i++){
261 if (array[i]>=value)return 1;
262 }
263 return 0;
264} //}}}
265function ArrayAnyAboveStrict(array,value) { //{{{
266
267 for(var i=0;i<array.length;i++){
268 if (array[i]>value)return 1;
269 }
270 return 0;
271} //}}}
272function ArrayAnd(array1,array2) { //{{{
273
274 var array=array1;
275 for (var i=0;i<array1.length;i++)array[i]=array1[i] & array2[i];
276 return array;
277} //}}}
278function ArrayIsMember(array1,array2) { //{{{
279
280 var array=NewArrayFill(array1.length,0);
281 for (var i=0;i<array1.length;i++){
282 for(var j=0;j<array2.length;j++){
283 if (array1[i] == array2[j]){
284 array[i]=1;
285 break;
286 }
287 }
288 }
289 return array;
290} //}}}
291function NewArrayFill(size,value) { //{{{
292 var array = new Array(size);
293
294 for (var i = 0; i < size; i++) {
295 array[i] = value;
296 }
297
298 return array;
299} //}}}
300function NewArrayFill2D(rows,cols,value) { //{{{
301 var arr=new Array(rows);
302
303 for (var i=0;i<rows;i++) {
304 arr[i] = NewArrayFill(cols,value);
305 }
306
307 return arr;
308} //}}}
309function NewArrayFillIncrement(size,start,increment) { //{{{
310 var array=new Array(size);
311
312 for(var i=0;i<size;i++){
313 array[i]=start+i*increment;
314 }
315
316 return array;
317} //}}}
318function ArrayFind(array,value) { //{{{
319 var count=0;
320 var indices=[];
321
322 for (var i=0;i<array.length;i++){
323 if(array[i]===value){
324 indices.push(count);
325 }
326 count++;
327 }
328 return indices;
329} //}}}
330function ArrayFind2D(array,value) { //{{{
331 var count=0;
332 var indices=[];
333
334 for (var i=0;i<array.length;i++){
335 for (var j=0;j<array[i].length;j++){
336 if(array[i][j]===value){
337 indices.push(count);
338 }
339 count++;
340 }
341 }
342 return indices;
343} //}}}
344function ArrayFindNot(array,value) { //{{{
345 var count=0;
346 var indices=[];
347
348 for (var i=0;i<array.length;i++){
349 if(array[i]!==value){
350 indices.push(count);
351 }
352 count++;
353 }
354 return indices;
355} //}}}
356function ArrayFindNot2D(array,value) { //{{{
357 var count=0;
358 var indices=[];
359
360 for (var i=0;i<array.length;i++){
361 for (var j=0;j<array[i].length;j++){
362 if(array[i][j]!==value){
363 indices.push(count);
364 }
365 count++;
366 }
367 }
368 return indices;
369} //}}}
370function Create2DArray(rows,cols) { //{{{
371 var arr=new Array(rows);
372
373 for (var i=0;i<rows;i++) {
374 arr[i] = new Array(cols);
375 }
376
377 return arr;
378} //}}}
379function MapIsEmpty(map) { //{{{
380 for (var key in map){
381 if(map.hasOwnProperty(key)){
382 return false;
383 }
384 }
385 return true;
386} //}}}
387function clone(obj) {//{{{
388
389 var copy;
390
391 // Handle the 3 simple types, and null or undefined
392 if (null == obj || "object" != typeof obj) return obj;
393
394 // Handle Date
395 if (obj instanceof Date) {
396 copy = new Date();
397 copy.setTime(obj.getTime());
398 return copy;
399 }
400
401 // Handle Array
402 if (obj instanceof Array) {
403 copy = [];
404 for (var i = 0, len = obj.length; i < len; i++) {
405 copy[i] = clone(obj[i]);
406 }
407 return copy;
408 }
409
410 // Handle Object
411 if (obj instanceof Object) {
412 copy = {};
413 for (var attr in obj) {
414 if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
415 }
416 return copy;
417 }
418
419 throw new Error("Unable to copy obj! Its type isn't supported.");
420} //}}}
421function FloatFix(pointer,size) {//{{{
422
423 var buffer=new Float64Array(size);
424 for(var i=0;i<size;i++)buffer[i]=pointer[i];
425 return buffer;
426
427
428} //}}}
429function NullFix(pointer,value) {//{{{
430
431 if(pointer==null)return value;
432 else{
433 //check that the pointer values are not null:
434 if(IsArray(pointer)){
435 if(IsArray(pointer[0])){
436 for(var i=0;i<pointer.length;i++){
437 for(var j=0;j<pointer[0].length;j++){
438 if(pointer[i][j]==null)pointer[i][j]=value;
439 }
440 }
441 }
442 else{
443 for(var i=0;i<pointer.length;i++){
444 if(pointer[i]==null)pointer[i]=value;
445 }
446 }
447 }
448 return pointer;
449 }
450
451} //}}}
Note: See TracBrowser for help on using the repository browser.