Дан двумерный массив (матрица) размером NxN.Реализовать функцию диагонализации матрицы методом Гаусса.Преобразовать матрицу.
Работает ли код корректно?
Код F#
Код:
//open Microsoft.FSharp.Math
//let rnd = System.Random()
#r "FSharp.PowerPack.dll"
//let A = Matrix.init 2 3 (fun i j -> System.Math.Round(rnd.NextDouble()*10., 0))
//Ввод матрицы.
let m : Matrix<float> = matrix [ [ 1.;2.;3.];[5.;5.;6.];[7.;4.;9.]]
//Функция диагонализации матрицы методом Гаусса.
let diagonalize (m:Matrix<float>) =
let nrows = m.NumRows-1
let ncols = m.NumCols-1
let norm j =
(m.Row j) |> Seq.iteri (fun i x -> m.[j,i] <- x / m.[j,j])
let swaprow i j =
let r = m.[i..i,0..ncols]
m.[i..i,0..ncols] <- m.[j..j,0..ncols]
m.[j..j,0..ncols] <- r
let rec swapnz i j =
if j<=nrows then
if m.[j,i]<>0. then swaprow i j
else swapnz i (j+1)
for i = 0 to nrows do
if m.[i,i]=0. then swapnz i (i+1)
if m.[i,i]<>0. then
norm i
for j = i+1 to nrows do
let c = m.[j,i]
for k=i to ncols do m.[j,k] <- m.[j,k]-m.[i,k]*c
m
//Преобразованная матрица
let m2 = diagonalize (m)