稀疏矩阵作为 Chapel 对象中的字段
Sparse Matrix as field in a Chapel object
跟进 我现在有一个包含稀疏矩阵的 class Graph
。定义如
class Graph {
var vdom: domain(2),
SD: sparse subdomain(vdom),
A: [SD] real;
proc init(A: []) {
this.vdom = {A.domain.dim(1), A.domain.dim(2)};
for ij in A.domain {
this.SD += ij;
}
}
产生错误
chingon-base-test.chpl:30: error: halt reached - Sparse domain/array index out of bounds: (1, 2) (expected to be within {1..0, 1..0}
看来 SD
没有被重新定义。什么是正确的模式?前面post讲了密集数组,这个是针对稀疏的
我是通过
调用的
var nv: int = 8,
D: domain(2) = {1..nv, 1..nv},
SD: sparse subdomain(D),
A: [SD] real;
SD += (1,2); A[1,2] = 1;
SD += (1,3); A[1,3] = 1;
SD += (1,4); A[1,4] = 1;
SD += (2,4); A[2,4] = 1;
SD += (3,4); A[3,4] = 1;
SD += (4,5); A[4,5] = 1;
SD += (5,6); A[5,6] = 1;
SD += (6,7); A[6,7] = 1;
SD += (6,8); A[6,8] = 1;
SD += (7,8); A[7,8] = 1;
g = new Graph(A);
writeln(g.A);
您应该在初始化的第 1 阶段设置 vdom 字段的值,而不是依赖于在默认阶段(第 2 阶段)设置它。阶段 1 处理所有字段的初始值,因此如果您没有明确设置 vdom,当我们为 SD 和 A 字段设置初始值时它将是 {1..0, 1..0}
,这就是您收到该错误消息的原因.
proc init(A: []) {
this.vdom = {A.domain.dim(1), A.domain.dim(2)};
this.complete(); // insert this line here
for ij in A.domain {
this.SD += ij;
}
}
编辑:通过执行您的示例调用行和我的修复,我得到以下输出:
0.0 0.0 0.0
0.0
0.0
0.0
0.0
0.0 0.0
0.0
跟进 Graph
。定义如
class Graph {
var vdom: domain(2),
SD: sparse subdomain(vdom),
A: [SD] real;
proc init(A: []) {
this.vdom = {A.domain.dim(1), A.domain.dim(2)};
for ij in A.domain {
this.SD += ij;
}
}
产生错误
chingon-base-test.chpl:30: error: halt reached - Sparse domain/array index out of bounds: (1, 2) (expected to be within {1..0, 1..0}
看来 SD
没有被重新定义。什么是正确的模式?前面post讲了密集数组,这个是针对稀疏的
我是通过
调用的var nv: int = 8,
D: domain(2) = {1..nv, 1..nv},
SD: sparse subdomain(D),
A: [SD] real;
SD += (1,2); A[1,2] = 1;
SD += (1,3); A[1,3] = 1;
SD += (1,4); A[1,4] = 1;
SD += (2,4); A[2,4] = 1;
SD += (3,4); A[3,4] = 1;
SD += (4,5); A[4,5] = 1;
SD += (5,6); A[5,6] = 1;
SD += (6,7); A[6,7] = 1;
SD += (6,8); A[6,8] = 1;
SD += (7,8); A[7,8] = 1;
g = new Graph(A);
writeln(g.A);
您应该在初始化的第 1 阶段设置 vdom 字段的值,而不是依赖于在默认阶段(第 2 阶段)设置它。阶段 1 处理所有字段的初始值,因此如果您没有明确设置 vdom,当我们为 SD 和 A 字段设置初始值时它将是 {1..0, 1..0}
,这就是您收到该错误消息的原因.
proc init(A: []) {
this.vdom = {A.domain.dim(1), A.domain.dim(2)};
this.complete(); // insert this line here
for ij in A.domain {
this.SD += ij;
}
}
编辑:通过执行您的示例调用行和我的修复,我得到以下输出:
0.0 0.0 0.0
0.0
0.0
0.0
0.0
0.0 0.0
0.0