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

时间:2019-12-09 20:40:47

标签: 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

1 个答案:

答案 0 :(得分:1)

出现此错误的原因是由于以下原因:

        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]只是单个标量,而不是具有size size元素的东西,因此无法完成分配。为使其合法,您需要将grid4表达式替换为标量值,或将赋值中的结果表达式替换为具有size size元素的。

知道您要表达矩阵乘法时,我的建议是消除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元素存储在循环嵌套中。