Подтвердить что ты не робот

Элементарные операции в Javascript

Я занимаюсь физическими симуляциями, которые, конечно, связаны с векторами. Мне стало очень сложно, потому что, насколько мне известно, javascript не поддерживает ничего подобного...

#with the aid of numpy
>>> a = np.array([1,2,3])
>>> b = np.array([9,2,7])
>>> a+b
array([10,  4, 10])

Я смог обойти это ограничение, определяя функции, которые будут делать то же самое, но мои формулы выглядят так:

add(x, add( mult(v,dt), mult(mult( a(x), .5), Math.pow(dt,2))))

Итак, мой вопрос заключается в том, есть ли лучшие способы достижения этой функциональности, будь то функции языка, о котором я не знаю, библиотеки, которые решают эту проблему, или более эффективные способы борьбы с ним.

Спасибо за помощь.

4b9b3361

Ответ 1

Отъезд Sylvester. Я думаю, что это может быть то, что вы ищете.

Но если вы хотели бы реализовать объекты самостоятельно, тогда было бы лучше сделать более подход ООП. JavaScript - это язык, основанный на прототипах, поэтому он немного отличается от других языков ООП, но его все еще довольно легко реализовать собственные прототипы.

Что-то вроде:

Vector = function(items) {
    this.items = items
}

Vector.prototype.add = function(other) {
    var result = []
    for(var i = 0; i < this.items; i++) {
        result.push( this.items[i] + other.items[i])
    }

    return new Vector(result);
}

Vector.prototype.subtract = function(other) { /* code to subtract */ }
Vector.prototype.multiply = function(other) { /* code to multiply */ }

И затем используйте их следующим образом:

var a = new Vector([1,2,3]);
var b = new Vector([5,0,1]);

var result = a.add(b)
result.items // [6,2,4]

Или, если вы этого захотите, вы также можете расширить класс Array с помощью некоторых функций с помощью

Array.prototype.vectorAdd = function(other) { /* code to add another array as a vector */ };

И назовите это, используя

[1,2,3].vectorAdd([5,0,1])

Надеюсь, это может послужить отправной точкой для того, чтобы сделать код более понятным.

Еще одно замечание: к сожалению, в этом случае JavaScript не поддерживает перегрузку работы, поэтому вы не можете делать аккуратные вещи вроде a+b. Вам нужно сделать что-то вроде a.add(b). но пока вы возвращаете соответствующий объект, вы можете объединить методы вместе. Как:

a.add(b).multiply(c).subtract(d);

пс. представленный код может быть немного "выключен", я просто набрал его с головы, так что относитесь к нему больше как pseduocode:)

Ответ 2

Не знаю, поможет ли это, но вы можете добавлять методы к массиву или числу, расширяя объект конструктора .protoype.

Пример: http://jsfiddle.net/9JwLd/

Array.prototype.add = function( b ) {
    var a = this,
        c = [];
    if( Object.prototype.toString.call( b ) === '[object Array]' ) {
        if( a.length !== b.length ) {
            throw "Array lengths do not match.";
        } else {
            for( var i = 0; i < a.length; i++ ) {
                c[ i ] = a[ i ] + b[ i ];
            }
        }
    } else if( typeof b === 'number' ) {
        for( var i = 0; i < a.length; i++ ) {
            c[ i ] = a[ i ] + b;
        }
    }
    return c;
};
var a = [1,2,3];
var b = [9,2,7];

   // pass an Array
var c = a.add( b );  // [10,4,10]

   // pass a number
var d = a.add( 5 );  // [6,7,8]

Следующая версия JavaScript (ECMAScript), вероятно, будет включать в себя методы Array, которые также могут помочь. (В настоящее время поддерживается в SpiderMonkey.)

ПРИМЕР: http://jsfiddle.net/dj6Eq/ (Тест в новых версиях Firefox.)

var a = [1, 2, 3];
var b = [9, 2, 7];

var c = [a[n]+b[n] for (n in a) ];
var d = [a[n]+5 for (n in a) ];

РЕДАКТИРОВАТЬ: В соответствии с предложением синтаксис будет немного отличаться от текущей реализации Mozilla-решений Array.

Ответ 3

Использование zipWith из lodash (https://lodash.com/):

_.zipWith([1, 2, 3], [9, 2, 7], _.add);
// -> [10, 4, 10]

Ответ 4

мы можем использовать функцию карты для добавления элементов массива

 function addvector(a,b){
 var d = a.map(function(e,i){
 return e + b[i]})
 document.write(d);
  }
  addvector([2,3,4],[4,7,90])

Ответ 5

Чтобы просто добавить массивы в js, вы можете использовать эту функцию

function addArrays(ar1, ar2){
    var ar3 = [];
    for(var i in ar1)
        ar3.push(ar1[i] + ar2[i]);
    return ar3;
}

а затем назовите его так

var array1 = [1,4,3];
var array2 = [5,3,2];
var array3 = addArrays(array1,array2);
// value of array3 is [6,7,5]