Keep getting "error: Cannot assign to int(64) from iterator''

Keep getting "error: Cannot assign to int(64) from iterator''

我在尝试进行矩阵乘法时总是遇到错误。我找不到任何关于如何修复此错误的文档。

这是我的代码:

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

知道您正在尝试表达矩阵乘法,我的建议是消除 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 元素。