如何解决如何将高斯消除lua程序应用于任何矩阵? 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,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,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,c)
if m [r] [c] == 0 then
-- can't,so move right
c = c + 1
else
clear (m,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,7
5,7
1,1
2,2,1
3,1
4,0
1,6,7,8,9
-1,-2,-3,-4,-5,-6,-7,-8,-8
1,3
1,3
0,-6
9,1
解决方法
一段熟悉的代码。
在for line in io.lines () do
中将if line ~= '' then ... end
循环的内部包裹起来,以安全地处理空行。
之后:
alexander@maicube:~$ lua t.lua t1.csv
Original:
1,3,5,7
2,1,-1,0
3,4,7
5,7
Echelon form:
1,7
0,-5,-11,-14
0,0
0,0
alexander@maicube:~$ lua t.lua t2.csv
Original:
1,1
2,2,1
3,1
4,0
Echelon form:
1,1
0,-2,-1
0,-2
0,-1
alexander@maicube:~$ lua t.lua t3.csv
Original:
1,6,7,8,9
-1,-3,-4,-6,-7,-8,-8
1,3
1,3
0,-6
9,1
Echelon form:
1,9
0,-6
0,0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。