问题陈述
我有一行一列一列的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;
答案 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_1
,First_2
的默认值!