[BACK]Return to standard_random_matrices.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Matrices

File: [local] / OpenXM_contrib / PHC / Ada / Math_Lib / Matrices / standard_random_matrices.adb (download)

Revision 1.1.1.1 (vendor branch), Sun Oct 29 17:45:24 2000 UTC (23 years, 7 months ago) by maekawa
Branch: PHC, MAIN
CVS Tags: v2, maekawa-ipv6, RELEASE_1_2_3, RELEASE_1_2_2_KNOPPIX_b, RELEASE_1_2_2_KNOPPIX, RELEASE_1_2_2, RELEASE_1_2_1, HEAD
Changes since 1.1: +0 -0 lines

Import the second public release of PHCpack.

OKed by Jan Verschelde.

with Standard_Random_Numbers;            use Standard_Random_Numbers;
with Standard_Complex_Numbers;           use Standard_Complex_Numbers;
with Standard_Natural_Vectors;
with Standard_Floating_Vectors;
with Standard_Complex_Vectors;
with Standard_Floating_QR_Decomposition; use Standard_Floating_QR_Decomposition;
with Standard_Complex_QR_Decomposition;  use Standard_Complex_QR_Decomposition;

package body Standard_Random_Matrices is

  function Random_Matrix ( n,m : natural; low,upp : integer )
                         return Standard_Integer_Matrices.Matrix is

    res : Standard_Integer_Matrices.Matrix(1..n,1..m);

  begin
    for i in 1..n loop
      for j in 1..m loop
        res(i,j) := Random(low,upp);
      end loop;
    end loop;
    return res;
  end Random_Matrix;

  function Random_Matrix ( n,m : natural )
                         return Standard_Floating_Matrices.Matrix is

    res : Standard_Floating_Matrices.Matrix(1..n,1..m);

  begin
    for i in 1..n loop
      for j in 1..m loop
        res(i,j) := Random;
      end loop;
    end loop;
    return res;
  end Random_Matrix;

  function Orthogonalize ( mat : Standard_Floating_Matrices.Matrix )
                         return Standard_Floating_Matrices.Matrix is

    n : constant natural := mat'length(1);
    m : constant natural := mat'length(2);
    res : Standard_Floating_Matrices.Matrix(1..n,1..m);
    wrk : Standard_Floating_Matrices.Matrix(1..n,1..m);
    bas : Standard_Floating_Matrices.Matrix(1..n,1..n);
    qra : Standard_Floating_Vectors.Vector(1..n) := (1..n => 0.0);
    pvt : Standard_Natural_Vectors.Vector(1..n) := (1..n => 0); 

  begin
    wrk := mat;
    QRD(wrk,qra,pvt,false);
    for i in wrk'range(1) loop
      for j in wrk'range(2) loop
        bas(i,j) := wrk(i,j);
      end loop;
      for j in m+1..n loop
        bas(i,j) := 0.0;
	  end loop;
    end loop;
    Basis(bas,mat); 
    for i in res'range(1) loop
      for j in res'range(2) loop
        res(i,j) := bas(i,j);
      end loop;
    end loop;
    return res;
  end Orthogonalize;

  function Random_Orthogonal_Matrix
             ( n,m : natural ) return Standard_Floating_Matrices.Matrix is

    res : Standard_Floating_Matrices.Matrix(1..n,1..m)
        := Orthogonalize(Random_Matrix(n,m));

  begin
    return res;
  end Random_Orthogonal_Matrix;

  function Random_Matrix ( n,m : natural )
                         return Standard_Complex_Matrices.Matrix is

    res : Standard_Complex_Matrices.Matrix(1..n,1..m);

  begin
    for i in 1..n loop
      for j in 1..m loop
        res(i,j) := Random;
      end loop;
    end loop;
    return res;
  end Random_Matrix;

  function Orthogonalize ( mat : Standard_Complex_Matrices.Matrix )
                         return Standard_Complex_Matrices.Matrix is

    n : constant natural := mat'length(1);
    m : constant natural := mat'length(2);
    res : Standard_Complex_Matrices.Matrix(1..n,1..m);
    wrk : Standard_Complex_Matrices.Matrix(1..n,1..m);
    bas : Standard_Complex_Matrices.Matrix(1..n,1..n);
    qra : Standard_Complex_Vectors.Vector(1..n) := (1..n => Create(0.0));
    pvt : Standard_Natural_Vectors.Vector(1..n) := (1..n => 0); 

  begin
    wrk := mat;
    QRD(wrk,qra,pvt,false);
    for i in wrk'range(1) loop
      for j in wrk'range(2) loop
        bas(i,j) := wrk(i,j);
      end loop;
      for j in m+1..n loop
        bas(i,j) := Create(0.0);
	  end loop;
    end loop;
    Basis(bas,mat); 
    for i in res'range(1) loop
      for j in res'range(2) loop
        res(i,j) := bas(i,j);
      end loop;
    end loop;
    return res;
  end Orthogonalize;

  function Random_Orthogonal_Matrix
                ( n,m : natural ) return Standard_Complex_Matrices.Matrix is

    res : Standard_Complex_Matrices.Matrix(1..n,1..m)
        := Orthogonalize(Random_Matrix(n,m));

  begin
    return res;
  end Random_Orthogonal_Matrix;

end Standard_Random_Matrices;