不断收到"错误:无法从迭代器分配给 int(64)

  • 本文关键字:分配 迭代器 int 错误 chapel
  • 更新时间 :
  • 英文 :


我在尝试进行矩阵乘法时不断收到错误。我找不到有关如何修复此错误的任何文档。

这是我的代码:

var grid : [1..size, 1..size] uint(8);
var grid2 : [1..size, 1..size] uint(8);
var grid3 : [1..size, 1..size] int;
var grid4 : [1..size, 1..size] uint(8);
fillRandom(grid);
fillRandom(grid2);
forall i in 1..size {
forall k in 1..size {
grid4 = grid[i,k];
forall j in 1..size {
grid3[i,j] += grid4 * grid2[k,j]; //error on this line
}
}
}

这是错误:

13: error: Cannot assign to int(64) from iterator

您收到此错误的原因是由于以下行:

grid3[i,j] += grid4 * grid2[k,j]; //error on this line

具体来说,由于 grid4 是一个数组,grid4 * grid2[k,j]表示一个迭代器表达式,该表达式表示数组的每个元素grid4乘以标量grid2[k,j]。 将其视为一个虚拟size x size值数组。

由于左侧表达式grid3[i,j]只是一个标量,而不是具有大小元素的内容,因此无法完成分配。 要使其合法,您需要将grid4表达式替换为标量值,或者将赋值中的结果表达式替换为具有大小元素的内容

知道您正在尝试表达矩阵乘法,我的建议是消除 grid4 并将您的循环编写为:

var grid : [1..size, 1..size] uint(8);
var grid2 : [1..size, 1..size] uint(8);
var grid3 : [1..size, 1..size] int;

forall i in 1..size {
forall k in 1..size {
const gridIJ = grid[i,k];
forall j in 1..size {
grid3[i,j] += gridIJ * grid2[k,j]; //error on this line
}
}
}

也就是说,声明一个标量临时以将 i,j 元素存储在循环嵌套中。

相关内容

  • 没有找到相关文章

最新更新