Getting the error "ERROR: array subscript out of range" when multiplying matrices PL/pgSQL?

Getting the error "ERROR: array subscript out of range" when multiplying matrices PL/pgSQL?

作为练习,我正在编写一个 PL/pgSQL 函数,该函数将两个矩阵相乘,然后在调用时打印解。我是这种语言的新手,找不到代码有什么问题。求助!

CREATE OR REPLACE FUNCTION multiplicarMatrizes(matriz1 float[][], matriz2 float[][], OUT produto float[][]) AS
$$
DECLARE
    i integer;
    j integer;
    k integer;
BEGIN
    
    IF array_length(matriz1, 1) <> array_length(matriz2, 2) THEN
        RAISE EXCEPTION 'O número de linhas da matriz 1 deve ser igual ao número de colunas da matriz 2';
    END IF;

    FOR i IN 1..array_length(matriz1, 1) LOOP
        FOR j IN 1..array_length(matriz2, 2) LOOP
            FOR k IN 1..array_length(matriz1, 1) 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}}'); // CALLING THE FUNCTION

因此,我得到了错误:

[44:1] Failed in 0 s.
[Exception, Error code 0, SQLState 2202E] ERROR: array subscript out of range
  Onde: função PL/pgSQL multiplicarmatrizes(double precision[],double precision[]) linha 15 em atribuição
  Line 44, column 1

有人能帮忙吗?!

PostgreSQL 不支持在修改一个值时调整多维数组的大小。最初 produto 是空数组,因此对该输出变量的任何更改都应该失败。您需要通过函数 array_fill

初始化数组的 space

更多 - 任何变量的默认值都是 NULL,并且 NULL + 任何东西都是 NULL

CREATE OR REPLACE FUNCTION multiplicarMatrizes(matriz1 float[][],
                                               matriz2 float[][],
                                               OUT produto float[][]) AS
$$
DECLARE
    i integer;
    j integer;
    k integer;
BEGIN
    
    IF array_length(matriz1, 1) <> array_length(matriz2, 2) THEN
        RAISE EXCEPTION 'O número de linhas da matriz 1 deve ser igual ao número de colunas da matriz 2';
    END IF;

    produto := array_fill(0, ARRAY[array_length(matriz1, 1), array_length(matriz2, 2)]);

    FOR i IN 1..array_length(matriz1, 1)
    LOOP
        FOR j IN 1..array_length(matriz2, 2)
        LOOP
            FOR k IN 1..array_length(matriz1, 1)
            LOOP
                produto[i][j] := produto[i][j] + matriz1[i][k] * matriz2[k][j];
            END LOOP;
        END LOOP;
    END LOOP;
END;
$$ language plpgsql;