作為練習,我正在撰寫一個 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
有誰可以幫忙嗎?!
uj5u.com熱心網友回復:
當您修改一個值時,PostgreSQL 不支持調整多維陣列的大小。最初produto是空陣列,因此此輸出變數的任何更改都應該失敗。您需要通過函式初始化陣列空間array_fill
More - 任何變數的默認值都是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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/359140.html
下一篇:排序演算法以保持雙頭背靠背
