You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:24:04