PL/pgSQL编写矩阵乘法函数报错array subscript out of range如何解决?
问题排查与解决方案
你写的PL/pgSQL矩阵乘法函数存在3处核心错误,逐一修正即可解决报错:
- 维度校验逻辑错误:矩阵乘法的生效前提是第一个矩阵的列数等于第二个矩阵的行数,原代码的IF判断条件写反,会导致合法的矩阵输入被拦截,非法输入反而进入计算逻辑。
- 结果数组未初始化:输出参数
produto未做初始化,是无维度的空数组,直接按下标赋值必然触发下标越界错误,需要先预分配和结果矩阵维度匹配的空间,初始值设为0。 - 循环变量k的边界错误:k的遍历上限应该是第一个矩阵的列数,原代码写为第一个矩阵的行数,不符合矩阵乘法计算规则,非方阵场景下会直接越界。
修正后完整代码
CREATE OR REPLACE FUNCTION multiplicarMatrizes(matriz1 float[][], matriz2 float[][], OUT produto float[][]) AS $$ DECLARE i integer; j integer; k integer; linhas1 integer := array_length(matriz1, 1); colunas1 integer := array_length(matriz1, 2); linhas2 integer := array_length(matriz2, 1); colunas2 integer := array_length(matriz2, 2); BEGIN -- 修正维度校验逻辑 IF colunas1 <> linhas2 THEN RAISE EXCEPTION '矩阵1的列数必须等于矩阵2的行数'; END IF; -- 初始化结果数组,维度为 矩阵1行数 × 矩阵2列数,初始值全为0 produto := array_fill(0::float, ARRAY[linhas1, colunas2]); FOR i IN 1..linhas1 LOOP FOR j IN 1..colunas2 LOOP -- 修正k的循环边界 FOR k IN 1..colunas1 LOOP produto[i][j] = produto[i][j] + matriz1[i][k] * matriz2[k][j]; END LOOP; END LOOP; END LOOP; END; $$ language plpgsql;
验证调用
执行你给出的测试用例:
SELECT multiplicarMatrizes('{{1.0,2.0}, {2.0,1.0}}', '{{1.0,0.0},{0.0,1.0}}');
返回结果为{{1,2},{2,1}},和预期的单位矩阵乘法结果一致。
内容的提问来源于stack exchange,提问作者Lucas Amaral
相关产品推荐
相关产品推荐

