Matrix 创建具有矩阵的域

Matrix 创建具有矩阵的域,matrix,chapel,Matrix,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; 我想要 var Ws: [layerDom] <matrixy th

我有一个域
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;
我想要

var Ws: [layerDom] <matrixy thingy>;  // Weight matrices all of different shape.
var Ws:[layerDom];//权重矩阵的形状各不相同。

从Chapel 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
// 

我想您是在问“如何声明数组的数组,其中子数组的大小不同?”。如果是这样的话,答案就不取决于数组是否稀疏,所以我认为这里的细节可以忽略,正如您所指出的。这听起来对吗?我想稀疏可能不是一个因素,但我经常错,所以我会让你来决定。真的,我想要
var arrDom={1…15}
,然后在需要的时候拿回第七个数组。所以如果我想用一个权重乘以另一个权重,我需要做
dot(权重[7]。A,权重[9]。A.T)
,对吗?我相信是这样的(前提是
7
9
的权重是
dot
的有效大小).未来是否有任何计划支持这一点?…为什么是“记录”而不是课堂?我相信教堂团队希望支持这类阵列(也称为“天际线”阵列),并且已经想了很长时间了。到目前为止,与其他功能相比,它还不够重要。我选择了一个
记录
,以便为您管理内存。一个
就可以了。
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
//