#arrays #math #matrix #lua #gaussian
#массивы #математика #матрица #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
Ответ №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, 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