Javascript中的元素操作

dan*_*nem 18 javascript vector

我正在做一些物理模拟,当然涉及矢量.这对我来说变得非常困难,因为据我所知,javascript不支持这样的任何事情......

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

我已经能够通过定义将实现相同功能的函数来解决这个限制,但我的公式最终看起来像这样:

add(x, add( mult(v,dt), mult(mult( a(x), .5), Math.pow(dt,2))))
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,是否有更好的方法来实现这一功能,无论它们是我不知道的语言的功能,解决这个问题的库,还是更有效的方法来处理它.

谢谢大家的帮助.

J. *_*mes 13

看看西尔维斯特.我想这可能就是你要找的东西.

但是如果你想自己实现这些对象,那么做一个更多的OOP方法可能会更好.JavaScript是一种基于原型的语言,因此它与其他OOP语言略有不同,但它仍然很容易实现自己的原型.

就像是:

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 */ }
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它们:

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

var result = a.add(b)
result.items // [6,2,4]
Run Code Online (Sandbox Code Playgroud)

或者如果你愿意,你也可以使用一些函数扩展Array类

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

并称之为使用

[1,2,3].vectorAdd([5,0,1])
Run Code Online (Sandbox Code Playgroud)

希望这可能会为您提供一个使您的代码更具可读性的起点.

另一个注意事项:不幸的是,在这种情况下,JavaScript不支持操作重载,所以你不能做像这样的整洁的东西a+b.你必须要做类似的事情a.add(b).但只要你返回一个合适的对象,你就可以将方法链接在一起.喜欢:

a.add(b).multiply(c).subtract(d);
Run Code Online (Sandbox Code Playgroud)

PS.所呈现的代码可能有点"关闭",我只是把它打成了我的头顶,所以更像是pseduocode :)


Var*_*n K 8

我们可以使用map函数添加数组元素:

function addvector(a,b){
    return a.map((e,i) => e + b[i]);
}
addvector([2,3,4],[4,7,90]) # returns [6,10,94]
Run Code Online (Sandbox Code Playgroud)

  • @OmkarKulkarni SIMD 是固定宽度的,并且仅以恒定因子加速。 (3认同)
  • 这是一个很好的解决方案,没有任何第三个库。 (2认同)

use*_*716 5

不知道这是否有用,但您可以通过扩展构造函数的.protoype对象来向Array或Number添加方法.

示例: 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;
};
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)

下一版本的JavaScript(ECMAScript)可能包括数组理解,这也可能有所帮助.(目前在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) ];
Run Code Online (Sandbox Code Playgroud)

编辑: 根据提案,语法将与阵列理解的当前Mozilla实现略有不同.


小智 5

使用zipWithlodash ( https://lodash.com/ ):

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