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;
作为练习,我正在编写一个 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
更多 - 任何变量的默认值都是 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;