2016-12-13 5 views
2

PROBLEM STATEMENTAda: Zugriffs erstes Element in Real_Matrix mit einer Zeile und einer Spalte

Ich habe eine Real_Matrix mit einer Zeile und einer Spalte. Ich möchte den Wert des einzelnen Elements in Zeile eins, Spalte eins auswerten. Ich erhalte einen Fehler, wenn ich versuche, auf die Matrix zuzugreifen, indem ich folgende Syntax verwende: Matrix (I, J). Siehe unten:

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

Können Sie die Typdefinition von Real_Matrix hinzufügen? – NWS

+0

Auch brechen Sie es als Diagnosetechnik auf. Weisen Sie das Ergebnis der Matrixoperation einer Zwischenvariablen zu. Index das als eine separate Operation. Sehen Sie, welcher Teil fehlschlägt. –

+0

Beachten Sie, dass 'Integer'First'' -2147483648' ist, während Sie stattdessen eine '1' oder' 0' haben möchten. –

Antwort

5

Ich denke, Ihnen eine echte Sprache Anwalt muss Ihnen sagen, ob dies ein Compiler Fehler oder das richtige Verhalten, aber Ihr Code kompilieren, wenn Sie den Compiler zwingen zu erkennen, dass der / Betrieb ein Real_Matrix produziert:

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

Wenn ich das versuchte, bekam ich einen Constraint_Error; so habe ich versucht, @ BrianDrummond Vorschlag,

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

und es stellt sich heraus, dass γ’First (1) ist -2147483648, während γ’First (2) 1 ist (diese GNAT GPL 2016 macOS Sierra ist).

Weitere Untersuchung: Ich bin mir ziemlich sicher, dass dies ein Fehler in GNAT Inverse ist. ARM G.3.1(72) sagt

Diese Funktion eine Matrix B so liefert, daß A * B (fast) gleich der Einheitsmatrix ist. Die Indexbereiche des Ergebnisses sind A'Range (2) und A'Range (1). Constraint_Error wird ausgelöst, wenn A'Length (1) nicht gleich A'Length (2) ist. Constraint_Error wird ausgelöst, wenn die Matrix A schlecht konditioniert ist.

und Umsetzung des GNAT ist

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

wo Solve (gleiche Referenz, (70)), sagt

Diese Funktion eine Matrix Y solche gibt, dass X ist (fast) gleich A * Y. Dies ist die mathematische Standardoperation zum Lösen mehrerer linearer Gleichungssysteme. Die Indexbereiche des Ergebnisses sind A'Range (2) und X'Range (2). Constraint_Error wird ausgelöst, wenn A'Length (1), A'Length (2) und X'Length (1) nicht gleich sind. Constraint_Error wird ausgelöst, wenn die Matrix A schlecht konditioniert ist.

und Unit_Matrix (gleiche Referenz, (79)) ist

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

Beachten Sie die Standardwerte für First_1, First_2!

+0

In Ihrem Beispiel, um auf das Element im Array 'y' zuzugreifen, funktioniert die folgende Syntax: Value_Of_Element_In_y: = y (y'First (1), y'First (2) – evilspacepirate

+0

Das ist kein Beispiel, das ist ein Zitat von das Referenzhandbuch. –

Verwandte Themen