Reputation: 3136
I have a domain D
, and I want to use it to index several matrices A
. Something of the form
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;
Each a
will be 2D but have different sizes. Yes, some of these will be sparse (but need not be for purposes of this question)
== UPDATE ==
For clarity, I have a series of layers (it's a neural net), say 1..15. I created var layerDom = {1..15} Each layer has multiple objects associated with it, like error so I have
var errors: [layerDom] real; // Just a number
And I'd like to have
var Ws: [layerDom] <matrixy thingy>; // Weight matrices all of different shape.
Upvotes: 2
Views: 91
Reputation: 451
As of Chapel 1.15 there isn't an elegant way to create an array of arrays where the inner arrays have different sizes. This is because the inner arrays all share the same domain, meaning that changing one array's domain changes all arrays.
To achieve the desired effect, you need to create an array of records/classes that contain an array:
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
//
Upvotes: 2