帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:nda  Operations  Operation  component  COM  Opera  WISE  ndarray  
Component-wise operations for ndarrays

  • 源代码名称:cwise
  • 源代码网址:http://www.github.com/scijs/cwise
  • cwise源代码文档
  • cwise源代码下载
  • Git URL:
    git://www.github.com/scijs/cwise.git
  • Git Clone代码到本地:
    git clone http://www.github.com/scijs/cwise
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/scijs/cwise
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • cwise

    这里库可以用于为 ndarrays 生成缓存高效的Map/Reduce 操作。

    build status

    示例

    为此,我们将在每个示例前面假定以下内容:

    //Import librariesvar cwise =require("cwise")
    , ndarray =require("ndarray")

    添加两个数组

    +=的array 等效项:

    //Create operationvar addeq =cwise({
     args: ["array", "array"],
     body:function(a, b) {
     a += b
     }
     })//Create two 2D arraysvarX=ndarray(newFloat32Array(128*128), [128,128])varY=ndarray(newFloat32Array(128*128), [128,128])//Add them togetheraddeq(X, Y)

    正式地,你可以以将 addeq(X,Y) 视为以下类似于下面的循环,除了对X 和Y的维度和顺序进行优化:

    for(var i=0; i<X.shape[0]; ++i) {
     for(var j=0; j<X.shape[1]; ++j) {
     X.set(i,j, X.get(i,j) +Y.get(i,j))
     }
    }

    将 array-与标量相乘

    var muls =cwise({
     args: ["array", "scalar"],
     body:function(a, s) {
     a *= s
     }
    })//Example usage:muls(array, 2.0)

    使用第一个索引初始化一个带有网格的array

    var mgrid =cwise({
     args: ["index", "array"],
     body:function(i, a) {
     a = i[0]
     }
    })//Example usage:varX=mgrid(ndarray(newFloat32Array(128)))

    使用块计算 2D 向量规范

    var norm2D =cwise({
     args: ["array", {blockIndices:-1}],
     body:function(o, i) {
     o =Math.sqrt(i[0]*i[0] + i[1]*i[1])
     }
    })//Example usage:var o =ndarray([0, 0, 0], [3])norm2D(o, ndarray([1, 2, 3, 4, 5, 6], [3,2]))// o.data == [ 2.23606797749979, 5, 7.810249675906654 ]

    在 above 中,i 不是实际的Array,索引符号只是语法糖。

    将模具应用到 array

    var laplacian =cwise({
     args:["array", "array", {offset:[0,1], array:1}, {offset:[0,-1], array:1}, {offset:[1,0], array:1}, {offset:[-1,0], array:1}],
     body:function(a, c, n, s, e, w) {
     a =0.25* (n + s + e + w) - c
     }
    })laplacian(next, prev)

    计算 array 中所有元素的总和

    var sum =cwise({
     args: ["array"],
     pre:function() {
     this.sum=0 },
     body:function(a) {
     this.sum+= a
     },
     post:function() {
     returnthis.sum }
    })//Usage:s =sum(array)

    注意,存储在 this 中的变量对于所有三个代码块都是通用的。 还请注意,不应该将 this 视为实际的对象( 例如不应尝试返回 this ) 。

    检查是否设置了任何元素

    var any =cwise({
     args: ["array"],
     body:function(a) {
     if(a) {
     returntrue }
     },
     post:function() {
     returnfalse }
    })//Usageif(any(array)) {
     //.. .}

    计算 array的最大元素的索引:

    var argmin =cwise({
     args: ["index", "array"],
     pre:function(index) {
     this.min_v=Number.POSITIVE_INFINITYthis.min_index=index.slice(0)
     },
     body:function(index, a) {
     if(a <this.min_v) {
     this.min_v= a
     for(var i=0; i<index.length; ++i) {
     this.min_index[i] = index[i]
     }
     }
     },
     post:function() {
     returnthis.min_index }
    })//Usage:argmin(X)
    安装

    使用 npm插件安装:

    npm install cwise
    API 插件

    使用该库,可以将对象传递给具有以下字段的对象:

    • args: ( 必选) 描述传递给主体的参数的类型。 这些可能是下列内容之一:
      • "array": ndarray -type参数
      • "scalar": 全局广播的标量参数
      • "index": ( 隐藏) 表示正在处理的元素的当前索引的array 。 最初 [0,0,...] 在 pre block 中,并设置为post块中的一些未定义值。
      • "shape": ( 隐藏) 表示正在处理的数组的形状的array
      • 表示"已经阻止"array ( 例如一个彩色图像,一个矩阵的array,等等 )的对象:
        • blockIndices 在主体( 而不是迭代它们) 中公开的索引( 从 array 形状的前面) 数。 负整数从 array 形状的背面获取索引。
      • 返回 array 参数中表示偏移量指针的两个属性。 注意,cwise不实现任何边界条件。
        • offset 一个 array,表示对象的relative 偏移量
        • Array array 参数的索引
    • pre: 在开始循环之前要执行的函数
    • body: ( 必选),它被应用到输入数组的每个元素
    • post: 循环完成时执行
    • printCode: 如果设置了这个标志,那么记录所有生成的代码
    • blockSize: block的大小( 默认 32 )
    • funcName: 为调试/分析目的提供给生成过程的名称。 ( 默认值为 body.name||"cwise" )

    结果是你可以以调用的过程,该过程沿以下行执行这些方法:

    function(a0, a1, ...) {
     pre()
     for(var i=0; i<a0.shape[0]; ++i) {
     for(var j=0; j<a0.shape[1]; ++j) {
     ...body(a0[i,j,...], a1[i,j,...], ... )
     }
     }
     post()
    }

    注释

    • 在 pre/body/post, 使用 this.* 之间传递变量
    • 变量被访问的顺序取决于输入数组的跨距次序。 一般来说,假设元素被访问的( co ) 顺序是不安全的。
    • 如果没有指定返回语句,则返回第一个ndarray参数
    • 所有输入阵列必须具有相同的形状。 如果没有,库将抛出错误

    作为browserify转换

    如果包大小对你来说是个问题,那么可以使用cwise作为 browserify转换插件,从而避免可能存在较大的解析器依赖关系。 为此,请将以下行添加到 package.json:

    //Contents of package.json{
     //.. ."browserify": {
     "transform": [ "cwise" ]
     }
     //.. .}

    然后当你使用browserify模块时,只有cwise编译子模块才会加载到你的脚本中,而不是所有的esprima 。 要注意,这个步骤是可选的,即使你不使用转换,库仍然可以在浏览器中工作。

    常见问题解答

    快?

    :它是如何工作的

    你可以把cwise看作是在JavaScript之上的一种宏语言。 在内部,cwise使用节点falafel解析你给它的函数并消毒它们的参数。 运行时,根据输入数组的顺序和步骤生成每个 array 操作的代码,以获得最佳缓存性能。 这些编译后的函数是 memoized,用于以后对同一函数的调用。 因这里,你应该尽可以能重用 array 操作以避免浪费时间和内存重新生成共同功能。

    许可证

    ( c ) 2013 Mikola Lysenko 。MIT许可证



    文章标签:COM  component  Opera  Operation  Operations  nda  ndarray  WISE  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语