diff options
author | Karl Berry <karl@freefriends.org> | 2023-08-09 20:00:09 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2023-08-09 20:00:09 +0000 |
commit | a430885300765a24f14bc3e947554e2cba5ce513 (patch) | |
tree | 610b75bde19edb57f2abb3323dd74aa1a8d58224 /Master/texmf-dist/tex | |
parent | 41067e11bc8da2a0c710cb6cbc947fbb3811ca67 (diff) |
lualinalg (9aug23)
git-svn-id: svn://tug.org/texlive/trunk@67867 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/lualinalg/lualinalg.sty | 1884 |
1 files changed, 935 insertions, 949 deletions
diff --git a/Master/texmf-dist/tex/lualatex/lualinalg/lualinalg.sty b/Master/texmf-dist/tex/lualatex/lualinalg/lualinalg.sty index b98046f6298..5d3e502a8de 100644 --- a/Master/texmf-dist/tex/lualatex/lualinalg/lualinalg.sty +++ b/Master/texmf-dist/tex/lualatex/lualinalg/lualinalg.sty @@ -1,18 +1,15 @@ - -% The lualinalg package -% Authors: Chetan Shirore and Ajit Kumar -% version 1.5, Date=07-Aug-2023 +% The lualinalg package +% Authors: Chetan Shirore and Ajit Kumar +% Version 1.6, Date=09-Aug-2023 % Licensed under LaTeX Project Public License v1.3c or later. The complete license text is available at http://www.latex-project.org/lppl.txt. - -\ProvidesPackage{lualinalg}[1.5] +\ProvidesPackage{lualinalg}[1.6] \RequirePackage{xkeyval} \RequirePackage{amsmath} \RequirePackage{luamaths} \RequirePackage{luacode} \begin{luacode*} - -- matrices part matrices = {} @@ -21,903 +18,904 @@ matrix = {} --module local matrix_meta = {} function matrix.new(matrix, rows, columns) - if type(rows) == "table" then - for i = 1, #rows do - if #rows[1] ~= #rows[i] then - error("Check input matrix.") - end - end - return setmetatable(rows, matrix_meta) - end - local mtx = {} - if columns == "I" then - for i = 1, rows do - mtx[i] = {} - for j = 1, rows do - if i == j then - mtx[i][j] = 1 - else - mtx[i][j] = 0 - end + if type(rows) == "table" then + for i = 1, #rows do + if #rows[1] ~= #rows[i] then + error("Check input matrix.") + end + end + return setmetatable(rows, matrix_meta) + end + local mtx = {} + if columns == "I" then + for i = 1, rows do + mtx[i] = {} + for j = 1, rows do + if i == j then + mtx[i][j] = 1 + else + mtx[i][j] = 0 end - end - return setmetatable(mtx, matrix_meta) - end + end + end + return setmetatable(mtx, matrix_meta) + end end setmetatable( - matrix, - {__call = function(...) - return matrix.new(...) - end} +matrix, +{__call = function(...) +return matrix.new(...) +end} ) function matrix.add(m1, m2) - local mtx = {} - for i = 1, #m1 do - local m3i = {} - mtx[i] = m3i - for j = 1, #m1[1] do - m3i[j] = m1[i][j] + m2[i][j] - end - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1 do + local m3i = {} + mtx[i] = m3i + for j = 1, #m1[1] do + m3i[j] = m1[i][j] + m2[i][j] + end + end + return setmetatable(mtx, matrix_meta) end + function matrix.sub(m1, m2) - local mtx = {} - for i = 1, #m1 do - local m3i = {} - mtx[i] = m3i - for j = 1, #m1[1] do - m3i[j] = m1[i][j] - m2[i][j] - end - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1 do + local m3i = {} + mtx[i] = m3i + for j = 1, #m1[1] do + m3i[j] = m1[i][j] - m2[i][j] + end + end + return setmetatable(mtx, matrix_meta) end function matrix.mulnum(m1, num) - local mtx = {} - -- multiply elements with number - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m1[1] do - mtx[i][j] = m1[i][j] * num - end - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + -- multiply elements with number + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m1[1] do + mtx[i][j] = m1[i][j] * num + end + end + return setmetatable(mtx, matrix_meta) end function matrix.mul(m1, m2) - local mtx = {} - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m2[1] do - local num = m1[i][1] * m2[1][j] - for n = 2, #m1[1] do - num = num + m1[i][n] * m2[n][j] - end - mtx[i][j] = num - end - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m2[1] do + local num = m1[i][1] * m2[1][j] + for n = 2, #m1[1] do + num = num + m1[i][n] * m2[n][j] + end + mtx[i][j] = num + end + end + return setmetatable(mtx, matrix_meta) end function matrix.swapRows(m1, p, q) - local mtx = {} - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m1[1] do - mtx[i][j] = m1[i][j] - end - end - for j = 1, #m1[1] do - rowHold = m1[p][j] - mtx[p][j] = m1[q][j] - mtx[q][j] = rowHold - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m1[1] do + mtx[i][j] = m1[i][j] + end + end + for j = 1, #m1[1] do + rowHold = m1[p][j] + mtx[p][j] = m1[q][j] + mtx[q][j] = rowHold + end + return setmetatable(mtx, matrix_meta) end function matrix.swapCols(m1, p, q) - local mtx = {} - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m1[1] do - mtx[i][j] = m1[i][j] - end - end - for j = 1, #m1 do - rowHold = m1[j][p] - mtx[j][p] = m1[j][q] - mtx[j][q] = rowHold - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m1[1] do + mtx[i][j] = m1[i][j] + end + end + for j = 1, #m1 do + rowHold = m1[j][p] + mtx[j][p] = m1[j][q] + mtx[j][q] = rowHold + end + return setmetatable(mtx, matrix_meta) end function matrix.mulRow(m1, p, k) - local mtx = {} - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m1[1] do - mtx[i][j] = m1[i][j] - end - end - for j = 1, #m1[1] do - mtx[p][j] = k * m1[p][j] - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m1[1] do + mtx[i][j] = m1[i][j] + end + end + for j = 1, #m1[1] do + mtx[p][j] = k * m1[p][j] + end + return setmetatable(mtx, matrix_meta) end function matrix.mulAddRow(m1, k, p, q) - if p == q then - error("Can't operate on same row.") - end - local mtx = {} - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m1[1] do - mtx[i][j] = m1[i][j] - end - end - for j = 1, #m1[1] do - mtx[q][j] = k * (mtx[p][j]) + mtx[q][j] - end - return setmetatable(mtx, matrix_meta) + if p == q then + error("Can't operate on same row.") + end + local mtx = {} + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m1[1] do + mtx[i][j] = m1[i][j] + end + end + for j = 1, #m1[1] do + mtx[q][j] = k * (mtx[p][j]) + mtx[q][j] + end + return setmetatable(mtx, matrix_meta) end function matrix.mulCol(m1, p, k) - local mtx = {} - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m1[1] do - mtx[i][j] = m1[i][j] - end - end - for j = 1, #m1 do - mtx[j][p] = k * m1[j][p] - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m1[1] do + mtx[i][j] = m1[i][j] + end + end + for j = 1, #m1 do + mtx[j][p] = k * m1[j][p] + end + return setmetatable(mtx, matrix_meta) end function matrix.mulAddCol(m1, k, p, q) - if p == q then - error("Can't operate on same column.") - end - local mtx = {} - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m1[1] do - mtx[i][j] = m1[i][j] - end - end - for j = 1, #m1 do - mtx[j][q] = k * mtx[j][p] + mtx[j][q] - end - return setmetatable(mtx, matrix_meta) + if p == q then + error("Can't operate on same column.") + end + local mtx = {} + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m1[1] do + mtx[i][j] = m1[i][j] + end + end + for j = 1, #m1 do + mtx[j][q] = k * mtx[j][p] + mtx[j][q] + end + return setmetatable(mtx, matrix_meta) end function matrix.transpose(m1) - local mtx = {} - for i = 1, #m1[1] do - mtx[i] = {} - for j = 1, #m1 do - mtx[i][j] = m1[j][i] - end - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1[1] do + mtx[i] = {} + for j = 1, #m1 do + mtx[i][j] = m1[j][i] + end + end + return setmetatable(mtx, matrix_meta) end function matrix.subm(m1, i1, j1, i2, j2) - local mtx = {} - for i = i1, i2 do - local _i = i - i1 + 1 - mtx[_i] = {} - for j = j1, j2 do - local _j = j - j1 + 1 - mtx[_i][_j] = m1[i][j] - end - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = i1, i2 do + local _i = i - i1 + 1 + mtx[_i] = {} + for j = j1, j2 do + local _j = j - j1 + 1 + mtx[_i][_j] = m1[i][j] + end + end + return setmetatable(mtx, matrix_meta) end function matrix.concath(m1, m2) - if #m1 ~= #m2 then - error("No. of rows must be equal.") - end - local mtx = {} - local offset = #m1[1] - for i = 1, #m1 do - mtx[i] = {} - for j = 1, offset do - mtx[i][j] = m1[i][j] - end - for j = 1, #m2[1] do - mtx[i][j + offset] = m2[i][j] - end - end - return setmetatable(mtx, matrix_meta) + if #m1 ~= #m2 then + error("No. of rows must be equal.") + end + local mtx = {} + local offset = #m1[1] + for i = 1, #m1 do + mtx[i] = {} + for j = 1, offset do + mtx[i][j] = m1[i][j] + end + for j = 1, #m2[1] do + mtx[i][j + offset] = m2[i][j] + end + end + return setmetatable(mtx, matrix_meta) end function matrix.concatv(m1, m2) - if #m1[1] ~= #m2[1] then - error("No. of columns must be equal.") - end - local mtx = {} - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m1[1] do - mtx[i][j] = m1[i][j] - end - end - local offset = #mtx - for i = 1, #m2 do - local _i = i + offset - mtx[_i] = {} - for j = 1, #m2[1] do - mtx[_i][j] = m2[i][j] - end - end - return setmetatable(mtx, matrix_meta) + if #m1[1] ~= #m2[1] then + error("No. of columns must be equal.") + end + local mtx = {} + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m1[1] do + mtx[i][j] = m1[i][j] + end + end + local offset = #mtx + for i = 1, #m2 do + local _i = i + offset + mtx[_i] = {} + for j = 1, #m2[1] do + mtx[_i][j] = m2[i][j] + end + end + return setmetatable(mtx, matrix_meta) end function matrix.rows(mtx) - return #mtx + return #mtx end function matrix.columns(mtx) - return #mtx[1] + return #mtx[1] end setmetatable( - matrix, - {__call = function(...) - return matrix.new(...) - end} +matrix, +{__call = function(...) +return matrix.new(...) +end} ) function matrix.getelement(mtx, i, j) - if mtx[i] and mtx[i][j] then - return mtx[i][j] - end + if mtx[i] and mtx[i][j] then + return mtx[i][j] + end end function matrix.setelement(mtx, i, j, value) - if matrix.getelement(mtx, i, j) then - mtx[i][j] = value - return value - end + if matrix.getelement(mtx, i, j) then + mtx[i][j] = value + return value + end end function matrix.invert(m1) - if #m1 ~= #m1[1] then - error("matrix not square") - end - if matrix.det(m1) == 0 then - error("matrix not invertible") - end - local mtx = {} - local idnt = matrix(#m1, "I") - mtx = matrix.subm(matrix.rref(matrix.concath(m1, idnt)), 1, #m1 + 1, #m1, #m1 + #m1) - return mtx + if #m1 ~= #m1[1] then + error("matrix not square") + end + if matrix.det(m1) == 0 then + error("matrix not invertible") + end + local mtx = {} + local idnt = matrix(#m1, "I") + mtx = matrix.subm(matrix.rref(matrix.concath(m1, idnt)), 1, #m1 + 1, #m1, #m1 + #m1) + return mtx end function matrix.trace(m1) - if #m1 ~= #m1[1] then - error("matrix not square") - end - local sum = 0 + if #m1 ~= #m1[1] then + error("matrix not square") + end + local sum = 0 - for i = 1, #m1 do - for j = 1, #m1[1] do - if i == j then - sum = sum + m1[i][j] - end - end - end + for i = 1, #m1 do + for j = 1, #m1[1] do + if i == j then + sum = sum + m1[i][j] + end + end + end - return sum + return sum end function matrix.normF(mtx) - local result = 0 - for i = 1, #mtx do - for j = 1, #mtx[1] do - local e = mtx[i][j] - result = result + complex.abs(complex(e)) ^ 2 - end - end - return complex.sqrt(complex(result)) + local result = 0 + for i = 1, #mtx do + for j = 1, #mtx[1] do + local e = mtx[i][j] + result = result + complex.abs(complex(e)) ^ 2 + end + end + return complex.sqrt(complex(result)) end function matrix.normmax(mtx) - local result = 0 - for i = 1, #mtx do - for j = 1, #mtx[1] do - local e = complex.abs(complex(mtx[i][j])) - if e > result then - result = e - end - end - end - return result + local result = 0 + for i = 1, #mtx do + for j = 1, #mtx[1] do + local e = complex.abs(complex(mtx[i][j])) + if e > result then + result = e + end + end + end + return result end function matrix.norminfty(mtx) - local e = 0 - local result = 0 - for i = 1, #mtx do - local e = 0 - for j = 1, #mtx[1] do - e = e + complex.abs(complex(mtx[i][j])) - end - if e > result then - result = e - end - end - return result + local e = 0 + local result = 0 + for i = 1, #mtx do + local e = 0 + for j = 1, #mtx[1] do + e = e + complex.abs(complex(mtx[i][j])) + end + if e > result then + result = e + end + end + return result end function matrix.norm1(mtx) - local e = 0 - local result = 0 - for i = 1, #mtx[1] do - local e = 0 - for j = 1, #mtx do - e = e + complex.abs(complex(mtx[j][i])) - end - if e > result then - result = e - end - end - return result + local e = 0 + local result = 0 + for i = 1, #mtx[1] do + local e = 0 + for j = 1, #mtx do + e = e + complex.abs(complex(mtx[j][i])) + end + if e > result then + result = e + end + end + return result end function matrix.conjugate(m1) - local mtx = matrix.copy(m1) - for i = 1, #mtx do - for j = 1, #mtx[1] do - mtx[i][j] = complex.conjugate(complex(mtx[i][j])) - end - end - return setmetatable(mtx, matrix_meta) + local mtx = matrix.copy(m1) + for i = 1, #mtx do + for j = 1, #mtx[1] do + mtx[i][j] = complex.conjugate(complex(mtx[i][j])) + end + end + return setmetatable(mtx, matrix_meta) end function matrix.conjugateT(m1) - local mtx = {} - for i = 1, #m1[1] do - mtx[i] = {} - for j = 1, #m1 do - mtx[i][j] = complex.conjugate(complex(m1[j][i])) - end - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1[1] do + mtx[i] = {} + for j = 1, #m1 do + mtx[i][j] = complex.conjugate(complex(m1[j][i])) + end + end + return setmetatable(mtx, matrix_meta) end function copy(x) - return type(x) == "table" and x.copy(x) or x + return type(x) == "table" and x.copy(x) or x end function matrix.pow(m1, num) - assert(num == math.floor(num), "exponent not an integer") - if num == 0 then - return matrix:new(#m1, "I") - end - if num < 0 then - local rank - m1, rank = matrix.invert(m1) - if not m1 then - return m1, rank - end -- singular - num = -num - end - local mtx = matrix.copy(m1) - for i = 2, num do - mtx = matrix.mul(mtx, m1) - end - return mtx + assert(num == math.floor(num), "exponent not an integer") + if num == 0 then + return matrix:new(#m1, "I") + end + if num < 0 then + local rank + m1, rank = matrix.invert(m1) + if not m1 then + return m1, rank + end -- singular + num = -num + end + local mtx = matrix.copy(m1) + for i = 2, num do + mtx = matrix.mul(mtx, m1) + end + return mtx end function matrix.createrandom(nrow, ncol, start, stop) - mtx = {} - for i = 1, nrow do - mtx[i] = {} - for j = 1, ncol do - mtx[i][j] = math.random(start, stop) - mtx[i][j] = mtx[i][j] + math.min(math.random(), math.abs(mtx[i][j] - start), math.abs(stop - mtx[i][j])) - end - end - return setmetatable(mtx, matrix_meta) + mtx = {} + for i = 1, nrow do + mtx[i] = {} + for j = 1, ncol do + mtx[i][j] = math.random(start, stop) + mtx[i][j] = mtx[i][j] + math.min(math.random(), math.abs(mtx[i][j] - start), math.abs(stop - mtx[i][j])) + end + end + return setmetatable(mtx, matrix_meta) end function matrix.process(m1) - --m1=load("return "..m1)() - return matrix.mulnum(m1, 1) + --m1=load("return "..m1)() + return matrix.mulnum(m1, 1) end function matrix.det(m1) - assert(#m1 == #m1[1], "matrix not square") - - local size = #m1 - - if size == 1 then - return m1[1][1] - end - - if size == 2 then - return m1[1][1] * m1[2][2] - m1[2][1] * m1[1][2] - end - - if size == 3 then - return (m1[1][1] * m1[2][2] * m1[3][3] + m1[1][2] * m1[2][3] * m1[3][1] + m1[1][3] * m1[2][1] * m1[3][2] - - m1[1][3] * m1[2][2] * m1[3][1] - - m1[1][1] * m1[2][3] * m1[3][2] - - m1[1][2] * m1[2][1] * m1[3][3]) - end - - local e = m1[1][1] - local zero = type(e) == "table" and e.zero or 0 - local norm2 = type(e) == "table" and e.norm2 or number_norm2 - - local mtx = matrix.copy(m1) - local det = 1 - - for j = 1, #mtx[1] do - local rows = #mtx - local subdet, xrow - for i = 1, rows do - local e = mtx[i][j] - if not subdet then - if e ~= zero then - subdet, xrow = e, i - end - elseif e ~= zero and math.abs(norm2(e) - 1) < math.abs(norm2(subdet) - 1) then - subdet, xrow = e, i + assert(#m1 == #m1[1], "matrix not square") + + local size = #m1 + + if size == 1 then + return m1[1][1] + end + + if size == 2 then + return m1[1][1] * m1[2][2] - m1[2][1] * m1[1][2] + end + + if size == 3 then + return (m1[1][1] * m1[2][2] * m1[3][3] + m1[1][2] * m1[2][3] * m1[3][1] + m1[1][3] * m1[2][1] * m1[3][2] - + m1[1][3] * m1[2][2] * m1[3][1] - + m1[1][1] * m1[2][3] * m1[3][2] - + m1[1][2] * m1[2][1] * m1[3][3]) + end + + local e = m1[1][1] + local zero = type(e) == "table" and e.zero or 0 + local norm2 = type(e) == "table" and e.norm2 or number_norm2 + + local mtx = matrix.copy(m1) + local det = 1 + + for j = 1, #mtx[1] do + local rows = #mtx + local subdet, xrow + for i = 1, rows do + local e = mtx[i][j] + if not subdet then + if e ~= zero then + subdet, xrow = e, i end - end - if subdet then - if xrow ~= rows then - mtx[rows], mtx[xrow] = mtx[xrow], mtx[rows] - det = -det + elseif e ~= zero and math.abs(norm2(e) - 1) < math.abs(norm2(subdet) - 1) then + subdet, xrow = e, i + end + end + if subdet then + if xrow ~= rows then + mtx[rows], mtx[xrow] = mtx[xrow], mtx[rows] + det = -det + end + + for i = 1, rows - 1 do + if mtx[i][j] ~= zero then + local factor = mtx[i][j] / subdet + for n = j + 1, #mtx[1] do + mtx[i][n] = mtx[i][n] - factor * mtx[rows][n] + end end + end + if math.fmod(rows, 2) == 0 then + det = -det + end + det = det * subdet + table.remove(mtx) + else + return det * 0 + end + end - for i = 1, rows - 1 do - if mtx[i][j] ~= zero then - local factor = mtx[i][j] / subdet - for n = j + 1, #mtx[1] do - mtx[i][n] = mtx[i][n] - factor * mtx[rows][n] - end - end - end - if math.fmod(rows, 2) == 0 then - det = -det - end - det = det * subdet - table.remove(mtx) - else - return det * 0 - end - end - - return det + return det end function matrix.copy(m1) - local mtx = {} - for i = 1, #m1 do - mtx[i] = {} - for j = 1, #m1[1] do - mtx[i][j] = m1[i][j] - end - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1 do + mtx[i] = {} + for j = 1, #m1[1] do + mtx[i][j] = m1[i][j] + end + end + return setmetatable(mtx, matrix_meta) end norm2 = type(e) == "table" and e.norm2 or number_norm2 function number_norm2(x) - return x * x + return x * x end function matrix.op(exp) - return load("return " .. exp, exp, "t", matrices)() + return load("return " .. exp, exp, "t", matrices)() end function matrix.rref(mtx) - local mtx = matrix.copy(mtx) - step = 1 - lead = 1 - rowCount = #mtx - columnCount = #mtx[1] - for r = 1, rowCount do - if lead > columnCount then - return mtx - end - i = r - while (mtx[i][lead] == 0) do - i = i + 1 - if (i - 1 == rowCount) then - i = r - if (columnCount == lead) then - return mtx - end - lead = lead + 1 - end - end - - if i ~= r then - mtx = matrix.swapRows(mtx, i, r) - end - - local m = mtx[r][lead] - if (mtx[r][lead] ~= 0) then - for u = 1, columnCount do - mtx[r][u] = mtx[r][u] / m + local mtx = matrix.copy(mtx) + step = 1 + lead = 1 + rowCount = #mtx + columnCount = #mtx[1] + for r = 1, rowCount do + if lead > columnCount then + return mtx + end + i = r + while (mtx[i][lead] == 0) do + i = i + 1 + if (i - 1 == rowCount) then + i = r + if (columnCount == lead) then + return mtx end - end - for i = 1, rowCount do - local m = mtx[i][lead] - if (i ~= r) then - for v = 1, columnCount do - mtx[i][v] = mtx[i][v] + ((-m) * (mtx[r][v])) - end + lead = lead + 1 + end + end + + if i ~= r then + mtx = matrix.swapRows(mtx, i, r) + end + + local m = mtx[r][lead] + if (mtx[r][lead] ~= 0) then + for u = 1, columnCount do + mtx[r][u] = mtx[r][u] / m + end + end + for i = 1, rowCount do + local m = mtx[i][lead] + if (i ~= r) then + for v = 1, columnCount do + mtx[i][v] = mtx[i][v] + ((-m) * (mtx[r][v])) end - end - lead = lead + 1 - end - return mtx + end + end + lead = lead + 1 + end + return mtx end function matrix.rref0E(mtx, fom, dignum) - local strng = "" - truncate = truncate or 6 - local mtx = matrix.copy(mtx) - step = 1 - lead = 1 - stepCnt = 0 - rowCount = #mtx - columnCount = #mtx[1] - for r = 1, rowCount do - if lead > columnCount then - return mtx - end - i = r - while (mtx[i][lead] == 0) do - i = i + 1 - if (i - 1 == rowCount) then - i = r - if (columnCount == lead) then - if stepCnt == 0 then - stepCnt = stepCnt + 1 - strng = strng .. "Step " .. tostring(stepCnt) ".$$" .. tostring(matrix.show(mtx, fom, dignum)) - return strng - end - return strng - end - lead = lead + 1 + local strng = "" + truncate = truncate or 6 + local mtx = matrix.copy(mtx) + step = 1 + lead = 1 + stepCnt = 0 + rowCount = #mtx + columnCount = #mtx[1] + for r = 1, rowCount do + if lead > columnCount then + return mtx + end + i = r + while (mtx[i][lead] == 0) do + i = i + 1 + if (i - 1 == rowCount) then + i = r + if (columnCount == lead) then + if stepCnt == 0 then + stepCnt = stepCnt + 1 + strng = strng .. "Step " .. tostring(stepCnt) ".$$" .. tostring(matrix.show(mtx, fom, dignum)) + return strng + end + return strng end - end - - if i ~= r then - mtx = matrix.swapRows(mtx, i, r) - stepCnt = stepCnt + 1 - strng = - strng .. - "Step " .. - tostring(stepCnt) .. - ": Interchange rows " .. - tostring(i) .. - " and " .. tostring(r) .. ".$$" .. tostring(matrix.show(mtx, fom, dignum)) .. "$$" - end - - local m = mtx[r][lead] - if (mtx[r][lead] ~= 0) then - for u = 1, columnCount do - mtx[r][u] = mtx[r][u] / m + lead = lead + 1 + end + end + + if i ~= r then + mtx = matrix.swapRows(mtx, i, r) + stepCnt = stepCnt + 1 + strng = + strng .. + "Step " .. + tostring(stepCnt) .. + ": Interchange rows " .. + tostring(i) .. + " and " .. tostring(r) .. ".$$" .. tostring(matrix.show(mtx, fom, dignum)) .. "$$" + end + + local m = mtx[r][lead] + if (mtx[r][lead] ~= 0) then + for u = 1, columnCount do + mtx[r][u] = mtx[r][u] / m + end + if m ~= 1.0 then + if m ~= complex("1.0") then + stepCnt = stepCnt + 1 + strng = + strng .. + "Step " .. + tostring(stepCnt) .. + ": Divide row " .. + tostring(r) .. + " by $" .. + tostring(complex.round(complex(m), dignum)) .. + "$.$$" .. tostring(matrix.show(mtx, fom, dignum)) .. "$$" end - if m ~= 1.0 then - if m ~= complex("1.0") then - stepCnt = stepCnt + 1 - strng = - strng .. - "Step " .. - tostring(stepCnt) .. - ": Divide row " .. - tostring(r) .. - " by $" .. - tostring(complex.round(complex(m), dignum)) .. - "$.$$" .. tostring(matrix.show(mtx, fom, dignum)) .. "$$" - end + end + end + for i = 1, rowCount do + local m = mtx[i][lead] + if (i ~= r) then + for v = 1, columnCount do + mtx[i][v] = mtx[i][v] + ((-m) * (mtx[r][v])) end - end - for i = 1, rowCount do - local m = mtx[i][lead] - if (i ~= r) then - for v = 1, columnCount do - mtx[i][v] = mtx[i][v] + ((-m) * (mtx[r][v])) - end - if m ~= 0 then - if m ~= complex("0.0") then - stepCnt = stepCnt + 1 - strng = - strng .. - "Step " .. - tostring(stepCnt) .. - ": Multiply row " .. - tostring(r) .. - " by $" .. - tostring(complex.round(complex(m), dignum)) .. - "$ and subtract it from row " .. - tostring(i) .. - ".$$" .. tostring(matrix.show(mtx, fom, dignum)) .. "$$" - end - end + if m ~= 0 then + if m ~= complex("0.0") then + stepCnt = stepCnt + 1 + strng = + strng .. + "Step " .. + tostring(stepCnt) .. + ": Multiply row " .. + tostring(r) .. + " by $" .. + tostring(complex.round(complex(m), dignum)) .. + "$ and subtract it from row " .. + tostring(i) .. + ".$$" .. tostring(matrix.show(mtx, fom, dignum)) .. "$$" + end end - end - lead = lead + 1 - end - return strng + end + end + lead = lead + 1 + end + return strng end function matrix.GaussJordan(mtx, augmt) - local mtx = matrix.copy(mtx) - local augmt = matrix.copy(augmt) - step = 1 - lead = 1 - rowCount = #mtx - columnCount = #mtx[1] - for r = 1, rowCount do - if lead > columnCount then - return matrix.concath(mtx, augmt) - end - i = r - while (mtx[i][lead] == 0) do - i = i + 1 - if (i - 1 == rowCount) then - i = r - if (columnCount == lead) then - return matrix.concath(mtx, augmt) - end - lead = lead + 1 + local mtx = matrix.copy(mtx) + local augmt = matrix.copy(augmt) + step = 1 + lead = 1 + rowCount = #mtx + columnCount = #mtx[1] + for r = 1, rowCount do + if lead > columnCount then + return matrix.concath(mtx, augmt) + end + i = r + while (mtx[i][lead] == 0) do + i = i + 1 + if (i - 1 == rowCount) then + i = r + if (columnCount == lead) then + return matrix.concath(mtx, augmt) end - end - - if i ~= r then - mtx = matrix.swapRows(mtx, i, r) - augmt = matrix.swapRows(augmt, i, r) - end - - local m = mtx[r][lead] - if (mtx[r][lead] ~= 0) then - for u = 1, columnCount do - mtx[r][u] = mtx[r][u] / m - end - augmt[r][1] = augmt[r][1] / m - end - for i = 1, rowCount do - local m = mtx[i][lead] - if (i ~= r) then - for v = 1, columnCount do - mtx[i][v] = mtx[i][v] - m * mtx[r][v] - end - augmt[i][1] = augmt[i][1] - m * augmt[r][1] + lead = lead + 1 + end + end + + if i ~= r then + mtx = matrix.swapRows(mtx, i, r) + augmt = matrix.swapRows(augmt, i, r) + end + + local m = mtx[r][lead] + if (mtx[r][lead] ~= 0) then + for u = 1, columnCount do + mtx[r][u] = mtx[r][u] / m + end + augmt[r][1] = augmt[r][1] / m + end + for i = 1, rowCount do + local m = mtx[i][lead] + if (i ~= r) then + for v = 1, columnCount do + mtx[i][v] = mtx[i][v] - m * mtx[r][v] end - end - lead = lead + 1 - end - return matrix.concath(mtx, augmt) + augmt[i][1] = augmt[i][1] - m * augmt[r][1] + end + end + lead = lead + 1 + end + return matrix.concath(mtx, augmt) end function matrix.gauss0E(mtx, augmt, fom, dignum) - local strng = "" - truncate = truncate or 6 - local mtx = matrix.copy(mtx) - local augmt = matrix.copy(augmt) - if matrix.columns(augmt) ~= 1 then - error("The second matrix should have only 1 column.") - end - step = 1 - lead = 1 - stepCnt = 0 - rowCount = #mtx - columnCount = #mtx[1] - for r = 1, rowCount do - if lead > columnCount then - return mtx - end - i = r - while (mtx[i][lead] == 0) do - i = i + 1 - if (i - 1 == rowCount) then - i = r - if (columnCount == lead) then - if stepCnt == 0 then - stepCnt = stepCnt + 1 - strng = - strng .. - "Step " .. - tostring(stepCnt) ".$$" .. - tostring(matrix.show(matrix.concath(mtx, augmt), fom, dignum)) - return strng - end - return strng - end - lead = lead + 1 + local strng = "" + truncate = truncate or 6 + local mtx = matrix.copy(mtx) + local augmt = matrix.copy(augmt) + if matrix.columns(augmt) ~= 1 then + error("The second matrix should have only 1 column.") + end + step = 1 + lead = 1 + stepCnt = 0 + rowCount = #mtx + columnCount = #mtx[1] + for r = 1, rowCount do + if lead > columnCount then + return mtx + end + i = r + while (mtx[i][lead] == 0) do + i = i + 1 + if (i - 1 == rowCount) then + i = r + if (columnCount == lead) then + if stepCnt == 0 then + stepCnt = stepCnt + 1 + strng = + strng .. + "Step " .. + tostring(stepCnt) ".$$" .. + tostring(matrix.show(matrix.concath(mtx, augmt), fom, dignum)) + return strng + end + return strng end - end - - if i ~= r then - mtx = matrix.swapRows(mtx, i, r) - augmt = matrix.swapRows(augmt, i, r) - stepCnt = stepCnt + 1 - strng = - strng .. - "Step " .. - tostring(stepCnt) .. - ": Interchange rows " .. - tostring(i) .. - " and " .. tostring(r) .. ".$$" .. tostring(matrix.show(mtx, fom, dignum)) .. "$$" - end - - local m = mtx[r][lead] - if (mtx[r][lead] ~= 0) then - for u = 1, columnCount do - mtx[r][u] = mtx[r][u] / m + lead = lead + 1 + end + end + + if i ~= r then + mtx = matrix.swapRows(mtx, i, r) + augmt = matrix.swapRows(augmt, i, r) + stepCnt = stepCnt + 1 + strng = + strng .. + "Step " .. + tostring(stepCnt) .. + ": Interchange rows " .. + tostring(i) .. + " and " .. tostring(r) .. ".$$" .. tostring(matrix.show(mtx, fom, dignum)) .. "$$" + end + + local m = mtx[r][lead] + if (mtx[r][lead] ~= 0) then + for u = 1, columnCount do + mtx[r][u] = mtx[r][u] / m + end + augmt[r][1] = augmt[r][1] / m + if m ~= 1.0 then + if m ~= complex("1.0") then + stepCnt = stepCnt + 1 + strng = + strng .. + "Step " .. + tostring(stepCnt) .. + ": Divide row " .. + tostring(r) .. + " by $" .. + tostring(complex.round(complex(m), dignum)) .. + "$. $$" .. + tostring(matrix.show(matrix.concath(mtx, augmt), fom, dignum)) .. + "$$" end - augmt[r][1] = augmt[r][1] / m - if m ~= 1.0 then - if m ~= complex("1.0") then - stepCnt = stepCnt + 1 - strng = - strng .. - "Step " .. - tostring(stepCnt) .. - ": Divide row " .. - tostring(r) .. - " by $" .. - tostring(complex.round(complex(m), dignum)) .. - "$. $$" .. - tostring(matrix.show(matrix.concath(mtx, augmt), fom, dignum)) .. - "$$" - end + end + end + for i = 1, rowCount do + local m = mtx[i][lead] + if (i ~= r) then + for v = 1, columnCount do + mtx[i][v] = mtx[i][v] - m * mtx[r][v] end - end - for i = 1, rowCount do - local m = mtx[i][lead] - if (i ~= r) then - for v = 1, columnCount do - mtx[i][v] = mtx[i][v] - m * mtx[r][v] - end - augmt[i][1] = augmt[i][1] - m * augmt[r][1] - if m ~= 0 then - if m ~= complex("0.0") then - stepCnt = stepCnt + 1 - strng = - strng .. - "Step " .. - tostring(stepCnt) .. - ": Multiply row " .. - tostring(r) .. - " by $" .. - tostring(complex.round(complex(m), dignum)) .. - "$ and subtract it from row " .. - tostring(i) .. - ".$$" .. - tostring( - matrix.show(matrix.concath(mtx, augmt), fom, dignum) - ) .. - "$$" - end - end + augmt[i][1] = augmt[i][1] - m * augmt[r][1] + if m ~= 0 then + if m ~= complex("0.0") then + stepCnt = stepCnt + 1 + strng = + strng .. + "Step " .. + tostring(stepCnt) .. + ": Multiply row " .. + tostring(r) .. + " by $" .. + tostring(complex.round(complex(m), dignum)) .. + "$ and subtract it from row " .. + tostring(i) .. + ".$$" .. + tostring( + matrix.show(matrix.concath(mtx, augmt), fom, dignum) + ) .. + "$$" + end end - end - lead = lead + 1 - end - return strng + end + end + lead = lead + 1 + end + return strng end function matrix.rank(m1) - local mtx = {} - mtx = matrix.rref(m1) - rank = #mtx - for i = 1, #mtx do - if CheckEqual(mtx[i], 0) then - rank = rank - 1 - end - end - return rank + local mtx = {} + mtx = matrix.rref(m1) + rank = #mtx + for i = 1, #mtx do + if CheckEqual(mtx[i], 0) then + rank = rank - 1 + end + end + return rank end function CheckEqual(Values, Number) - local CheckEqual = true - local i = 1 + local CheckEqual = true + local i = 1 - while (CheckEqual and (i <= #Values)) do - if Values[i] == Number then - i = i + 1 - else - CheckEqual = false - end - end + while (CheckEqual and (i <= #Values)) do + if Values[i] == Number then + i = i + 1 + else + CheckEqual = false + end + end - return CheckEqual + return CheckEqual end function matrix.replace(m1, func, ...) - local mtx = {} - for i = 1, #m1 do - local m1i = m1[i] - local mtxi = {} - for j = 1, #m1i do - mtxi[j] = func(m1i[j], ...) - end - mtx[i] = mtxi - end - return setmetatable(mtx, matrix_meta) + local mtx = {} + for i = 1, #m1 do + local m1i = m1[i] + local mtxi = {} + for j = 1, #m1i do + mtxi[j] = func(m1i[j], ...) + end + mtx[i] = mtxi + end + return setmetatable(mtx, matrix_meta) end function matrix.show(mtx, format, dig) - mtx = matrix.process(mtx) - local format = format or "bmatrix" - local dig = dig or 6 - local str = "\\begin{" .. format .. "}" - for i = 1, #mtx do - str = str .. "\t" .. complex.round(complex(mtx[i][1]), dig) - for j = 2, #mtx[1] do - str = str .. " & " .. complex.round(complex(mtx[i][j]), dig) - end - if i == #mtx then - str = str .. " \\\\ " - else - str = str .. " \\\\ " - end - end - return str .. "\\end{" .. format .. "} " + mtx = matrix.process(mtx) + local format = format or "bmatrix" + local dig = dig or 6 + local str = "\\begin{" .. format .. "}" + for i = 1, #mtx do + str = str .. "\t" .. complex.round(complex(mtx[i][1]), dig) + for j = 2, #mtx[1] do + str = str .. " & " .. complex.round(complex(mtx[i][j]), dig) + end + if i == #mtx then + str = str .. " \\\\ " + else + str = str .. " \\\\ " + end + end + return str .. "\\end{" .. format .. "} " end matrix_meta.__tostring = function(...) - return matrix.show(...) + return matrix.show(...) end matrix_meta.__add = function(...) - return matrix.add(...) + return matrix.add(...) end matrix_meta.__sub = function(...) - return matrix.sub(...) + return matrix.sub(...) end matrix_meta.__mul = function(m1, m2) - if getmetatable(m1) ~= matrix_meta then - return matrix.mulnum(m2, m1) - elseif getmetatable(m2) ~= matrix_meta then - return matrix.mulnum(m1, m2) - end - return matrix.mul(m1, m2) + if getmetatable(m1) ~= matrix_meta then + return matrix.mulnum(m2, m1) + elseif getmetatable(m2) ~= matrix_meta then + return matrix.mulnum(m1, m2) + end + return matrix.mul(m1, m2) end matrix_meta.__div = function(m1, m2) - if getmetatable(m1) ~= matrix_meta then - return matrix.mulnum(matrix.invert(m2), m1) - elseif getmetatable(m2) ~= matrix_meta then - return matrix.divnum(m1, m2) - end - return matrix.div(m1, m2) + if getmetatable(m1) ~= matrix_meta then + return matrix.mulnum(matrix.invert(m2), m1) + elseif getmetatable(m2) ~= matrix_meta then + return matrix.divnum(m1, m2) +end + return matrix.div(m1, m2) end matrix_meta.__unm = function(mtx) - return matrix.mulnum(mtx, -1) + return matrix.mulnum(mtx, -1) end local option = { - ["*"] = function(m1) - return matrix.conjugate(m1) - end, - ["T"] = function(m1) - return matrix.transpose(m1) - end + ["*"] = function(m1) + return matrix.conjugate(m1) +end, +["T"] = function(m1) + return matrix.transpose(m1) +end } matrix_meta.__pow = function(m1, opt) - return option[opt] and option[opt](m1) or matrix.pow(m1, opt) + return option[opt] and option[opt](m1) or matrix.pow(m1, opt) end -- vector part @@ -950,10 +948,10 @@ function vector.new(vector, rows, columns, n) end setmetatable( - vector, - {__call = function(...) - return vector.new(...) - end} +vector, +{__call = function(...) +return vector.new(...) +end} ) function vector.add(v1, v2) @@ -1241,9 +1239,9 @@ end vector_meta.__mul = function(v1, v2) if getmetatable(v1) ~= vector_meta then - return vector.mulnum(v2, v1) + return vector.mulnum(v2, v1) elseif getmetatable(v2) ~= vector_meta then - return vector.mulnum(v1, v2) + return vector.mulnum(v1, v2) end return vector.dot(v1, v2) end @@ -1259,9 +1257,9 @@ end % matrix latex commands \newcommand\matrixNew[2]{% - \directlua{% - matrices['#1'] = matrix(#2) - }% +\directlua{% +matrices['#1'] = matrix(#2) +}% } % ========= KEY DEFINITIONS ========= @@ -1271,222 +1269,210 @@ end \setkeys{matrixop}{type=bmatrix,truncate=6}% \newcommand{\matrixPrint}[2][]{% - \begingroup% - \setkeys{matrixop}{#1} - \directlua{tex.sprint(matrix.show(matrices['#2'],"\mop@type",\mop@truncate))} - % - \endgroup% +\begingroup% +\setkeys{matrixop}{#1} +\directlua{tex.sprint(matrix.show(matrices['#2'],"\mop@type",\mop@truncate))} +% +\endgroup% } \newcommand\matrixOp[2]{% - \directlua{% - matrices['#1'] = matrix.op('#2') - }% +\directlua{% +matrices['#1'] = matrix.op('#2') +}% } \newcommand\matrixAdd[3]{% - \directlua{% - matrices['#1'] = matrix.add(matrices['#2'],matrices['#3']) - }% +\directlua{% +matrices['#1'] = matrix.add(matrices['#2'],matrices['#3']) +}% } \newcommand\matrixSub[3]{% - \directlua{% - matrices['#1'] = matrix.sub(matrices['#2'],matrices['#3']) - }% +\directlua{% +matrices['#1'] = matrix.sub(matrices['#2'],matrices['#3']) +}% } \newcommand\matrixMulNum[3]{% - \directlua{% - matrices['#1'] = matrix.mulnum(matrices['#3'],#2) - }% +\directlua{% +matrices['#1'] = matrix.mulnum(matrices['#3'],#2) +}% } \newcommand\matrixMul[3]{% - \directlua{% - matrices['#1'] = matrix.mul(matrices['#2'],matrices['#3']) - }% +\directlua{% +matrices['#1'] = matrix.mul(matrices['#2'],matrices['#3']) +}% } \newcommand\matrixSwapRows[4]{% - \directlua{% - matrices['#1'] = matrix.swapRows(matrices['#2'],#3,#4) - }% +\directlua{% +matrices['#1'] = matrix.swapRows(matrices['#2'],#3,#4) +}% } \newcommand\matrixSwapCols[4]{% - \directlua{% - matrices['#1'] = matrix.swapCols(matrices['#2'],#3,#4) - }% +\directlua{% +matrices['#1'] = matrix.swapCols(matrices['#2'],#3,#4) +}% } \newcommand\matrixMulRow[4]{% - \directlua{% - matrices['#1'] = matrix.mulRow(matrices['#2'],#3,#4) - }% +\directlua{% +matrices['#1'] = matrix.mulRow(matrices['#2'],#3,#4) +}% } \newcommand\matrixMulCol[4]{% - \directlua{% - matrices['#1'] = matrix.mulCol(matrices['#2'],#3,#4) - }% +\directlua{% +matrices['#1'] = matrix.mulCol(matrices['#2'],#3,#4) +}% } \newcommand\matrixMulAddRow[5]{% - \directlua{% - matrices['#1'] = matrix.mulAddRow(matrices['#2'],#4,#3,#5) - }% +\directlua{% +matrices['#1'] = matrix.mulAddRow(matrices['#2'],#4,#3,#5) +}% } \newcommand\matrixMulAddCol[5]{% - \directlua{% - matrices['#1'] = matrix.mulAddCol(matrices['#2'],#4,#3,#5) - }% +\directlua{% +matrices['#1'] = matrix.mulAddCol(matrices['#2'],#4,#3,#5) +}% } \newcommand\matrixTranspose[2]{% - \directlua{% - matrices['#1'] = matrix.transpose(matrices['#2']) - }% +\directlua{% +matrices['#1'] = matrix.transpose(matrices['#2']) +}% } \newcommand\matrixSubmatrix[6]{% - \directlua{% - matrices['#1'] = matrix.subm(matrices['#2'],#3,#4,#5,#6) - }% +\directlua{% +matrices['#1'] = matrix.subm(matrices['#2'],#3,#4,#5,#6) +}% } \newcommand\matrixConcatH[3]{% - \directlua{% - matrices['#1'] = matrix.concath(matrices['#2'],matrices['#3']) - }% +\directlua{% +matrices['#1'] = matrix.concath(matrices['#2'],matrices['#3']) +}% } \newcommand\matrixConcatV[3]{% - \directlua{% - matrices['#1'] = matrix.concatv(matrices['#2'],matrices['#3']) - }% +\directlua{% +matrices['#1'] = matrix.concatv(matrices['#2'],matrices['#3']) +}% } \newcommand\matrixNumRows[1]{% - \directlua{% - tex.sprint(tostring(matrix.rows(matrices['#1']))) - }% +\directlua{% +tex.sprint(tostring(matrix.rows(matrices['#1']))) +}% } \newcommand\matrixNumCols[1]{% - \directlua{% - tex.sprint(tostring(matrix.columns(matrices['#1']))) - }% +\directlua{% +tex.sprint(tostring(matrix.columns(matrices['#1']))) +}% } \newcommand\matrixGetElement[3]{% - \directlua{% - tex.sprint(tostring(matrix.getelement(matrices['#1'],#2,#3))) - }% +\directlua{% +tex.sprint(tostring(matrix.getelement(matrices['#1'],#2,#3))) +}% } \newcommand\matrixSetElement[4]{% - \directlua{% - matrix.setelement(matrices['#1'],#2,#3,#4) - }% +\directlua{% +matrix.setelement(matrices['#1'],#2,#3,#4) +}% } \newcommand\matrixInvert[2]{% - \directlua{% - matrices['#1'] = matrix.invert(matrices['#2']) - }% +\directlua{% +matrices['#1'] = matrix.invert(matrices['#2']) +}% } \newcommand\matrixPow[3]{% - \directlua{% - matrices['#1'] = matrix.pow(matrices['#2'],#3) - }% +\directlua{% +matrices['#1'] = matrix.pow(matrices['#2'],#3) +}% } \newcommand\matrixCreateRandom[5]{% - \directlua{% - matrices['#1'] = matrix.createrandom(#2,#3,#4,#5) - }% +\directlua{% +matrices['#1'] = matrix.createrandom(#2,#3,#4,#5) +}% } \newcommand\matrixDet[1]{% - \directlua{% - tex.sprint(tostring(matrix.det(matrices['#1']))) - }% +\directlua{% +tex.sprint(tostring(matrix.det(matrices['#1']))) +}% } \newcommand\matrixTrace[1]{% - \directlua{% - tex.sprint(tostring(matrix.trace(matrices['#1']))) - }% +\directlua{% +tex.sprint(tostring(matrix.trace(matrices['#1']))) +}% } \newcommand\matrixNormOne[1]{% - \directlua{% - tex.sprint(tostring(matrix.norm1(matrices['#1']))) - }% +\directlua{% +tex.sprint(tostring(matrix.norm1(matrices['#1']))) +}% } \newcommand\matrixNormInfty[1]{% - \directlua{% - tex.sprint(tostring(matrix.norminfty(matrices['#1']))) - }% +\directlua{% +tex.sprint(tostring(matrix.norminfty(matrices['#1']))) +}% } \newcommand\matrixNormMax[1]{% - \directlua{% - tex.sprint(tostring(matrix.normmax(matrices['#1']))) - }% +\directlua{% +tex.sprint(tostring(matrix.normmax(matrices['#1']))) +}% } \newcommand\matrixNormF[1]{% - \directlua{% - tex.sprint(tostring(matrix.normF(matrices['#1']))) - }% +\directlua{% +tex.sprint(tostring(matrix.normF(matrices['#1']))) +}% } \newcommand\matrixCopy[2]{% - \directlua{% - matrices['#1'] = matrix.copy(matrices['#2']) - }% +\directlua{% +matrices['#1'] = matrix.copy(matrices['#2']) +}% } \newcommand\matrixRREF[2]{% - \directlua{% - matrices['#1'] = matrix.rref(matrices['#2']) - }% +\directlua{% +matrices['#1'] = matrix.rref(matrices['#2']) +}% } \newcommand\matrixConjugate[2]{% - \directlua{% - matrices['#1'] = matrix.conjugate(matrices['#2']) - }% +\directlua{% +matrices['#1'] = matrix.conjugate(matrices['#2']) +}% } \newcommand\matrixConjugateT[2]{% - \directlua{% - matrices['#1'] = matrix.conjugateT(matrices['#2']) - }% +\directlua{% +matrices['#1'] = matrix.conjugateT(matrices['#2']) +}% } \newcommand\matrixRank[1]{% - \directlua{% - tex.sprint(tostring(matrix.rank(matrices['#1']))) - }% -} - -\newcommand\matrixRREFERR[1]{% - \directlua{% - tex.sprint(tostring(matrix.rref0E(matrices['#1']))) - }% -} - -\newcommand\matrixRREFE[1]{% - \directlua{% - tex.sprint(tostring(matrix.rref0E(matrices['#1']))) - }% +\directlua{% +tex.sprint(tostring(matrix.rank(matrices['#1']))) +}% } % ========= KEY DEFINITIONS ========= @@ -1497,35 +1483,35 @@ end \setkeys{matrixrr}{type=bmatrix,truncate=6}% \newcommand{\matrixRREFSteps}[2][]{% - \begingroup% - \setkeys{matrixrr}{#1} - \directlua{% - tex.sprint(matrix.rref0E(matrices['#2'],"\moprr@type",\moprr@truncate))} - % - \endgroup% +\begingroup% +\setkeys{matrixrr}{#1} +\directlua{% +tex.sprint(matrix.rref0E(matrices['#2'],"\moprr@type",\moprr@truncate))} +% +\endgroup% } \newcommand\matrixGaussJordan[3]{% - \directlua{% - matrices['#1'] = matrix.GaussJordan(matrices['#2'],matrices['#3']) - }% +\directlua{% +matrices['#1'] = matrix.GaussJordan(matrices['#2'],matrices['#3']) +}% } \newcommand{\matrixGaussJordanSteps}[3][]{% - \begingroup% - \setkeys{matrixrr}{#1} - \directlua{% - tex.sprint(matrix.gauss0E(matrices['#2'],matrices['#3'],"\moprr@type",\moprr@truncate))} - % - \endgroup% +\begingroup% +\setkeys{matrixrr}{#1} +\directlua{% +tex.sprint(matrix.gauss0E(matrices['#2'],matrices['#3'],"\moprr@type",\moprr@truncate))} +% +\endgroup% } % vector latex commands \newcommand\vectorNew[2]{% - \directlua{% - vectors['#1'] = vector(#2) - }% +\directlua{% +vectors['#1'] = vector(#2) +}% } % ========= KEY DEFINITIONS ========= @@ -1535,107 +1521,107 @@ end \setkeys{vectorop}{truncate=6}% \newcommand{\vectorPrint}[2][]{% - \begingroup% - \setkeys{vectorop}{#1} - \directlua{tex.sprint(vector.show(vectors['#2'],\vop@truncate))} - % - \endgroup% +\begingroup% +\setkeys{vectorop}{#1} +\directlua{tex.sprint(vector.show(vectors['#2'],\vop@truncate))} +% +\endgroup% } \newcommand\vectorParse[1]{% - \directlua{% - tex.sprint(tostring(vector.parse(vectors['#1']))) - }% +\directlua{% +tex.sprint(tostring(vector.parse(vectors['#1']))) +}% } \newcommand\vectorOp[2]{% - \directlua{% - vectors['#1'] = vector.op('#2') - }% +\directlua{% +vectors['#1'] = vector.op('#2') +}% } \newcommand\vectorAdd[3]{% - \directlua{% - vectors['#1'] = vector.add(vectors['#2'],vectors['#3']) - }% +\directlua{% +vectors['#1'] = vector.add(vectors['#2'],vectors['#3']) +}% } \newcommand\vectorSub[3]{% - \directlua{% - vectors['#1'] = vector.sub(vectors['#2'],vectors['#3']) - }% +\directlua{% +vectors['#1'] = vector.sub(vectors['#2'],vectors['#3']) +}% } \newcommand\vectorDot[2]{% - \directlua{% - tex.sprint(tostring(vector.dot(vectors['#1'],vectors['#2']))) - }% +\directlua{% +tex.sprint(tostring(vector.dot(vectors['#1'],vectors['#2']))) +}% } \newcommand\vectorMulNum[3]{% - \directlua{% - vectors['#1'] = vector.mulnum(vectors['#2'],#3) - }% +\directlua{% +vectors['#1'] = vector.mulnum(vectors['#2'],#3) +}% } \newcommand\vectorCross[3]{% - \directlua{% - vectors['#1'] = vector.cross(vectors['#2'],vectors['#3']) - }% +\directlua{% +vectors['#1'] = vector.cross(vectors['#2'],vectors['#3']) +}% } \newcommand\vectorSumNorm[1]{% - \directlua{% - tex.sprint(tostring(vector.sumnorm(vectors['#1']))) - }% +\directlua{% +tex.sprint(tostring(vector.sumnorm(vectors['#1']))) +}% } \newcommand\vectorEuclidNorm[1]{% - \directlua{% - tex.sprint(tostring(vector.euclidnorm(vectors['#1']))) - }% +\directlua{% +tex.sprint(tostring(vector.euclidnorm(vectors['#1']))) +}% } \newcommand\vectorSupNorm[1]{% - \directlua{% - tex.sprint(tostring(vector.supnorm(vectors['#1']))) - }% +\directlua{% +tex.sprint(tostring(vector.supnorm(vectors['#1']))) +}% } \newcommand\vectorpNorm[2]{% - \directlua{% - tex.sprint(tostring(vector.pnorm(vectors['#1'],#2))) - }% +\directlua{% +tex.sprint(tostring(vector.pnorm(vectors['#1'],#2))) +}% } \newcommand\vectorCreateRandom[4]{% - \directlua{% - vectors['#1'] = vector.createrandom(#2,#3,#4) - }% +\directlua{% +vectors['#1'] = vector.createrandom(#2,#3,#4) +}% } \newcommand\vectorCopy[2]{% - \directlua{% - vectors['#1'] = vector.copy(vectors['#2']) - }% +\directlua{% +vectors['#1'] = vector.copy(vectors['#2']) +}% } \newcommand\vectorGetCoordinate[2]{% - \directlua{% - tex.sprint(tostring(vector.getcoordinate(vectors['#1'],#2))) - }% +\directlua{% +tex.sprint(tostring(vector.getcoordinate(vectors['#1'],#2))) +}% } \newcommand\vectorSetCoordinate[3]{% - \directlua{% - tex.sprint(tostring(vector.setcoordinate(vectors['#1'],#2,#3))) - }% +\directlua{% +tex.sprint(tostring(vector.setcoordinate(vectors['#1'],#2,#3))) +}% } \newcommand\vectorGetAngle[2]{% - \directlua{% - tex.sprint(tostring(vector.getangle(vectors['#1'],vectors['#2']))) - }% +\directlua{% +tex.sprint(tostring(vector.getangle(vectors['#1'],vectors['#2']))) +}% } % ========= KEY DEFINITIONS ========= @@ -1645,34 +1631,34 @@ end % ========= KEY DEFAULTS ========= \setkeys{vecrr}{brckt=round,truncate=6}% \newcommand{\vectorGramSchmidt}[2][]{% - \begingroup% - \setkeys{vecrr}{#1} - \directlua{% - local tbl = #2 - local outTbl={} - local sum = 0 - for i=1,table.getn(tbl) do - outTbl[i] = vectors[tbl[i]] - end - - tex.sprint(vector.gs(outTbl,"\voprr@brckt",\voprr@truncate))} - % - \endgroup% +\begingroup% +\setkeys{vecrr}{#1} +\directlua{% +local tbl = #2 +local outTbl={} +local sum = 0 +for i=1,table.getn(tbl) do +outTbl[i] = vectors[tbl[i]] +end + +tex.sprint(vector.gs(outTbl,"\voprr@brckt",\voprr@truncate))} +% +\endgroup% } \newcommand{\vectorGramSchmidtSteps}[2][]{% - \begingroup% - \setkeys{vecrr}{#1} - \directlua{% - local tbl = #2 - local outTbl={} - local sum = 0 - for i=1,table.getn(tbl) do - outTbl[i] = vectors[tbl[i]] - end - tex.sprint(vector.gsX(outTbl,"\voprr@brckt",\voprr@truncate))} - % - \endgroup% +\begingroup% +\setkeys{vecrr}{#1} +\directlua{% +local tbl = #2 +local outTbl={} +local sum = 0 +for i=1,table.getn(tbl) do +outTbl[i] = vectors[tbl[i]] +end +tex.sprint(vector.gsX(outTbl,"\voprr@brckt",\voprr@truncate))} +% +\endgroup% } \endinput |