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;

每个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 开始,没有一种优雅的方法来创建内部数组具有不同大小的数组。这是因为内部数组都共享相同的域,这意味着更改一个数组的域会更改所有数组。

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

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

关于matrix - 在 Chapel 中使用矩阵创建域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45899263/

相关文章:

matlab - 如何在 matlab 中将给定的邻接矩阵表示为无向加权图?

python-3.x - 如何使用 itertools 继续使用列表中的值,直到矩阵的对角线已满

pass-by-reference - Chapel 什么时候通过引用传递,什么时候通过常量传递?

chapel - 在 Chapel 中的未知类型数组上声明一个函数?

python - 在python numpy.linalg中使用逆矩阵函数 "inv"

c++ - 如何检查矩阵中每一行/列的相等性?

Android:ImageView 上的矩阵运算,动画?

chapel - 如何复制数组以便从 Chapel 中的副本中删除元素?

chapel - 使用计时器时 pi 计算速度变慢