简体   繁体   English

如何将高斯消元 lua 程序应用于任何矩阵? Lua 中的数组

[英]How to apply a gaussian elimination lua program to any matrix? Arrays in Lua

I'm just experimenting on Gaussian Elimination to try make my work faster during this specific method for computing echelon form.我只是在尝试高斯消元法,以尝试在这种计算梯形形式的特定方法中加快我的工作。

When I try to run it, it doesn't work.当我尝试运行它时,它不起作用。

I want to run this program on these matrices.我想在这些矩阵上运行这个程序。 Could you apply the program on the matrices below and tell me what they give you ?你能在下面的矩阵上应用这个程序并告诉我它们给你什么吗?

--[[

Gaussian Elimination in Lua

--]]

-- print matrix
local function printmatrix (m)
    for _, row in ipairs (m) do
        io.write (table.concat (row, ', ') .. '\n')
   end
end

-- read matrix in CSV format
local function readcsv (file)
    io.input (file)
    local m = {columns = 0, rectangular = true}
    for line in io.lines () do
        local row = {}
        -- the next line is tricky and goes over all entries in the row
        for w in line:gmatch '[^,]+' do
            row [#row + 1] = tonumber (w) or 0
        end
        m [#m + 1] = row
        -- Update matrix dimensions
        m.rectangular = m.rectangular and (#row == m.columns or #m == 1)
        m.columns = #row > m.columns and #row or m.columns
    end
    return m
end

-- if m[r][c] is zero swap row r with some row i>r to make m[r][c] nonzero, if possible
local function swap (m, r, c)
    local nrows, ncols = #m, m.columns
    if r <= 0 or r > nrows or c <= 0 or c > ncols then error 'Position out of range' end
    if m [r] [c] ~= 0 then
        -- nothing to do
        return
    end
    -- find a suitable row
    local i = r + 1
    while i <= nrows and m [i] [c] == 0 do
        i = i + 1
    end
    if i <= nrows then
        m [r], m [i] = m [i], m [r]
    end
end

-- if m[r][c] is nonzero apply row operations to make each m[i][c]==0 for i>r
local function clear (m, r, c)
    local nrows, ncols = #m, m.columns
    if r <= 0 or r > nrows or c <= 0 or c > ncols then error 'Position out of range' end
    if m [r] [c] == 0 then
        -- nothing to do
        return
    end
    for i = r + 1, nrows do
        local f = m [i] [c] / m [r] [c]
        for j = 1, #m [i] do
            m [i] [j] = m [i] [j] - f * m [r] [j]
        end
    end
end

-- apply Gaussian elimination to m to get it into echelon form
function echelon (m)
    local nrows, ncols = #m, m.columns
    local r, c = 1, 1 -- current position
    while r <= nrows and c <= ncols do
        -- try to get a nonzero value at this position
        swap (m, r, c)
        if m [r] [c] == 0 then
            -- can't, so move right
            c = c + 1
        else
            clear (m, r, c)
            -- done, so move diagonally
            r = r + 1
            c = c + 1
        end
    end
end

local m = readcsv (arg [1])
print 'Original:'
printmatrix (m)
if m.rectangular then
    echelon (m)
    print 'Echelon form:'
    printmatrix (m)
else
    error 'Matrix not rectangular!'
end

Running this program on the following matrices what would you get:在以下矩阵上运行这个程序,你会得到什么:

1,3,5,7
2,1,-1,0
3,4,4,7
5,5,3,7
1, 1, 1, 1, 1
2, 2, 0, 1, 1
3, 3, 1, 2, 1
4, 4, 0, 0, 0
 1, 2, 3, 4, 5, 6, 7, 8, 9
-1,-2,-3,-4,-5,-6,-7,-8,-8
 1, 1, 1, 2, 2, 2, 3, 3, 3
 1, 2, 3, 1, 2, 3, 1, 2, 3
 0,-1,-2,-2,-3,-4,-4,-5,-6
 9, 8, 7, 6, 5, 4, 3, 2, 1

What a familiar piece of code.多么熟悉的一段代码。

Wrap the inside of for line in io.lines () do loop in if line ~= '' then ... end to safely deal with empty lines.for line in io.lines () do的内部包裹for line in io.lines () do loop in if line ~= '' then ... end以安全地处理空行。

After that:在那之后:

alexander@maicube:~$ lua t.lua t1.csv
Original:
1, 3, 5, 7
2, 1, -1, 0
3, 4, 4, 7
5, 5, 3, 7
Echelon form:
1, 3, 5, 7
0, -5, -11, -14
0, 0, 0, 0
0, 0, 0, 0
alexander@maicube:~$ lua t.lua t2.csv
Original:
1, 1, 1, 1, 1
2, 2, 0, 1, 1
3, 3, 1, 2, 1
4, 4, 0, 0, 0
Echelon form:
1, 1, 1, 1, 1
0, 0, -2, -1, -1
0, 0, 0, -2, -2
0, 0, 0, 0, -1
alexander@maicube:~$ lua t.lua t3.csv
Original:
1, 2, 3, 4, 5, 6, 7, 8, 9
-1, -2, -3, -4, -5, -6, -7, -8, -8
1, 1, 1, 2, 2, 2, 3, 3, 3
1, 2, 3, 1, 2, 3, 1, 2, 3
0, -1, -2, -2, -3, -4, -4, -5, -6
9, 8, 7, 6, 5, 4, 3, 2, 1
Echelon form:
1, 2, 3, 4, 5, 6, 7, 8, 9
0, -1, -2, -2, -3, -4, -4, -5, -6
0, 0, 0, -3, -3, -3, -6, -6, -6
0, 0, 0, 0, 0, 0, 0, 0, 1
0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM