在 Chapel 中使用矩阵创建域
Create domain with matrices in Chapel
我有一个域 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..15。我创建了 var layerDom = {1..15} 每个层都有多个与之关联的对象,比如错误所以我有
var errors: [layerDom] real; // Just a number
我想要
var Ws: [layerDom] <matrixy thingy>; // Weight matrices all of different shape.
从 Chapel 1.15 开始,没有一种优雅的方法来创建内部数组具有不同大小的数组。这是因为内部数组都共享同一个域,这意味着更改一个数组的域会更改所有数组。
要达到预期的效果,需要创建一个records/classes的数组,其中包含一个数组:
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
//
我有一个域 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..15。我创建了 var layerDom = {1..15} 每个层都有多个与之关联的对象,比如错误所以我有
var errors: [layerDom] real; // Just a number
我想要
var Ws: [layerDom] <matrixy thingy>; // Weight matrices all of different shape.
从 Chapel 1.15 开始,没有一种优雅的方法来创建内部数组具有不同大小的数组。这是因为内部数组都共享同一个域,这意味着更改一个数组的域会更改所有数组。
要达到预期的效果,需要创建一个records/classes的数组,其中包含一个数组:
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
//