
Следующий код может иметь много проблем, но он компилируется. Я хочу построить (псевдо)класс для введения метаметодов (+,-,*), но сначала у меня есть небольшая проблема, с которой я не сталкивался с другими классами в моем пакете. Чтобы иметь возможность использовать матрицу A, я обязан своим кодом (я позаимствовал несколько частей слева и справа) написать, A.tbl
чтобы манипулировать ею. Можно ли изменить мой код, чтобы использовать A
и не использовать A.tbl
? Замечание: chatGPT ненавидит мой код и, вероятно, прав!
\documentclass{article}
\usepackage{tkz-euclide}
\usepackage{tkz-elements}
\begin{document}
\LuaCodeDebugOn
\begin{luacode}
matrix={}
function matrix: new (value)
local type = 'matrix'
local rows = #value
local cols = #value[1]
local tbl = value
local o = {tbl = tbl,
rows = rows,
cols = cols,
type = type }
setmetatable(o, self)
self.__index = self
return o
end
return matrix
\end{luacode}
\begin{luacode}
function print_matrix(matrix)
tex.print("\\{%")
for i = 1, #matrix do
local row = matrix[i]
local row_str = "{\\{"
for j = 1, #row do
row_str = row_str .. " " .. tostring(row[j])
if j < #row then
row_str = row_str .. ","
end
end
row_str = row_str .. "\\}}"
tex.sprint(row_str)
end
tex.print("\\}")
end
function product_matrix(A, B)
local C = {}
for i = 1, #A do
C[i] = {}
for j = 1, #B[1] do
local num = A[i][1] * B[1][j]
for k = 2, #A[1] do
num = num + A[i][k] * B[k][j]
end
C[i][j] = num
end
end
return C
end
\end{luacode}
\begin{tkzelements}
a = point(1,0)
b = point(0,1)
c = point(1,1)
d = point(1,-1)
A = matrix : new ({{1, 2}, {1,3}})
B = matrix : new ({{2, 3}, {-5, 4}})
Z = {{a, b}, {c,d}}
Z = product_matrix(Z,Z)
W = product_matrix(A.tbl,Z)
\end{tkzelements}
\parindent=0pt
\verb|A = matrix : new ({{1, 2}, {1,3}})|
Matrix A:\directlua{print_matrix(A.tbl)}
\verb|Z = {{a, b}, {c,d}}|
Matrix Z*Z:\directlua{print_matrix(Z)}
Matrix W=A*Z:\directlua{print_matrix(W)}
\end{document}
решение1
При желании вы можете принять либо внешний класс, либо внутренние tbl
данные, проверяя во время выполнения типы аргументов, чтобы можно было передавать A
илиA.tbl
\documentclass{article}
\usepackage{tkz-euclide}
\usepackage{tkz-elements}
\begin{document}
\LuaCodeDebugOn
\begin{luacode}
matrix={}
function matrix: new (value)
local type = 'matrix'
local rows = #value
local cols = #value[1]
local tbl = value
local o = {tbl = tbl,
rows = rows,
cols = cols,
type = type }
setmetatable(o, self)
self.__index = self
return o
end
return matrix
\end{luacode}
\begin{luacode}
function print_matrix(matrix)
local mdata = (matrix.type=='matrix' and matrix.tbl or matrix)
tex.print("\\{%")
for i = 1, #mdata do
local row = mdata[i]
local row_str = "{\\{"
for j = 1, #row do
row_str = row_str .. " " .. tostring(row[j])
if j < #row then
row_str = row_str .. ","
end
end
row_str = row_str .. "\\}}"
tex.sprint(row_str)
end
tex.print("\\}")
end
function product_matrix(A, B)
local adata = (A.type=='matrix' and A.tbl or A)
local bdata = (B.type=='matrix' and B.tbl or B)
local C = {}
for i = 1, #adata do
C[i] = {}
for j = 1, #bdata[1] do
local num = adata[i][1] * bdata[1][j]
for k = 2, #adata[1] do
num = num + adata[i][k] * bdata[k][j]
end
C[i][j] = num
end
end
return C
end
\end{luacode}
\begin{tkzelements}
a = point(1,0)
b = point(0,1)
c = point(1,1)
d = point(1,-1)
A = matrix : new ({{1, 2}, {1,3}})
B = matrix : new ({{2, 3}, {-5, 4}})
Z = {{a, b}, {c,d}}
Z = product_matrix(Z,Z)
W = product_matrix(A.tbl,Z)
WW = product_matrix(A,Z)
\end{tkzelements}
\parindent=0pt
\verb|A = matrix : new ({{1, 2}, {1,3}})|
Matrix A:\directlua{print_matrix(A)}
Matrix A (tbl):\directlua{print_matrix(A.tbl)}
\verb|Z = {{a, b}, {c,d}}|
Matrix Z*Z:\directlua{print_matrix(Z)}
Matrix tbl W=A*Z:\directlua{print_matrix(WW)}
Matrix W=A*Z:\directlua{print_matrix(W)}
\end{document}