F# Matrix Inversion (1) - Linear Decomposition

Ok, so here is my F# code to perform a linear decomposition of a matrix:

First, let's make up some data:

open System
open System.Collections.Generic
open System.IO
open Xunit
open MathMod
open Microsoft.FSharp.Math

let X = Array2D.zeroCreate<float> 4 4

X.[0,0] <- 4.0
X.[1,0] <- 2.0
X.[2,0] <- 3.0
X.[3,0] <- 9.0

X.[0,1] <- 7.0
X.[1,1] <- 11.0
X.[2,1] <- 3.0
X.[3,1] <- -2.0

X.[0,2] <- -8.0
X.[1,2] <- 2.0
X.[2,2] <- -17.0
X.[3,2] <- 4.0

X.[0,3] <- 6.0
X.[1,3] <- 9.0
X.[2,3] <- 10.0
X.[3,3] <- 5.0

X is just a 4 x 4 array.

We next create a function that takes the X array as an input and does the decomposition, returning both L and U as the Lower and Upper matrices.

let deComp (X : float [,]) (k : int) =
   
    //-------------------------------------------------------
    //Instantiate the Upper and Lower Diagonal Arrays
    //-------------------------------------------------------
    let L = Array2D.zeroCreate<float> (k+1) (k+1)
    let U = Array2D.zeroCreate<float> (k+1) (k+1)

    //Initialize the Diagonal in L
    for j = 0 to k do
        L.[j, j] <- 1.0
   
    //Work over the columns one-by-one
    let L, U, ret = doColumns L U X 0 k
        
    ret, L, U

let liDecomp (X : float [,]) =
    let k, ret = isSquare X
    if ret = -1 then
        deComp X k
    else
        0, X, X 

The function liDecomp is the main function.  The function first checks to make sure that X is in fact square (isSquare is a function that does the checking).  If the X array is square, then deComp performs the decomposition, returning L, U and a return code (ret) to indicate success or failure.  These value are returned in a tuple.

The function isSquare just uses the method .GetUpperbound for both dimensions of X and makes sure they are the same:

//------------------------------------------
//Check to make sure array is square
//------------------------------------------
let isSquare (X : float [,]) =
    let k0 = X.GetUpperBound 0
    let k1 = X.GetUpperBound 1
    let ret =
        if k0 <> k1 then
            0
        else
            -1
    k0, ret

The  function returns the dimension of the matrix, as well 0 or -1 depending if the matrix is square or not.  The values are returned in a tuple.

If the matrix is square, the liDecomp function calls the deComp function.

Let's now look at it:

The deComp function first instantiates the L & U arrays with dimensions k+1, where k+1 is the number of elements for a matrix with an upper bound of k.  We then initialize the main diagonal of L to be all ones.

We then call a function doColumns to iterate over columns of the X matrix.

Here is the doColumns function:

let rec doColumns (L : float [,]) (U : float [,]) (X : float [,]) (j : int) (k : int) =
    match j with
    | j when j > k -> L, U, 0
    | _  -> let L, U, ret = doColumn L U X 0 j k 0
            if ret = 0 then
                doColumns L U X (j+1) k
            else
                L, U, ret

The doColumns function is a recursive function that calls itself, starting with the first column j (initialized equal to 0), and ending when j reaches the total number of columns k.  The column number (j) is incremented in each successive call.  For each value of j, the function calls another function called doColumn.  When j is greater than k, the recursion stops and we return L, U, and a return code (indicating success or failure) in a tuple.  The return code is required to guard against a divide by zero occurrence in the doColumn function

The function doColumn is:

let rec doColumn (L : float [,]) (U : float [,]) (X : float [,]) (i : int) (j : int) (k : int) (ret : int) =
    match i with
    | i when ret <> 0 -> L, U, ret
    | i when i > k -> L, U, ret
    | _ -> let ret0 =
               if i > j then
                    if checkZero U.[j,j] = 0 then
                        L.[i,j] <- doCell L U X i j (j-1) U.[j,j]
                        0
                    else
                        -2
               else
                    if checkZero L.[j,j] = 0 then
                        U.[i,j] <- doCell L U X i j (i-1) L.[j,j]
                        0
                    else
                        -2
           let L, U, xRet = doColumn L U X (i+1) j k ret0
           L, U, xRet

