【问题标题】:Getting the error "ERROR: array subscript out of range" when implementing Laplace's Theorem for determinants PL/pgSQL?在为行列式 PL/pgSQL 实现拉普拉斯定理时出现错误“错误:数组下标超出范围”?
【发布时间】:2021-12-28 10:19:01
【问题描述】:

作为练习,我正在编写一个 PL/pgSQL 函数,该函数实现拉普拉斯定理来计算行列式,然后在调用时打印解决方案。我是这门语言的新手,找不到代码有什么问题。我认为这个想法还可以,也许有一个sintax错误!救命!

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

【问题讨论】:

    标签: arrays postgresql algorithm multidimensional-array matrix-multiplication


    【解决方案1】:

    你永远不会改变k。另一方面,你增加了太多l

    l = l + 1 之一(有两个)应该是k = k + 1

    【讨论】:

    • 非常感谢!对愚蠢的错误感到抱歉!另一件必须改变的事情是 l 和 k 的初始化从 0 到 1。
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 2020-07-19
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    相关资源
    最近更新 更多