Brian Dolan
Brian Dolan

Reputation: 3136

Create domain with matrices in Chapel

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

Answers (1)

benharsh
benharsh

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

Related Questions