The function takes as input parameters the matrices L, U and X, the row index i (which starts at zero and increments by one as the function is called recursively, the column index j, and the maximum dimension of the array k.  When i hits k, the recursion stops.  The return code ret is also passed in with an initial value of zero.  If we hit a divide by zero occurrence, the value of ret will be set at -2 and the recursion will quit.

The match statement has three parts:

1.  When ret <> 0,  we have a divide by zero, so we just quit and return  whatever is in the matrices Land U and the return code (should be -2)

2.  When i > k, then return the current state of the matrices Land U and the current return code

3.  Otherwise, compute the value for the cell.  Before we calculate the value for a cell, we check to see if the denominator is approximately zero.

We use the function checkZero:

let checkZero (v: float) =
     if Math.Abs(v) < 0.000001 then
          -1
     else
          0

to accomplish this.

We need to first check to see if we are working above or below the main diagonal.  If the row i is equal to or less than the column j, we must be working on the values in the U (upper diagonal) array; for i greater than j we must be working on the values in the L (lower diagonal) array.  For a nonzero denominator, we call the function doCell:

let doCell (L : float [,]) (U : float [,]) (X : float [,]) (i : int) (j : int) (iMx : int) (denom : float)  =
    let xSum = USum L U 0 i j iMx 0.0 
    let aVal = (X.[i,j] - xSum) / denom
    aVal

This function does all the math work and returns the value for the cell in the variable aVal.  The input parameters here are the matrices L, U and X, the row and column indices i & j, as well as the stopping point iMx.  For the L matrix, the stopping point will be j-1; for the U matrix, the stopping point will be i-1.  The value of aVal:

let aVal = (X.[i,j] - xSum) / denom

is the general equation for calculating the value of a cell (see my previous post for the logic behind this).  I use the temporary variable xSum to hold the sum of the products used in the calculation.  I could have substituted out this variable, but I thought the function would be easier to read by using two lines rather than  one.  I could just have easily written:

let aVal = (X.[i,j] - (USum L U 0 i j iMx 0.0)) / denom

instead.

The USum function sums up the cross products between the two arrays, L and U.

let rec USum (L : float [,]) (U : float [,]) (ii : int) (i : int) (j : int) (iMx : int) (v: float) =
    // start at 0 and go to iMx
    // ii is the current index
    match ii with
    | ii when ii > iMx -> 0.0
    | ii when ii = iMx -> v + L.[i,ii] * U.[ii,j]
    | _ -> let tmp = v + L.[i,ii] * U.[ii,j]
           USum L U (ii+1) i j iMx tmp

The USum function takes as inputs the matrices L and U, a row/column index ii, the row and column indices i & j, the stopping point iMx, and an accumulator variable v, initialized with a value of zero.  The index ii runs from zero the maximum value and accumulates the products of the elements of the row i and the column j:

L.[i,ii] * U.[ii,j]

Note that the index ii is used as the column index for the L array and as the row index for the U array.  We also use a placeholder variable tmp to store the result before passing it on to the next recursive call.  Again, we could have written this as:

USum L U (ii+1) i j iMx (v + L.[i,ii] * U.[ii,j])

but it would not be quite as readable.

At last, we are finished with the gory details.  One last thing I want to do is write a function to test it out:

let doDecomp =
    let ret, L, U = liDecomp X

    printfn "ret: %i " ret
   
    let k = X.GetUpperBound 0

    for i = 0 to k do
         printfn "L Matrix: %10.2f %10.2f %10.2f %10.2f " L.[i,0] L.[i,1] L.[i,2] L.[i,3]
   
    for i = 0 to k do
         printfn "U Matrix: %10.2f %10.2f %10.2f %10.2f " U.[i,0] U.[i,1] U.[i,2] U.[i,3]
   
    let zeroX = Array2D.zeroCreate<float> (k+1) (k+1)
    let LU = matMult L U zeroX

    for i = 0 to k do
         printfn "LU Matrix: %10.2f %10.2f %10.2f %10.2f " LU.[i,0] LU.[i,1] LU.[i,2] LU.[i,3]
    
    ret, L, U

This function does the decomposition of X into the matrices L and U and then multiples them to make sure their product does indeed equal out original matrix.  I sure hope I haven't messed up any of the row & column indices, they were quite a pain to keep track of.  So here is the output:

ret: 0
L Matrix:       1.00       0.00       0.00       0.00
L Matrix:       0.50       1.00       0.00       0.00
L Matrix:       0.75      -0.30       1.00       0.00
L Matrix:       2.25      -2.37      -3.93       1.00

U Matrix:       4.00       7.00      -8.00       6.00
U Matrix:       0.00       7.50       6.00       6.00
U Matrix:       0.00       0.00      -9.20       7.30
U Matrix:       0.00       0.00       0.00      34.42

LU Matrix:       4.00       7.00      -8.00       6.00
LU Matrix:       2.00      11.00       2.00       9.00
LU Matrix:       3.00       3.00     -17.00      10.00
LU Matrix:       9.00      -2.00       4.00       5.00

So, what's next?  Calculate the inverse of the matrix from the L & U matrices, of course.  That's the topic of my next post.

-----------------------------------------------------------------------------

Below is the complete sorce code

----------------------------------------------------------------------------- 


#light

open System
open System.Collections.Generic
open System.IO
open Xunit
open MathMod
open Microsoft.FSharp.Math

let X = Array2D.zeroCreate<float> 4 4

X.[0,0] <- 4.0
X.[1,0] <- 2.0
X.[2,0] <- 3.0
X.[3,0] <- 9.0

X.[0,1] <- 7.0
X.[1,1] <- 11.0
X.[2,1] <- 3.0
X.[3,1] <- -2.0

X.[0,2] <- -8.0
X.[1,2] <- 2.0
X.[2,2] <- -17.0
X.[3,2] <- 4.0

X.[0,3] <- 6.0
X.[1,3] <- 9.0
X.[2,3] <- 10.0
X.[3,3] <- 5.0

//------------------------------------------
//Check to make sure array is square
//------------------------------------------
let isSquare (X : float [,]) =
    let k0 = X.GetUpperBound 0
    let k1 = X.GetUpperBound 1
    let ret =
        if k0 <> k1 then
            0
        else
            -1
    k0, ret

//------------------------------------------
//Accumulate cross products
//------------------------------------------
let rec USum (L : float [,]) (U : float [,]) (ii : int) (i : int) (j : int) (iMx : int) (v: float) =
    // start at 0 and go to iMx
    // ii is the current index
    match ii with
    | ii when ii > iMx -> 0.0
    | ii when ii = iMx -> v + L.[i,ii] * U.[ii,j]
    | _ -> let tmp = v + L.[i,ii] * U.[ii,j]
           USum L U (ii+1) i j iMx tmp

//------------------------------------------
//Compute a Cell Value
//------------------------------------------
let doCell (L : float [,]) (U : float [,]) (X : float [,]) (i : int) (j : int) (iMx : int) (denom : float)  =
    //let iMx = j-1
    let xSum = USum L U 0 i j iMx 0.0
    //let aVal = (X.[i,j] - xSum) / U.[j,j]
    let aVal = (X.[i,j] - xSum) / denom
    aVal


//------------------------------------------
//Check for Zero
//The value 0.000001 is arbitrary
//------------------------------------------
let checkZero (v: float) =
     if Math.Abs(v) < 0.000001 then
          -1
     else
          0

//-----------------------------------------------------------
//Calculate the Values for a Column
//Work on the Lower or Upper Matrix depending on the row i
//J is the current column
//k is the maximum array dimension
//-----------------------------------------------------------
let rec doColumn (L : float [,]) (U : float [,]) (X : float [,]) (i : int) (j : int) (k : int) (ret: int) =
    match i with
    | i when ret <> 0 -> L, U, ret
    | i when i > k -> L, U, ret
    | _ -> let ret0 =
               if i > j then
                    if checkZero U.[j,j] = 0 then
                        L.[i,j] <- doCell L U X i j (j-1) U.[j,j]
                        0
                    else
                        -2
               else
                    if checkZero L.[j,j] = 0 then
                        U.[i,j] <- doCell L U X i j (i-1) L.[j,j]
                        0
                    else
                        -2
           let L, U, xRet = doColumn L U X (i+1) j k ret0
           L, U, xRet


//------------------------------------------
//Calculate the Array values, Column by Column
//------------------------------------------
let rec doColumns (L : float [,]) (U : float [,]) (X : float [,]) (j : int) (k : int) =
    match j with
    | j when j > k -> L, U, 0
    | _  -> let L, U, ret = doColumn L U X 0 j k 0
            if ret = 0 then
                doColumns L U X (j+1) k
            else
                L, U, ret

let deComp (X : float [,]) (k : int) =
   
    //-------------------------------------------------------
    //Instantiate the Upper and Lower Diagonal Arrays
    //-------------------------------------------------------
    let L = Array2D.zeroCreate<float> (k+1) (k+1)
    let U = Array2D.zeroCreate<float> (k+1) (k+1)

    //Initialize the Diagonal in L
    for j = 0 to k do
        L.[j, j] <- 1.0
   
    //Work over the columns one-by-one
    let L, U, ret = doColumns L U X 0 k
       
    //let ret = -1
    ret, L, U

let liDecomp (X : float [,]) =
    let k, ret = isSquare X
    if ret = -1 then
        deComp X k
    else
        -1, X, X 

let doDecomp =
    let ret, L, U = liDecomp X

    printfn "ret: %i " ret
   
    let k = X.GetUpperBound 0

    for i = 0 to k do
         //printfn "L Matrix: %10.2f %10.2f %10.2f" L.[i,0] L.[i,1] L.[i,2]
         printfn "L Matrix: %10.2f %10.2f %10.2f %10.2f " L.[i,0] L.[i,1] L.[i,2] L.[i,3]
   
    for i = 0 to k do
         //printfn "U Matrix: %10.2f %10.2f %10.2f " U.[i,0] U.[i,1] U.[i,2]
         printfn "U Matrix: %10.2f %10.2f %10.2f %10.2f " U.[i,0] U.[i,1] U.[i,2] U.[i,3]
   
   
    let userresp = Console.ReadLine()

    ret, L, U

 

 

 

 

Print | posted @ Monday, August 03, 2009 10:49 AM

Comments on this entry:

Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by torrent file at 12/17/2009 12:34 AM

Oh, seems to be my favourite post. It's so informative and much detailed that I can't but read it holding my breath. Research on a linear decomposition of a matrix is the first und uppermost in software developing, to my mind. Go on moving in the same direction. It is sure to be much appreciated.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by www.casino-virtual.com.es at 1/4/2010 5:08 AM

I did my own version of this using recursive functions. It’s a tiny bit longer… five to ten lines more. how to create a set of nested lists out of the $list array:
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by Patent Registration India at 2/19/2010 2:42 AM

row/column index ii, the row and column indices i & j, the stopping point iMx, and an accumulator variable v, initialized with a value of zero.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by vinyl letters at 2/20/2010 1:26 AM

The return code ret is also passed in with an initial value of zero. If we hit a divide by zero occurrence, the value of ret will be set at -2 and the recursion will quit.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by Stainless Steel Cookware Sets at 2/23/2010 2:55 AM

a linear decomposition of a matrix is the first und uppermost in software developing, to my mind. Go on moving in the same direction. It is sure to be much
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by Zoekmachine optimalisatie at 3/10/2010 5:10 AM

Good post....thanks for sharing.. very useful for me i will bookmark this for my future needed. thanks for a great source.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by Top SEO Companies India at 3/10/2010 5:11 AM

Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by vincere alle slot machines at 3/19/2010 3:44 AM

Mathematica is built on Intel's Math Kernel Library but of course well written C will be faster for other reasons.Of course, you are right about the other reasons for choosing a language. 95% of Mathematica's users don't choose it for performance reasons anyway.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by web design orange county at 4/17/2010 2:28 AM

It is like reading encyclopedia and the blog is just any person needs to get the proper knowldges of the matter.
  
Gravatar # Your content is really useful
by dress at 7/15/2010 2:30 AM

and casual dresses on this site
discount wedding dresses
a series of discount Wedding Dresses, Including Wedding gowns, Evening gowns, Wedding Dress, Bridal gowns and Bridal Dress
wedding dresses
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by deexu at 7/16/2010 1:46 AM

great range of Ed Hardy products. Ed Hardy Women's Ellerise Lowrise Sneaker · Ed Hardy Women's
ed hardy jeans, ed hardy hoody, ed hardy shirt, ed hardy clothing, ed hardy cap, ed glasses, ed belts,
women fashion shoes, men's clothes. helping .perhaps you will like
Ed Hardy
Ed Hardy shoes
Ed Hardy shirts
Ed Hardy clothes
Ed Hardy clothing
Ed Hardy shoes
Don Ed Hardy is an American tattoo collector raised in Southern California
Ed Hardy Clothing,Christian Audigier,Ed Hardy Shoes,Ed Hardy Swimwear,Ed Hardy Hat,
ED Hardy Caps
Ed Hardy Sunglasses
Ed Hardy Wallets
EdHardy
Gucci outlet store online, numerous cheap Gucci bags, handbags, wallets, purses, totes, shoes on sale,
cheap prices and authentic qualities
gucci handbags
gucci jewelryREGRTJOPJHIO
  
Gravatar # NFL Jerseys
by NFL Jerseys at 7/20/2010 5:05 AM


hey,you have posted such a effectful article that it will certainly help me.
i love NFL so much,it's so great,this summer,i prepare a gift for myself,best Minnesota Vikings jerseys to support my best stars!
  
Gravatar # shi
by fiwedding at 7/23/2010 3:17 AM

supply in stock and custom lace front wigs, full lace wigs, lace wigs, human hair wigs,
remy lace front wigs, cheap wigs, cheap, buy, celebrity
full lace wigs
lace wigs
lace wigs sale
lace front wigs
synthetic front lace wigs
A Famous Dresses Shop which sell directly Wedding Dresses, Evening Dress, Bridesmaid Dresses,Prom dresses
cheap wedding dresses
cheap evening dresses
cheap prom dresses
cheap evening dresses
cheap prom dresses
Elegant evening dresses are always associated with the brides and their bridesmaids.Shopping for evening dresses and your wedding dress in stylish bridal ..
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by lv handbags at 7/24/2010 5:59 AM

www.weblvonline.com is an online store to collect and supply the most great collection and information of louis vuitton handbags,louis vuitton bags,louis vuitton replica,louis vuitton handbags on sale,discount louis vuitton handbags,replica louis vuitton handbags,cheap louis vuitton handbags ,from men's to women's, also we can help you to find and compare which best fits you. At weblvonline.com you can buy up to 80% OFF on sale, Big Discount and very Cheap Price!

When you are walking on the road and take a Louis Vuitton Handbag, you would be instantly noticed, and admired by women and men beside you. A LV handbag, not only reflect your high sense of fashion, but also represents your status, confidence and prestige. For many people who has a budget, however, a Louis Vuitton bag could be a cost-prohibitive order.Weblvonline.com will meet your all demands and suffice satisfaction, here have most great collection of all designer handbags and wallets, all and high quality knock off designer bag, same as real and authentic handbags, but cheap price.

Authentic quality louis vuitton handbags, we have louis vuitton bags from SURYA, Mahina, CRUISE 2009, Suhali leather, Damier Canvas, Collection Beach, Nomade Leather, Monogram Vernis, Monogram Denim, Monogram MiniLin, Monogram canvas, Monogram Motard, Monogram Limelight etc. We will meet all your designer handbag demands.When you are walking on the road and take a Replica Louis Vuitton, you would be instantly noticed, and admired by women and men beside you. A LV handbag, not only reflect your high sense of fashion, but also represents your status, confidence and prestige. For many people who has a budget, however, a louis vuitton handbags on sale could be a cost-prohibitive order.Weblvonline.com will meet your all demands and suffice satisfaction, here have most great collection of all designer handbags and wallets, all and high quality knock off designer bag, same as real and authentic handbags, but cheap price.

Authentic quality discount louis vuitton handbags, we have replica louis vuitton handbags from SURYA, Mahina, CRUISE 2009, Suhali leather, Damier Canvas, Collection Beach, Nomade Leather, Monogram Vernis, Monogram Denim, Monogram MiniLin, Monogram canvas, Monogram Motard, Monogram Limelight etc. We will meet all your designer handbag demands.

Enjoy your shopping now!

  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by dior belt at 7/28/2010 3:12 AM

dior belts, dior belt, dior belts for men, dior mens belt.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by Louis Vuitton belt at 7/28/2010 11:41 PM

Great quality Louis Vuitton belt, Louis Vuitton Mens belts, Five stars Louis Vuitton belts, Louis Vuitton belts For men.

  
Gravatar # Hermes belts
by Hermes belts at 7/29/2010 6:51 PM

Luxury goods are said to have high income elasticity of demand: as people become wealthier, they will buy more and more of the luxury good. This also means, however, that should there be a decline in income its demand will drop. Income elasticity of demand is not constant with respect to income, and may change sign at different levels of income.
[url=http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/]Hermes belts[/url], [url=http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/]Hermes belt[/url], [url=http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/]Hermes belts for men[/url], [url=http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/">http://hermesbelts.com/" title="http://hermesbelts.com/">http://hermesbelts.com/]Hermes men's belt[/url].
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by agile informatics at 7/29/2010 10:32 PM

the graph coloring problem. We studied the effectiveness of some pre-processings that are specific to the k-colorability problem and that promise to reduce the size or the difficulty of the instances.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by web design services at 8/5/2010 1:59 AM

That was a real pleasure to stay with you altogether and read what you’ve got here.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by Vibram Five Fingers at 8/13/2010 12:52 AM

I am the first time on this site and am really enthusiastic about and so many good articles. I think it’s just very good.
Always yours
Christian Louboutin outlet
Christian Louboutin heels
Christian shoesVibram Five Fingers KSO
Vibram Five Fingers Flow
Vibram Five Fingers KSO Trek
Jimmy Choo Pumps
Jimmy Choo Sandals
Jimmy Choo Slingbacks

  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by cheap handbags at 8/28/2010 7:25 AM

really enthusiastic about and so many good articles. I think it’s just very good.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by cheap jerseys at 8/30/2010 7:44 PM

i know a place where sales cheap nfl jerseys, if you want to buy cheap jerseys, you will find there. just 20$ you can get your own beautiful and quality star's jerseys.
  
Gravatar # nike Air Force 1 Low
by nike Air Force 1 Low at 9/1/2010 6:30 PM

Nike Air Force 1 Low Shoes
  
Gravatar # timberland shoe company
by timberland for you at 9/1/2010 8:20 PM

On a certain cheap timberland boots day at a certain hour, we will pull into the station. Bands will be playing and flags discount timberland boots waving. Once we get there, so many wonderful timberland winter boots dreams will come true and the pieces of our lives will fit together like a completed jigsaw puzzle. How restlessly we pace the aisles, womens timberland boot the minutes for loitering --waiting, waiting, waiting for the station.But uppermost in our timberland shoes store minds is the final destination. On a certain day at a certain hour, we will pull into the station. Bands will be playing and timberland eye boat flags waving. Tucked away in our timberland for you subconscious is an idyllic vision. We see ourselves on a long trip that timberland 6 inch spans the continent. We are traveling by train. Out timberland hiking boots windows, we drink in the passing scene of cars on nearby highways, of children timberland shoe company waving at a crossing, of cattle grazing on a distant timberland boots hillside, of smoke pouring from a power plant, of row upon row of corn and wheat, of flatlands and timberland wheat shoes valleys, of mountains and rolling classic 3 eye timberland boat hillsides, of city skylines and village halls.But uppermost in our black timberland boots minds is the final destination.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by free torrents at 9/2/2010 9:17 AM

really enthusiastic about and so many good articles. I think it’s just very good.
  
Gravatar # re: F# Matrix Inversion (1) - Linear Decomposition
by nannan at 9/3/2010 12:33 AM

BYGYRT GYT Tiffany jewellery
Tiffany
Tiffany & Co
Tiffany Co Bracelets
I came across a story in the WSJ last week (WSJ August 13th) in which some major food companies were warning of a sugar shortage in the US. Excuse me. A sugar shortage? I'm not making this up. Here's the text of the letter
Tiffany Co Charms
Tiffany Co Earrings
Tiffany sale
Tiffany Co Necklaces
Tiffany uk
Tiffany Co Rings
tiffany jewelry
tiffany co
  

Your comment:

Title:
Name:
Email:
Website:
 
Italic Underline Blockquote Hyperlink
 
 
Please add 2 and 3 and type the answer here: