Ada:访问Real_Matrix中的第一个元素,其中包含一行和一列

时间:2016-12-13 21:21:52

标签: ada

问题陈述

我有一行一列一列的Real_Matrix。我想评估第一列第一列上单个元素的值。当我尝试使用:Matrix(I,J)语法访问Matrix时,我收到错误。见下文:

CODE

with Ada.Numerics.Real_Arrays; use Ada.Numerics.Real_Arrays;
with Ada.Text_IO;              use Ada.Text_IO;

procedure Matrix is

   ------------------------------------
   -- Real_Matrix Division Operation --
   ------------------------------------

   function "/" (Left  : Real_Matrix;
                 Right : Real_Matrix) return Real_Matrix
   is
   begin
      return Left * Inverse(Right);
   end "/";

   α : Real_Matrix := ( ( Integer'First => 1.0 ),
                        ( Integer'First => 2.0 ) );
   β : Real_Matrix := ( ( Integer'First => 3.0 ),
                        ( Integer'First => 4.0 ) );

begin

   -- This operation returns an matrix with one row and one column --

   Put_Line(Float'Image(((Transpose(α) * α) / (Transpose(β) * β))(Integer'First, Integer'First))); -- Error: Missing "," --

end Matrix;

1 个答案:

答案 0 :(得分:5)

我认为您需要一位真正的语言律师来告诉您这是编译器故障还是正确的行为,但如果您强制编译器识别/操作产生Real_Matrix,您的代码将编译}:

Put_Line
  (Float'Image 
     (Real_Matrix'((Transpose(α) * α) / (Transpose(β) * β))
        (Integer'First, Integer'First)));

当我尝试这个时,我得到了一个Constraint_Error;所以我尝试了@ BrianDrummond的建议,

γ : constant Real_Matrix := (Transpose(α) * α) / (Transpose(β) * β);

事实证明γ’First (1)是-2147483648,而γ’First (2)是1(这是macOS Sierra上的GNAT GPL 2016)。

进一步调查:我很确定这是GNAT Inverse中的一个错误。 ARM G.3.1(72)

  

该函数返回矩阵B,使得A * B(几乎)等于单位矩阵。结果的索引范围是A'Range(2)和A'Range(1)。如果A'Length(1)不等于A'Length(2),则引发Constraint_Error。如果矩阵A病态,则会引发Constraint_Error。

和GNAT的实施是

function Inverse (A : Real_Matrix) return Real_Matrix is
  (Solve (A, Unit_Matrix (Length (A))));

其中Solve(同一参考文献,(70))说

  

此函数返回矩阵Y,使得X(几乎)等于A * Y.这是求解几组线性方程的标准数学运算。结果的索引范围是A'Range(2)和X'Range(2)。如果A'Length(1),A'Length(2)和X'Length(1)不相等,则引发Constraint_Error。如果矩阵A病态,则会引发Constraint_Error。

Unit_Matrix(同一参考文献,(79))是

function Unit_Matrix (Order            : Positive;
                      First_1, First_2 : Integer := 1) return Real_Matrix;

请注意First_1First_2的默认值!