Matrix transposition: Difference between revisions

Ada example
m (→‎{{header|Perl}}: Remove math bug :))
(Ada example)
Line 1:
{{task}}Transpose an arbitrarily sized rectangular Matrix.
 
=={{header|Ada}}==
This example creates a matrix type of arbitrary length using a generic package. The array element type is any floating point type. The array index type is any discrete value. For this example an enumerated type is used for the index type.
generic
type Element_Type is digits <>;
type Row_Index is (<>);
package Rect_Real_Matrix is
type Rect_Matrix is array (Row_Index range <>, Row_Index range <>) of Element_Type;
function Transpose(Item : Rect_Matrix) return Rect_Matrix;
procedure Print(Item : Rect_Matrix);
end Rect_Real_Matrix;
 
with Ada.Text_Io;
package body Rect_Real_Matrix is
-----------
-- Print --
-----------
procedure Print(Item : Rect_Matrix) is
package Real_Io is new Ada.Text_Io.Float_Io(Element_Type);
use Real_Io;
use Ada.Text_Io;
begin
for I in Item'range(1) loop
for J in Item 'range(2) loop
Put(Item => Item(I,J), Exp => 0, Fore => 5);
Put(" ");
end loop;
New_Line;
end loop;
end Print;
---------------
-- Transpose --
---------------
function Transpose (Item : Rect_Matrix) return Rect_Matrix is
Temp : Rect_Matrix(Item'Range(2), Item'Range(1));
begin
for Col in Item'range(1) loop
for Row in Item'range(2) loop
Temp(Row,Col) := Item(Col,Row);
end loop;
end loop;
return Temp;
end Transpose;
end Rect_Real_Matrix;
 
with Rect_Real_Matrix;
with Ada.Text_IO; use Ada.Text_IO;
procedure Rect_Mat_Transpose is
type Col_Index is (Severe, High, Moderate, Low, Insignificant);
subtype Row_Index is Col_Index range Severe..Low;
package Flt_Mat is new Rect_Real_Matrix(Float, Col_Index);
use Flt_Mat;
M : Rect_Matrix(Col_Index, Row_Index) := ((1.0, 1.0, 1.0, 1.0),
(2.0, 4.0, 8.0, 16.0),
(3.0, 9.0, 27.0, 81.0),
(4.0, 16.0, 64.0, 256.0),
(5.0, 25.0,125.0, 625.0));
begin
Put_line("Before Transposition:");
Print(M);
New_Line;
Put_Line("After Transposition:");
Print(Transpose(M));
end Rect_Mat_Transpose;
 
Output:
 
Before Transposition:
1.00000 1.00000 1.00000 1.00000
2.00000 4.00000 8.00000 16.00000
3.00000 9.00000 27.00000 81.00000
4.00000 16.00000 64.00000 256.00000
5.00000 25.00000 125.00000 625.00000
After Transposition:
1.00000 2.00000 3.00000 4.00000 5.00000
1.00000 4.00000 9.00000 16.00000 25.00000
1.00000 8.00000 27.00000 64.00000 125.00000
1.00000 16.00000 81.00000 256.00000 625.00000
 
=={{header|ALGOL 68}}==
main:(
Anonymous user