Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/22/10 00:44:01 (14 years ago)
Author:
swagner
Message:

Sorted usings and removed unused usings in entire solution (#1094)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.ExtLibs/HeuristicLab.ALGLIB/2.5.0/ALGLIB-2.5.0/inverseupdate.cs

    r3839 r4068  
    1919*************************************************************************/
    2020
    21 using System;
    22 
    23 namespace alglib
    24 {
    25     public class inverseupdate
    26     {
    27         /*************************************************************************
    28         Inverse matrix update by the Sherman-Morrison formula
    29 
    30         The algorithm updates matrix A^-1 when adding a number to an element
    31         of matrix A.
    32 
    33         Input parameters:
    34             InvA    -   inverse of matrix A.
     21
     22namespace alglib {
     23  public class inverseupdate {
     24    /*************************************************************************
     25    Inverse matrix update by the Sherman-Morrison formula
     26
     27    The algorithm updates matrix A^-1 when adding a number to an element
     28    of matrix A.
     29
     30    Input parameters:
     31        InvA    -   inverse of matrix A.
     32                    Array whose indexes range within [0..N-1, 0..N-1].
     33        N       -   size of matrix A.
     34        UpdRow  -   row where the element to be updated is stored.
     35        UpdColumn - column where the element to be updated is stored.
     36        UpdVal  -   a number to be added to the element.
     37
     38
     39    Output parameters:
     40        InvA    -   inverse of modified matrix A.
     41
     42      -- ALGLIB --
     43         Copyright 2005 by Bochkanov Sergey
     44    *************************************************************************/
     45    public static void rmatrixinvupdatesimple(ref double[,] inva,
     46        int n,
     47        int updrow,
     48        int updcolumn,
     49        double updval) {
     50      double[] t1 = new double[0];
     51      double[] t2 = new double[0];
     52      int i = 0;
     53      double lambda = 0;
     54      double vt = 0;
     55      int i_ = 0;
     56
     57      System.Diagnostics.Debug.Assert(updrow >= 0 & updrow < n, "RMatrixInvUpdateSimple: incorrect UpdRow!");
     58      System.Diagnostics.Debug.Assert(updcolumn >= 0 & updcolumn < n, "RMatrixInvUpdateSimple: incorrect UpdColumn!");
     59      t1 = new double[n - 1 + 1];
     60      t2 = new double[n - 1 + 1];
     61
     62      //
     63      // T1 = InvA * U
     64      //
     65      for (i_ = 0; i_ <= n - 1; i_++) {
     66        t1[i_] = inva[i_, updrow];
     67      }
     68
     69      //
     70      // T2 = v*InvA
     71      //
     72      for (i_ = 0; i_ <= n - 1; i_++) {
     73        t2[i_] = inva[updcolumn, i_];
     74      }
     75
     76      //
     77      // Lambda = v * InvA * U
     78      //
     79      lambda = updval * inva[updcolumn, updrow];
     80
     81      //
     82      // InvA = InvA - correction
     83      //
     84      for (i = 0; i <= n - 1; i++) {
     85        vt = updval * t1[i];
     86        vt = vt / (1 + lambda);
     87        for (i_ = 0; i_ <= n - 1; i_++) {
     88          inva[i, i_] = inva[i, i_] - vt * t2[i_];
     89        }
     90      }
     91    }
     92
     93
     94    /*************************************************************************
     95    Inverse matrix update by the Sherman-Morrison formula
     96
     97    The algorithm updates matrix A^-1 when adding a vector to a row
     98    of matrix A.
     99
     100    Input parameters:
     101        InvA    -   inverse of matrix A.
     102                    Array whose indexes range within [0..N-1, 0..N-1].
     103        N       -   size of matrix A.
     104        UpdRow  -   the row of A whose vector V was added.
     105                    0 <= Row <= N-1
     106        V       -   the vector to be added to a row.
     107                    Array whose index ranges within [0..N-1].
     108
     109    Output parameters:
     110        InvA    -   inverse of modified matrix A.
     111
     112      -- ALGLIB --
     113         Copyright 2005 by Bochkanov Sergey
     114    *************************************************************************/
     115    public static void rmatrixinvupdaterow(ref double[,] inva,
     116        int n,
     117        int updrow,
     118        ref double[] v) {
     119      double[] t1 = new double[0];
     120      double[] t2 = new double[0];
     121      int i = 0;
     122      int j = 0;
     123      double lambda = 0;
     124      double vt = 0;
     125      int i_ = 0;
     126
     127      t1 = new double[n - 1 + 1];
     128      t2 = new double[n - 1 + 1];
     129
     130      //
     131      // T1 = InvA * U
     132      //
     133      for (i_ = 0; i_ <= n - 1; i_++) {
     134        t1[i_] = inva[i_, updrow];
     135      }
     136
     137      //
     138      // T2 = v*InvA
     139      // Lambda = v * InvA * U
     140      //
     141      for (j = 0; j <= n - 1; j++) {
     142        vt = 0.0;
     143        for (i_ = 0; i_ <= n - 1; i_++) {
     144          vt += v[i_] * inva[i_, j];
     145        }
     146        t2[j] = vt;
     147      }
     148      lambda = t2[updrow];
     149
     150      //
     151      // InvA = InvA - correction
     152      //
     153      for (i = 0; i <= n - 1; i++) {
     154        vt = t1[i] / (1 + lambda);
     155        for (i_ = 0; i_ <= n - 1; i_++) {
     156          inva[i, i_] = inva[i, i_] - vt * t2[i_];
     157        }
     158      }
     159    }
     160
     161
     162    /*************************************************************************
     163    Inverse matrix update by the Sherman-Morrison formula
     164
     165    The algorithm updates matrix A^-1 when adding a vector to a column
     166    of matrix A.
     167
     168    Input parameters:
     169        InvA        -   inverse of matrix A.
    35170                        Array whose indexes range within [0..N-1, 0..N-1].
    36             N       -   size of matrix A.
    37             UpdRow  -   row where the element to be updated is stored.
    38             UpdColumn - column where the element to be updated is stored.
    39             UpdVal  -   a number to be added to the element.
    40 
    41 
    42         Output parameters:
    43             InvA    -   inverse of modified matrix A.
    44 
    45           -- ALGLIB --
    46              Copyright 2005 by Bochkanov Sergey
    47         *************************************************************************/
    48         public static void rmatrixinvupdatesimple(ref double[,] inva,
    49             int n,
    50             int updrow,
    51             int updcolumn,
    52             double updval)
    53         {
    54             double[] t1 = new double[0];
    55             double[] t2 = new double[0];
    56             int i = 0;
    57             double lambda = 0;
    58             double vt = 0;
    59             int i_ = 0;
    60 
    61             System.Diagnostics.Debug.Assert(updrow>=0 & updrow<n, "RMatrixInvUpdateSimple: incorrect UpdRow!");
    62             System.Diagnostics.Debug.Assert(updcolumn>=0 & updcolumn<n, "RMatrixInvUpdateSimple: incorrect UpdColumn!");
    63             t1 = new double[n-1+1];
    64             t2 = new double[n-1+1];
    65            
    66             //
    67             // T1 = InvA * U
    68             //
    69             for(i_=0; i_<=n-1;i_++)
    70             {
    71                 t1[i_] = inva[i_,updrow];
    72             }
    73            
    74             //
    75             // T2 = v*InvA
    76             //
    77             for(i_=0; i_<=n-1;i_++)
    78             {
    79                 t2[i_] = inva[updcolumn,i_];
    80             }
    81            
    82             //
    83             // Lambda = v * InvA * U
    84             //
    85             lambda = updval*inva[updcolumn,updrow];
    86            
    87             //
    88             // InvA = InvA - correction
    89             //
    90             for(i=0; i<=n-1; i++)
    91             {
    92                 vt = updval*t1[i];
    93                 vt = vt/(1+lambda);
    94                 for(i_=0; i_<=n-1;i_++)
    95                 {
    96                     inva[i,i_] = inva[i,i_] - vt*t2[i_];
    97                 }
    98             }
    99         }
    100 
    101 
    102         /*************************************************************************
    103         Inverse matrix update by the Sherman-Morrison formula
    104 
    105         The algorithm updates matrix A^-1 when adding a vector to a row
    106         of matrix A.
    107 
    108         Input parameters:
    109             InvA    -   inverse of matrix A.
    110                         Array whose indexes range within [0..N-1, 0..N-1].
    111             N       -   size of matrix A.
    112             UpdRow  -   the row of A whose vector V was added.
    113                         0 <= Row <= N-1
    114             V       -   the vector to be added to a row.
     171        N           -   size of matrix A.
     172        UpdColumn   -   the column of A whose vector U was added.
     173                        0 <= UpdColumn <= N-1
     174        U           -   the vector to be added to a column.
    115175                        Array whose index ranges within [0..N-1].
    116176
    117         Output parameters:
    118             InvA    -   inverse of modified matrix A.
    119 
    120           -- ALGLIB --
    121              Copyright 2005 by Bochkanov Sergey
    122         *************************************************************************/
    123         public static void rmatrixinvupdaterow(ref double[,] inva,
    124             int n,
    125             int updrow,
    126             ref double[] v)
    127         {
    128             double[] t1 = new double[0];
    129             double[] t2 = new double[0];
    130             int i = 0;
    131             int j = 0;
    132             double lambda = 0;
    133             double vt = 0;
    134             int i_ = 0;
    135 
    136             t1 = new double[n-1+1];
    137             t2 = new double[n-1+1];
    138            
    139             //
    140             // T1 = InvA * U
    141             //
    142             for(i_=0; i_<=n-1;i_++)
    143             {
    144                 t1[i_] = inva[i_,updrow];
    145             }
    146            
    147             //
    148             // T2 = v*InvA
    149             // Lambda = v * InvA * U
    150             //
    151             for(j=0; j<=n-1; j++)
    152             {
    153                 vt = 0.0;
    154                 for(i_=0; i_<=n-1;i_++)
    155                 {
    156                     vt += v[i_]*inva[i_,j];
    157                 }
    158                 t2[j] = vt;
    159             }
    160             lambda = t2[updrow];
    161            
    162             //
    163             // InvA = InvA - correction
    164             //
    165             for(i=0; i<=n-1; i++)
    166             {
    167                 vt = t1[i]/(1+lambda);
    168                 for(i_=0; i_<=n-1;i_++)
    169                 {
    170                     inva[i,i_] = inva[i,i_] - vt*t2[i_];
    171                 }
    172             }
    173         }
    174 
    175 
    176         /*************************************************************************
    177         Inverse matrix update by the Sherman-Morrison formula
    178 
    179         The algorithm updates matrix A^-1 when adding a vector to a column
    180         of matrix A.
    181 
    182         Input parameters:
    183             InvA        -   inverse of matrix A.
    184                             Array whose indexes range within [0..N-1, 0..N-1].
    185             N           -   size of matrix A.
    186             UpdColumn   -   the column of A whose vector U was added.
    187                             0 <= UpdColumn <= N-1
    188             U           -   the vector to be added to a column.
    189                             Array whose index ranges within [0..N-1].
    190 
    191         Output parameters:
    192             InvA        -   inverse of modified matrix A.
    193 
    194           -- ALGLIB --
    195              Copyright 2005 by Bochkanov Sergey
    196         *************************************************************************/
    197         public static void rmatrixinvupdatecolumn(ref double[,] inva,
    198             int n,
    199             int updcolumn,
    200             ref double[] u)
    201         {
    202             double[] t1 = new double[0];
    203             double[] t2 = new double[0];
    204             int i = 0;
    205             double lambda = 0;
    206             double vt = 0;
    207             int i_ = 0;
    208 
    209             t1 = new double[n-1+1];
    210             t2 = new double[n-1+1];
    211            
    212             //
    213             // T1 = InvA * U
    214             // Lambda = v * InvA * U
    215             //
    216             for(i=0; i<=n-1; i++)
    217             {
    218                 vt = 0.0;
    219                 for(i_=0; i_<=n-1;i_++)
    220                 {
    221                     vt += inva[i,i_]*u[i_];
    222                 }
    223                 t1[i] = vt;
    224             }
    225             lambda = t1[updcolumn];
    226            
    227             //
    228             // T2 = v*InvA
    229             //
    230             for(i_=0; i_<=n-1;i_++)
    231             {
    232                 t2[i_] = inva[updcolumn,i_];
    233             }
    234            
    235             //
    236             // InvA = InvA - correction
    237             //
    238             for(i=0; i<=n-1; i++)
    239             {
    240                 vt = t1[i]/(1+lambda);
    241                 for(i_=0; i_<=n-1;i_++)
    242                 {
    243                     inva[i,i_] = inva[i,i_] - vt*t2[i_];
    244                 }
    245             }
    246         }
    247 
    248 
    249         /*************************************************************************
    250         Inverse matrix update by the Sherman-Morrison formula
    251 
    252         The algorithm computes the inverse of matrix A+u*v’ by using the given matrix
    253         A^-1 and the vectors u and v.
    254 
    255         Input parameters:
    256             InvA    -   inverse of matrix A.
    257                         Array whose indexes range within [0..N-1, 0..N-1].
    258             N       -   size of matrix A.
    259             U       -   the vector modifying the matrix.
    260                         Array whose index ranges within [0..N-1].
    261             V       -   the vector modifying the matrix.
    262                         Array whose index ranges within [0..N-1].
    263 
    264         Output parameters:
    265             InvA - inverse of matrix A + u*v'.
    266 
    267           -- ALGLIB --
    268              Copyright 2005 by Bochkanov Sergey
    269         *************************************************************************/
    270         public static void rmatrixinvupdateuv(ref double[,] inva,
    271             int n,
    272             ref double[] u,
    273             ref double[] v)
    274         {
    275             double[] t1 = new double[0];
    276             double[] t2 = new double[0];
    277             int i = 0;
    278             int j = 0;
    279             double lambda = 0;
    280             double vt = 0;
    281             int i_ = 0;
    282 
    283             t1 = new double[n-1+1];
    284             t2 = new double[n-1+1];
    285            
    286             //
    287             // T1 = InvA * U
    288             // Lambda = v * T1
    289             //
    290             for(i=0; i<=n-1; i++)
    291             {
    292                 vt = 0.0;
    293                 for(i_=0; i_<=n-1;i_++)
    294                 {
    295                     vt += inva[i,i_]*u[i_];
    296                 }
    297                 t1[i] = vt;
    298             }
    299             lambda = 0.0;
    300             for(i_=0; i_<=n-1;i_++)
    301             {
    302                 lambda += v[i_]*t1[i_];
    303             }
    304            
    305             //
    306             // T2 = v*InvA
    307             //
    308             for(j=0; j<=n-1; j++)
    309             {
    310                 vt = 0.0;
    311                 for(i_=0; i_<=n-1;i_++)
    312                 {
    313                     vt += v[i_]*inva[i_,j];
    314                 }
    315                 t2[j] = vt;
    316             }
    317            
    318             //
    319             // InvA = InvA - correction
    320             //
    321             for(i=0; i<=n-1; i++)
    322             {
    323                 vt = t1[i]/(1+lambda);
    324                 for(i_=0; i_<=n-1;i_++)
    325                 {
    326                     inva[i,i_] = inva[i,i_] - vt*t2[i_];
    327                 }
    328             }
    329         }
    330 
    331 
    332         public static void shermanmorrisonsimpleupdate(ref double[,] inva,
    333             int n,
    334             int updrow,
    335             int updcolumn,
    336             double updval)
    337         {
    338             double[] t1 = new double[0];
    339             double[] t2 = new double[0];
    340             int i = 0;
    341             double lambda = 0;
    342             double vt = 0;
    343             int i_ = 0;
    344 
    345             t1 = new double[n+1];
    346             t2 = new double[n+1];
    347            
    348             //
    349             // T1 = InvA * U
    350             //
    351             for(i_=1; i_<=n;i_++)
    352             {
    353                 t1[i_] = inva[i_,updrow];
    354             }
    355            
    356             //
    357             // T2 = v*InvA
    358             //
    359             for(i_=1; i_<=n;i_++)
    360             {
    361                 t2[i_] = inva[updcolumn,i_];
    362             }
    363            
    364             //
    365             // Lambda = v * InvA * U
    366             //
    367             lambda = updval*inva[updcolumn,updrow];
    368            
    369             //
    370             // InvA = InvA - correction
    371             //
    372             for(i=1; i<=n; i++)
    373             {
    374                 vt = updval*t1[i];
    375                 vt = vt/(1+lambda);
    376                 for(i_=1; i_<=n;i_++)
    377                 {
    378                     inva[i,i_] = inva[i,i_] - vt*t2[i_];
    379                 }
    380             }
    381         }
    382 
    383 
    384         public static void shermanmorrisonupdaterow(ref double[,] inva,
    385             int n,
    386             int updrow,
    387             ref double[] v)
    388         {
    389             double[] t1 = new double[0];
    390             double[] t2 = new double[0];
    391             int i = 0;
    392             int j = 0;
    393             double lambda = 0;
    394             double vt = 0;
    395             int i_ = 0;
    396 
    397             t1 = new double[n+1];
    398             t2 = new double[n+1];
    399            
    400             //
    401             // T1 = InvA * U
    402             //
    403             for(i_=1; i_<=n;i_++)
    404             {
    405                 t1[i_] = inva[i_,updrow];
    406             }
    407            
    408             //
    409             // T2 = v*InvA
    410             // Lambda = v * InvA * U
    411             //
    412             for(j=1; j<=n; j++)
    413             {
    414                 vt = 0.0;
    415                 for(i_=1; i_<=n;i_++)
    416                 {
    417                     vt += v[i_]*inva[i_,j];
    418                 }
    419                 t2[j] = vt;
    420             }
    421             lambda = t2[updrow];
    422            
    423             //
    424             // InvA = InvA - correction
    425             //
    426             for(i=1; i<=n; i++)
    427             {
    428                 vt = t1[i]/(1+lambda);
    429                 for(i_=1; i_<=n;i_++)
    430                 {
    431                     inva[i,i_] = inva[i,i_] - vt*t2[i_];
    432                 }
    433             }
    434         }
    435 
    436 
    437         public static void shermanmorrisonupdatecolumn(ref double[,] inva,
    438             int n,
    439             int updcolumn,
    440             ref double[] u)
    441         {
    442             double[] t1 = new double[0];
    443             double[] t2 = new double[0];
    444             int i = 0;
    445             double lambda = 0;
    446             double vt = 0;
    447             int i_ = 0;
    448 
    449             t1 = new double[n+1];
    450             t2 = new double[n+1];
    451            
    452             //
    453             // T1 = InvA * U
    454             // Lambda = v * InvA * U
    455             //
    456             for(i=1; i<=n; i++)
    457             {
    458                 vt = 0.0;
    459                 for(i_=1; i_<=n;i_++)
    460                 {
    461                     vt += inva[i,i_]*u[i_];
    462                 }
    463                 t1[i] = vt;
    464             }
    465             lambda = t1[updcolumn];
    466            
    467             //
    468             // T2 = v*InvA
    469             //
    470             for(i_=1; i_<=n;i_++)
    471             {
    472                 t2[i_] = inva[updcolumn,i_];
    473             }
    474            
    475             //
    476             // InvA = InvA - correction
    477             //
    478             for(i=1; i<=n; i++)
    479             {
    480                 vt = t1[i]/(1+lambda);
    481                 for(i_=1; i_<=n;i_++)
    482                 {
    483                     inva[i,i_] = inva[i,i_] - vt*t2[i_];
    484                 }
    485             }
    486         }
    487 
    488 
    489         public static void shermanmorrisonupdateuv(ref double[,] inva,
    490             int n,
    491             ref double[] u,
    492             ref double[] v)
    493         {
    494             double[] t1 = new double[0];
    495             double[] t2 = new double[0];
    496             int i = 0;
    497             int j = 0;
    498             double lambda = 0;
    499             double vt = 0;
    500             int i_ = 0;
    501 
    502             t1 = new double[n+1];
    503             t2 = new double[n+1];
    504            
    505             //
    506             // T1 = InvA * U
    507             // Lambda = v * T1
    508             //
    509             for(i=1; i<=n; i++)
    510             {
    511                 vt = 0.0;
    512                 for(i_=1; i_<=n;i_++)
    513                 {
    514                     vt += inva[i,i_]*u[i_];
    515                 }
    516                 t1[i] = vt;
    517             }
    518             lambda = 0.0;
    519             for(i_=1; i_<=n;i_++)
    520             {
    521                 lambda += v[i_]*t1[i_];
    522             }
    523            
    524             //
    525             // T2 = v*InvA
    526             //
    527             for(j=1; j<=n; j++)
    528             {
    529                 vt = 0.0;
    530                 for(i_=1; i_<=n;i_++)
    531                 {
    532                     vt += v[i_]*inva[i_,j];
    533                 }
    534                 t2[j] = vt;
    535             }
    536            
    537             //
    538             // InvA = InvA - correction
    539             //
    540             for(i=1; i<=n; i++)
    541             {
    542                 vt = t1[i]/(1+lambda);
    543                 for(i_=1; i_<=n;i_++)
    544                 {
    545                     inva[i,i_] = inva[i,i_] - vt*t2[i_];
    546                 }
    547             }
    548         }
    549     }
     177    Output parameters:
     178        InvA        -   inverse of modified matrix A.
     179
     180      -- ALGLIB --
     181         Copyright 2005 by Bochkanov Sergey
     182    *************************************************************************/
     183    public static void rmatrixinvupdatecolumn(ref double[,] inva,
     184        int n,
     185        int updcolumn,
     186        ref double[] u) {
     187      double[] t1 = new double[0];
     188      double[] t2 = new double[0];
     189      int i = 0;
     190      double lambda = 0;
     191      double vt = 0;
     192      int i_ = 0;
     193
     194      t1 = new double[n - 1 + 1];
     195      t2 = new double[n - 1 + 1];
     196
     197      //
     198      // T1 = InvA * U
     199      // Lambda = v * InvA * U
     200      //
     201      for (i = 0; i <= n - 1; i++) {
     202        vt = 0.0;
     203        for (i_ = 0; i_ <= n - 1; i_++) {
     204          vt += inva[i, i_] * u[i_];
     205        }
     206        t1[i] = vt;
     207      }
     208      lambda = t1[updcolumn];
     209
     210      //
     211      // T2 = v*InvA
     212      //
     213      for (i_ = 0; i_ <= n - 1; i_++) {
     214        t2[i_] = inva[updcolumn, i_];
     215      }
     216
     217      //
     218      // InvA = InvA - correction
     219      //
     220      for (i = 0; i <= n - 1; i++) {
     221        vt = t1[i] / (1 + lambda);
     222        for (i_ = 0; i_ <= n - 1; i_++) {
     223          inva[i, i_] = inva[i, i_] - vt * t2[i_];
     224        }
     225      }
     226    }
     227
     228
     229    /*************************************************************************
     230    Inverse matrix update by the Sherman-Morrison formula
     231
     232    The algorithm computes the inverse of matrix A+u*v’ by using the given matrix
     233    A^-1 and the vectors u and v.
     234
     235    Input parameters:
     236        InvA    -   inverse of matrix A.
     237                    Array whose indexes range within [0..N-1, 0..N-1].
     238        N       -   size of matrix A.
     239        U       -   the vector modifying the matrix.
     240                    Array whose index ranges within [0..N-1].
     241        V       -   the vector modifying the matrix.
     242                    Array whose index ranges within [0..N-1].
     243
     244    Output parameters:
     245        InvA - inverse of matrix A + u*v'.
     246
     247      -- ALGLIB --
     248         Copyright 2005 by Bochkanov Sergey
     249    *************************************************************************/
     250    public static void rmatrixinvupdateuv(ref double[,] inva,
     251        int n,
     252        ref double[] u,
     253        ref double[] v) {
     254      double[] t1 = new double[0];
     255      double[] t2 = new double[0];
     256      int i = 0;
     257      int j = 0;
     258      double lambda = 0;
     259      double vt = 0;
     260      int i_ = 0;
     261
     262      t1 = new double[n - 1 + 1];
     263      t2 = new double[n - 1 + 1];
     264
     265      //
     266      // T1 = InvA * U
     267      // Lambda = v * T1
     268      //
     269      for (i = 0; i <= n - 1; i++) {
     270        vt = 0.0;
     271        for (i_ = 0; i_ <= n - 1; i_++) {
     272          vt += inva[i, i_] * u[i_];
     273        }
     274        t1[i] = vt;
     275      }
     276      lambda = 0.0;
     277      for (i_ = 0; i_ <= n - 1; i_++) {
     278        lambda += v[i_] * t1[i_];
     279      }
     280
     281      //
     282      // T2 = v*InvA
     283      //
     284      for (j = 0; j <= n - 1; j++) {
     285        vt = 0.0;
     286        for (i_ = 0; i_ <= n - 1; i_++) {
     287          vt += v[i_] * inva[i_, j];
     288        }
     289        t2[j] = vt;
     290      }
     291
     292      //
     293      // InvA = InvA - correction
     294      //
     295      for (i = 0; i <= n - 1; i++) {
     296        vt = t1[i] / (1 + lambda);
     297        for (i_ = 0; i_ <= n - 1; i_++) {
     298          inva[i, i_] = inva[i, i_] - vt * t2[i_];
     299        }
     300      }
     301    }
     302
     303
     304    public static void shermanmorrisonsimpleupdate(ref double[,] inva,
     305        int n,
     306        int updrow,
     307        int updcolumn,
     308        double updval) {
     309      double[] t1 = new double[0];
     310      double[] t2 = new double[0];
     311      int i = 0;
     312      double lambda = 0;
     313      double vt = 0;
     314      int i_ = 0;
     315
     316      t1 = new double[n + 1];
     317      t2 = new double[n + 1];
     318
     319      //
     320      // T1 = InvA * U
     321      //
     322      for (i_ = 1; i_ <= n; i_++) {
     323        t1[i_] = inva[i_, updrow];
     324      }
     325
     326      //
     327      // T2 = v*InvA
     328      //
     329      for (i_ = 1; i_ <= n; i_++) {
     330        t2[i_] = inva[updcolumn, i_];
     331      }
     332
     333      //
     334      // Lambda = v * InvA * U
     335      //
     336      lambda = updval * inva[updcolumn, updrow];
     337
     338      //
     339      // InvA = InvA - correction
     340      //
     341      for (i = 1; i <= n; i++) {
     342        vt = updval * t1[i];
     343        vt = vt / (1 + lambda);
     344        for (i_ = 1; i_ <= n; i_++) {
     345          inva[i, i_] = inva[i, i_] - vt * t2[i_];
     346        }
     347      }
     348    }
     349
     350
     351    public static void shermanmorrisonupdaterow(ref double[,] inva,
     352        int n,
     353        int updrow,
     354        ref double[] v) {
     355      double[] t1 = new double[0];
     356      double[] t2 = new double[0];
     357      int i = 0;
     358      int j = 0;
     359      double lambda = 0;
     360      double vt = 0;
     361      int i_ = 0;
     362
     363      t1 = new double[n + 1];
     364      t2 = new double[n + 1];
     365
     366      //
     367      // T1 = InvA * U
     368      //
     369      for (i_ = 1; i_ <= n; i_++) {
     370        t1[i_] = inva[i_, updrow];
     371      }
     372
     373      //
     374      // T2 = v*InvA
     375      // Lambda = v * InvA * U
     376      //
     377      for (j = 1; j <= n; j++) {
     378        vt = 0.0;
     379        for (i_ = 1; i_ <= n; i_++) {
     380          vt += v[i_] * inva[i_, j];
     381        }
     382        t2[j] = vt;
     383      }
     384      lambda = t2[updrow];
     385
     386      //
     387      // InvA = InvA - correction
     388      //
     389      for (i = 1; i <= n; i++) {
     390        vt = t1[i] / (1 + lambda);
     391        for (i_ = 1; i_ <= n; i_++) {
     392          inva[i, i_] = inva[i, i_] - vt * t2[i_];
     393        }
     394      }
     395    }
     396
     397
     398    public static void shermanmorrisonupdatecolumn(ref double[,] inva,
     399        int n,
     400        int updcolumn,
     401        ref double[] u) {
     402      double[] t1 = new double[0];
     403      double[] t2 = new double[0];
     404      int i = 0;
     405      double lambda = 0;
     406      double vt = 0;
     407      int i_ = 0;
     408
     409      t1 = new double[n + 1];
     410      t2 = new double[n + 1];
     411
     412      //
     413      // T1 = InvA * U
     414      // Lambda = v * InvA * U
     415      //
     416      for (i = 1; i <= n; i++) {
     417        vt = 0.0;
     418        for (i_ = 1; i_ <= n; i_++) {
     419          vt += inva[i, i_] * u[i_];
     420        }
     421        t1[i] = vt;
     422      }
     423      lambda = t1[updcolumn];
     424
     425      //
     426      // T2 = v*InvA
     427      //
     428      for (i_ = 1; i_ <= n; i_++) {
     429        t2[i_] = inva[updcolumn, i_];
     430      }
     431
     432      //
     433      // InvA = InvA - correction
     434      //
     435      for (i = 1; i <= n; i++) {
     436        vt = t1[i] / (1 + lambda);
     437        for (i_ = 1; i_ <= n; i_++) {
     438          inva[i, i_] = inva[i, i_] - vt * t2[i_];
     439        }
     440      }
     441    }
     442
     443
     444    public static void shermanmorrisonupdateuv(ref double[,] inva,
     445        int n,
     446        ref double[] u,
     447        ref double[] v) {
     448      double[] t1 = new double[0];
     449      double[] t2 = new double[0];
     450      int i = 0;
     451      int j = 0;
     452      double lambda = 0;
     453      double vt = 0;
     454      int i_ = 0;
     455
     456      t1 = new double[n + 1];
     457      t2 = new double[n + 1];
     458
     459      //
     460      // T1 = InvA * U
     461      // Lambda = v * T1
     462      //
     463      for (i = 1; i <= n; i++) {
     464        vt = 0.0;
     465        for (i_ = 1; i_ <= n; i_++) {
     466          vt += inva[i, i_] * u[i_];
     467        }
     468        t1[i] = vt;
     469      }
     470      lambda = 0.0;
     471      for (i_ = 1; i_ <= n; i_++) {
     472        lambda += v[i_] * t1[i_];
     473      }
     474
     475      //
     476      // T2 = v*InvA
     477      //
     478      for (j = 1; j <= n; j++) {
     479        vt = 0.0;
     480        for (i_ = 1; i_ <= n; i_++) {
     481          vt += v[i_] * inva[i_, j];
     482        }
     483        t2[j] = vt;
     484      }
     485
     486      //
     487      // InvA = InvA - correction
     488      //
     489      for (i = 1; i <= n; i++) {
     490        vt = t1[i] / (1 + lambda);
     491        for (i_ = 1; i_ <= n; i_++) {
     492          inva[i, i_] = inva[i, i_] - vt * t2[i_];
     493        }
     494      }
     495    }
     496  }
    550497}
Note: See TracChangeset for help on using the changeset viewer.