代码之家  ›  专栏  ›  技术社区  ›  Brian Dolan

在Chapel中使用矩阵创建域

  •  2
  • Brian Dolan  · 技术社区  · 7 年前

    我有一个域名 D ,我想用它来索引几个矩阵 A

    var dom: domain(1) = {0..5};
    var mats: [dom] <?>;
    
    var a0 = [[0.0, 0.1, 0.2], [0.3, 0.4, 0.5]];
    var a1 = [[1.0, 1.1, 1.2, 1.3], [1.4, 1.5, 1.6, 1.7]];
    
    mats[0] = a0;
    mats[1] = a1;
    

    每个 a

    ==更新==

    为了清楚起见,我有一系列层(这是一个神经网络),比如1。。我创建了var layerDom={1..15}每个层都有多个与之相关的对象,就像error一样

    var errors: [layerDom] real;  // Just a number
    

    var Ws: [layerDom] <matrixy thingy>;  // Weight matrices all of different shape.
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   benharsh    7 年前

    从礼拜堂1.15开始,没有一种优雅的方法可以创建内部阵列大小不同的阵列。这是因为内部阵列都共享同一个域,这意味着更改一个阵列的域会更改所有阵列。

    为了达到预期效果,您需要创建一个包含数组的记录/类数组:

    record Weight {
      var D : domain(2);
      var A : [D] real;
    }
    
    var layers = 4;
    var weights : [1..layers] Weight;
    for i in 1..layers {
      weights[i].D = {1..i, 1..i};
      weights[i].A = i;
    }
    
    for w in weights do writeln(w.A, "\n");
    
    // 1.0
    // 
    // 2.0 2.0
    // 2.0 2.0
    // 
    // 3.0 3.0 3.0
    // 3.0 3.0 3.0
    // 3.0 3.0 3.0
    // 
    // 4.0 4.0 4.0 4.0
    // 4.0 4.0 4.0 4.0
    // 4.0 4.0 4.0 4.0
    // 4.0 4.0 4.0 4.0
    //