Getting the error "ERROR: array subscript out of range" when implementing Laplace's Theorem for determinants PL/pgSQL?
Getting the error "ERROR: array subscript out of range" when implementing Laplace's Theorem for determinants PL/pgSQL?
我正在编写一个 PL/pgSQL 函数作为练习,该函数实现拉普拉斯定理以计算行列式,然后在调用时打印解。我觉得我是这门语言的新手,找不到代码有什么问题。我认为这个想法没问题,也许有语法错误!求助!
CREATE OR REPLACE FUNCTION remove(matriz float[][], linha integer, coluna integer) RETURNS float[][] AS
$$
DECLARE
i integer;
j integer;
k integer;
l integer;
resultante float[][];
BEGIN
resultante := array_fill(0, ARRAY[array_length(matriz, 1)-1, array_length(matriz, 2)-1]);
k = 0;
FOR i IN 1..array_length(matriz, 1) LOOP
l = 0;
FOR j IN 1..array_length(matriz, 1) LOOP
IF j != coluna THEN
resultante[k][l] = matriz[i][j];
l = l + 1;
END IF;
END LOOP;
IF i != linha THEN
l = l + 1;
END IF;
END LOOP;
RETURN resultante;
END;
$$ language plpgsql;
CREATE OR REPLACE FUNCTION determinant(matriz float[][], OUT produto float) AS
$$
DECLARE
i integer;
BEGIN
IF array_length(matriz, 1) <> array_length(matriz, 2) THEN
RAISE EXCEPTION 'matrix not quadratic.';
END IF;
produto = 0;
IF array_length(matriz, 1) = 2 THEN
produto = matriz[1][1] * matriz[2][2] - matriz[1][2] * matriz[2][1];
END IF;
IF array_length(matriz, 1) > 2 THEN
FOR i IN 1..array_length(matriz, 1) LOOP
produto = produto + matriz[1][i] * (-1)^(0+(i-1)) * determinant(remove(matriz, 1, i));
END LOOP;
END IF;
END;
$$ language plpgsql;
SELECT determinant('{{1.0,7.0, 2.0, 4.0}, {2.0, 3.0, 5.0, 4.0}, {9.0, 1.0, 8.0, 2.0}, {4.0, 1.0, 1.0, 4.0}}');
结果:
[76:1] Failed in 0 s.
[Exception, Error code 0, SQLState 2202E] ERROR: array subscript out of range
Onde: função PL/pgSQL remove(double precision[],integer,integer) linha 15 em atribuição
função PL/pgSQL determinante(double precision[]) linha 17 em atribuição
Line 76, column 1
你永远不会改变k
。另一方面,你增加了 l
太多。
其中一个l = l + 1
(有两个)应该是k = k + 1
。
我正在编写一个 PL/pgSQL 函数作为练习,该函数实现拉普拉斯定理以计算行列式,然后在调用时打印解。我觉得我是这门语言的新手,找不到代码有什么问题。我认为这个想法没问题,也许有语法错误!求助!
CREATE OR REPLACE FUNCTION remove(matriz float[][], linha integer, coluna integer) RETURNS float[][] AS
$$
DECLARE
i integer;
j integer;
k integer;
l integer;
resultante float[][];
BEGIN
resultante := array_fill(0, ARRAY[array_length(matriz, 1)-1, array_length(matriz, 2)-1]);
k = 0;
FOR i IN 1..array_length(matriz, 1) LOOP
l = 0;
FOR j IN 1..array_length(matriz, 1) LOOP
IF j != coluna THEN
resultante[k][l] = matriz[i][j];
l = l + 1;
END IF;
END LOOP;
IF i != linha THEN
l = l + 1;
END IF;
END LOOP;
RETURN resultante;
END;
$$ language plpgsql;
CREATE OR REPLACE FUNCTION determinant(matriz float[][], OUT produto float) AS
$$
DECLARE
i integer;
BEGIN
IF array_length(matriz, 1) <> array_length(matriz, 2) THEN
RAISE EXCEPTION 'matrix not quadratic.';
END IF;
produto = 0;
IF array_length(matriz, 1) = 2 THEN
produto = matriz[1][1] * matriz[2][2] - matriz[1][2] * matriz[2][1];
END IF;
IF array_length(matriz, 1) > 2 THEN
FOR i IN 1..array_length(matriz, 1) LOOP
produto = produto + matriz[1][i] * (-1)^(0+(i-1)) * determinant(remove(matriz, 1, i));
END LOOP;
END IF;
END;
$$ language plpgsql;
SELECT determinant('{{1.0,7.0, 2.0, 4.0}, {2.0, 3.0, 5.0, 4.0}, {9.0, 1.0, 8.0, 2.0}, {4.0, 1.0, 1.0, 4.0}}');
结果:
[76:1] Failed in 0 s.
[Exception, Error code 0, SQLState 2202E] ERROR: array subscript out of range
Onde: função PL/pgSQL remove(double precision[],integer,integer) linha 15 em atribuição
função PL/pgSQL determinante(double precision[]) linha 17 em atribuição
Line 76, column 1
你永远不会改变k
。另一方面,你增加了 l
太多。
其中一个l = l + 1
(有两个)应该是k = k + 1
。