[英]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.