Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的元素操作_Javascript_Vector - Fatal编程技术网

Javascript中的元素操作

Javascript中的元素操作,javascript,vector,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]) 我已经能够通过定义实现相同功能的函数来克服这一限制,但我的公式最终如下所示: add(x, add( mult(v,dt), mult

我在做一些物理模拟,当然涉及向量。这对我来说非常困难,因为据我所知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))))
var a = new Vector([1,2,3]);
var b = new Vector([5,0,1]);

var result = a.add(b)
result.items // [6,2,4]
所以我的问题是,是否有更好的方法来实现这一功能,它们是我不知道的语言的特性,解决这个问题的库,还是更有效的方法来处理它

谢谢大家的帮助。

退房。我想这可能就是你要找的

但是如果您想自己实现这些对象,那么最好采用更面向对象的方法。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 */ }
或者,如果您愿意,也可以使用以下函数扩展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);

另外,呈现的代码可能有点“不正确”,我只是在头顶上键入了它,所以请将其视为psedoocode:)

对于在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]

不知道这是否有帮助,但您可以通过扩展构造函数的
.prototype
对象向数组或Number添加方法

示例:


下一个版本的JavaScript(ECMAScript)可能会包含数组理解,这也会有所帮助。(目前SpiderMonkey中支持。)

示例:(在较新版本的Firefox中进行测试。)



编辑:语法将与当前Mozilla实现的数组理解略有不同。

使用lodash()中的
zipWith

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

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

只是将一个数组的每个元素添加到另一个数组中的对应元素?嗯……是的。理想情况下,可以像我用Numpy演示的那样相对轻松地完成。正如您所看到的,我的解决方案令人憎恶。+1个人不喜欢API,但似乎是一个伟大的函数库,基本上有一个变量
var o=Vector()
当调用
valueOf
时返回01作为id,而另一个变量
var p=Vector()
将返回0100作为id。然后您可以潜在地执行
向量(o*p)
反向确定原始id以构造新向量。基本上,这将涉及大量的猴子修补。。。基本上覆盖
valueOf
操作符,您实际上可以创建具有指定ID的对象,从而允许您模拟属性重载(在半有限的范围内)。使用除法操作符时会变得非常棘手/@Lime您认为您可以,但请结合一个小演示:D我不太确定我是否完全理解你的建议。@32bitkid+1谢谢你的建议!我对它的功能印象深刻,我现在正在尝试使用它。但是,正如其他人所说,我并不热衷于API本身。@32bitkid使用
Array.prototype.slice.call(arguments,0)
而不是
items
可以使语法
Vector(0,1,2)
Vector([0,1,2])
稍微好一点@Pete 1st你知道javascript中的
valueOf
是如何工作的吗?+1哦,哇,我不知道你能做到。谢谢编辑:第二个版本只适用于FF?如果它目前在chrome中得到支持,我只想做一个理解…:/@皮特:是的,只是现在。如果Chrome在新规范发布之前实现了ECMAScript语法a,我也不会太惊讶。不过很难说。Mozilla的David Herman在今年早些时候就ECMAScript的下一个版本进行了一次演讲。有趣的东西。另外,您可能想查看哪些支持JavaScript的替代语法,包括理解。这是一个很好的解决方案,没有任何第三个LIB。这实际上不是关于循环。Numpy使用SIMD类型的计算,其时间复杂度远低于O(n)。@OmkarKulkarni SIMD是固定宽度的,仅以常数因子加速。
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]
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) ];
_.zipWith([1, 2, 3], [9, 2, 7], _.add);
// -> [10, 4, 10]
function addvector(a,b){
    return a.map((e,i) => e + b[i]);
}
addvector([2,3,4],[4,7,90]) # returns [6,10,94]