texlive[67867] Master/texmf-dist: lualinalg (9aug23)
commits+karl at tug.org
commits+karl at tug.org
Wed Aug 9 22:00:09 CEST 2023
Revision: 67867
http://tug.org/svn/texlive?view=revision&revision=67867
Author: karl
Date: 2023-08-09 22:00:09 +0200 (Wed, 09 Aug 2023)
Log Message:
-----------
lualinalg (9aug23)
Modified Paths:
--------------
trunk/Master/texmf-dist/doc/lualatex/lualinalg/README.txt
trunk/Master/texmf-dist/doc/lualatex/lualinalg/lualinalg.pdf
trunk/Master/texmf-dist/doc/lualatex/lualinalg/lualinalg.tex
trunk/Master/texmf-dist/tex/lualatex/lualinalg/lualinalg.sty
Modified: trunk/Master/texmf-dist/doc/lualatex/lualinalg/README.txt
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/lualinalg/README.txt 2023-08-09 19:59:57 UTC (rev 67866)
+++ trunk/Master/texmf-dist/doc/lualatex/lualinalg/README.txt 2023-08-09 20:00:09 UTC (rev 67867)
@@ -1,5 +1,5 @@
# The lualinalg package
-# version 1.5
+# version 1.6
# Authors: Chetan Shirore and Ajit Kumar
# Email: mathsbeauty at gmail.com
Modified: trunk/Master/texmf-dist/doc/lualatex/lualinalg/lualinalg.pdf
===================================================================
(Binary files differ)
Modified: trunk/Master/texmf-dist/doc/lualatex/lualinalg/lualinalg.tex
===================================================================
--- trunk/Master/texmf-dist/doc/lualatex/lualinalg/lualinalg.tex 2023-08-09 19:59:57 UTC (rev 67866)
+++ trunk/Master/texmf-dist/doc/lualatex/lualinalg/lualinalg.tex 2023-08-09 20:00:09 UTC (rev 67867)
@@ -1,7 +1,7 @@
\documentclass{article}
\usepackage{listings,color,parskip,booktabs,longtable,array,
-hyperref,multirow,multicol,url,amsmath,amssymb,framed,graphicx,lualinalg,tikz,tikz-3dplot,float}
-\usepackage[top=1in, bottom=1in, left=1in, right=1in]{geometry}
+hyperref,multirow,multicol,url,amsmath,amssymb,framed,lualinalg,tikz,tikz-3dplot}
+\usepackage[top=1.1in, bottom=1.1in, left=1in, right=1in]{geometry}
\usetikzlibrary{calc,3d,arrows}
\hypersetup{colorlinks,urlcolor=blue}
\lstset{frame=none,
@@ -390,7 +390,7 @@
\end{tikzpicture}
\end{lstlisting}
Listing \ref{code:luavecplot} produces figure \ref{fig:2dvecplot}.
-\begin{figure}[H]
+\begin{figure}
\centering
\tdplotsetmaincoords{0}{0}
\begin{tikzpicture}[scale=1,
@@ -463,7 +463,7 @@
\end{lstlisting}
Listing \ref{code:luavecplot2} produces figure \ref{fig:3dvecplot}.
-\begin{figure}[H]
+\begin{figure}
\centering
\tdplotsetmaincoords{60}{120}
\begin{tikzpicture}[scale=1,
@@ -526,7 +526,7 @@
\subsection{Commands for operations on matrices}
Table \ref{tbl:luamtxcmd} lists all commands for operations on matrices in the \verb|lualinalg| package.
-\begin{longtable}{m{7cm}m{7cm}}
+\begin{longtable}{m{7cm}m{7.5cm}}
\toprule
\multicolumn{1}{c}{\textcolor{blue}{Command Format}} & \multicolumn{1}{c}{\textcolor{blue}{Description}} \\
\toprule
@@ -677,7 +677,7 @@
\matrixCreateRandom
{m}{i}{j}{k}{l}
\end{lstlisting}&
-Creates a new matrix m with random numbers. Here \(i,j\) denotes the number of rows and columns, and \(k, l\) denotes the start and end integers between which random numbers are generated. \\
+Creates a new matrix m with random numbers. Here \(i, j\) denotes the number of rows and columns, and \(k, l\) denotes the start and end integers between which random numbers are generated. \\
\midrule
\multicolumn{2}{c}{Elementary row operations on matrices} \\
\midrule
Modified: trunk/Master/texmf-dist/tex/lualatex/lualinalg/lualinalg.sty
===================================================================
--- trunk/Master/texmf-dist/tex/lualatex/lualinalg/lualinalg.sty 2023-08-09 19:59:57 UTC (rev 67866)
+++ trunk/Master/texmf-dist/tex/lualatex/lualinalg/lualinalg.sty 2023-08-09 20:00:09 UTC (rev 67867)
@@ -1,11 +1,9 @@
-
-% 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}
@@ -12,7 +10,6 @@
\RequirePackage{luacode}
\begin{luacode*}
-
-- matrices part
matrices = {}
@@ -21,903 +18,904 @@
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.")
+ 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(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
- 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")
+ assert(#m1 == #m1[1], "matrix not square")
- local size = #m1
+ local size = #m1
- if size == 1 then
- return m1[1][1]
- end
+ 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 == 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
+ 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 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
+ 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
+ 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
- end
+ 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
+ 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
- if math.fmod(rows, 2) == 0 then
- det = -det
- end
- det = det * subdet
- table.remove(mtx)
- else
- return det * 0
- 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
+ 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
+ lead = lead + 1
+ end
+ end
- if i ~= r then
- mtx = matrix.swapRows(mtx, i, r)
- 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 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
- 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
- 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
+ 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
+ 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
+ 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
+ lead = lead + 1
+ end
+ end
- if i ~= r then
- mtx = matrix.swapRows(mtx, i, r)
- augmt = matrix.swapRows(augmt, i, r)
- 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
+ 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[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]
- 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
+ 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
+ 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
+ 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 @@
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 @@
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 @@
% matrix latex commands
\newcommand\matrixNew[2]{%
- \directlua{%
- matrices['#1'] = matrix(#2)
- }%
+\directlua{%
+matrices['#1'] = matrix(#2)
+}%
}
% ========= KEY DEFINITIONS =========
@@ -1271,224 +1269,212 @@
\setkeys{matrixop}{type=bmatrix,truncate=6}%
\newcommand{\matrixPrint}[2][]{%
- \begingroup%
- \setkeys{matrixop}{#1}
- \directlua{tex.sprint(matrix.show(matrices['#2'],"\mop at type",\mop at truncate))}
- %
- \endgroup%
+\begingroup%
+\setkeys{matrixop}{#1}
+\directlua{tex.sprint(matrix.show(matrices['#2'],"\mop at type",\mop at 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'])))
- }%
+\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'])))
- }%
-}
-
% ========= KEY DEFINITIONS =========
\define at key{matrixrr}{type}{\def\moprr at type{#1}}
\define at key{matrixrr}{truncate}{\def\moprr at truncate{#1}}
@@ -1497,35 +1483,35 @@
\setkeys{matrixrr}{type=bmatrix,truncate=6}%
\newcommand{\matrixRREFSteps}[2][]{%
- \begingroup%
- \setkeys{matrixrr}{#1}
- \directlua{%
- tex.sprint(matrix.rref0E(matrices['#2'],"\moprr at type",\moprr at truncate))}
- %
- \endgroup%
+\begingroup%
+\setkeys{matrixrr}{#1}
+\directlua{%
+tex.sprint(matrix.rref0E(matrices['#2'],"\moprr at type",\moprr at 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 at type",\moprr at truncate))}
- %
- \endgroup%
+\begingroup%
+\setkeys{matrixrr}{#1}
+\directlua{%
+tex.sprint(matrix.gauss0E(matrices['#2'],matrices['#3'],"\moprr at type",\moprr at truncate))}
+%
+\endgroup%
}
% vector latex commands
\newcommand\vectorNew[2]{%
- \directlua{%
- vectors['#1'] = vector(#2)
- }%
+\directlua{%
+vectors['#1'] = vector(#2)
+}%
}
% ========= KEY DEFINITIONS =========
@@ -1535,107 +1521,107 @@
\setkeys{vectorop}{truncate=6}%
\newcommand{\vectorPrint}[2][]{%
- \begingroup%
- \setkeys{vectorop}{#1}
- \directlua{tex.sprint(vector.show(vectors['#2'],\vop at truncate))}
- %
- \endgroup%
+\begingroup%
+\setkeys{vectorop}{#1}
+\directlua{tex.sprint(vector.show(vectors['#2'],\vop at 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 @@
% ========= 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 at brckt",\voprr at 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 at brckt",\voprr at 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 at brckt",\voprr at 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 at brckt",\voprr at truncate))}
+%
+\endgroup%
}
\endinput
More information about the tex-live-commits
mailing list.