Ada:用一行一列访问实_矩阵中的第一个元素

Ada:用一行一列访问实_矩阵中的第一个元素,ada,Ada,问题陈述 我有一个一行一列的实矩阵。我想计算第一行第一列的单个元素的值。我尝试使用:Matrix(I,J)语法访问矩阵时出错。见下文: 代码 with Ada.Numerics.Real_Arrays; use Ada.Numerics.Real_Arrays; with Ada.Text_IO; use Ada.Text_IO; procedure Matrix is ------------------------------------ -- Re

问题陈述

我有一个一行一列的实矩阵。我想计算第一行第一列的单个元素的值。我尝试使用:Matrix(I,J)语法访问矩阵时出错。见下文:

代码

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;

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

Put\u行
(浮标图像)
(实矩阵’((转置(α)*α)/(转置(β)*β))
(整数'第一,整数'第一));

当我尝试这个时,我得到了一个约束错误;所以我尝试了BrianDrummond的建议

γ:常数实矩阵:=(转置(α)*α)/(转置(β)*β);
结果表明,
γ的第一(1)
为-2147483648,而
γ的第一(2)
为1(这是macOS Sierra上的GNAT GPL 2016)

进一步的调查:我很确定这是GNAT的
中的一个bug。 说

此函数返回一个矩阵B,使得a*B(几乎)等于单位矩阵。结果的索引范围是A'范围(2)和A'范围(1)。如果“长度(1)不等于”长度(2),则引发约束_错误。如果矩阵A是病态的,则会产生约束_错误

GNAT的实现非常简单

函数逆(A:实_矩阵)返回实_矩阵为
(解(A,单位矩阵(长度(A)));
其中,
求解
(同一参考文献,(70))表示

此函数返回一个矩阵Y,使得X(几乎)等于a*Y。这是求解多组线性方程组的标准数学运算。结果的索引范围是A'范围(2)和X'范围(2)。如果A'Length(1)、A'Length(2)和X'Length(1)不相等,则会引发约束_错误。如果矩阵A是病态的,则会产生约束_错误

单位矩阵
(同一参考文献,(79))为

功能单元矩阵(顺序:正;
第一个_1,第一个_2:整数:=1)返回实_矩阵;

请注意
First_1
First_2
的默认值

你能添加实矩阵的类型定义吗?另外,把它分解成一种诊断技术。将矩阵运算结果分配给中间变量。将其作为单独的操作进行索引。查看哪个部分失败。请注意,
Integer'First
-2147483648
,而您可能希望使用
1
0
。@NWS,
Real\u矩阵
Ada.Numerics.Real\u数组
(ARM G.3.1(31))中声明。在您的示例中,要访问数组“y”中的元素,下面的语法是有效的:Value_Of_element_in_y:=y(y'First(1),y'First(2)这不是一个示例,这是参考手册中的引用。