繁体   English   中英

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

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

我只是在尝试高斯消元法,以尝试在这种计算梯形形式的特定方法中加快我的工作。

当我尝试运行它时,它不起作用。

我想在这些矩阵上运行这个程序。 你能在下面的矩阵上应用这个程序并告诉我它们给你什么吗?

--[[

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

在以下矩阵上运行这个程序,你会得到什么:

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

多么熟悉的一段代码。

for line in io.lines () do的内部包裹for line in io.lines () do loop in if line ~= '' then ... end以安全地处理空行。

在那之后:

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