Создание класса для матриц

Создание класса для матриц

Следующий код может иметь много проблем, но он компилируется. Я хочу построить (псевдо)класс для введения метаметодов (+,-,*), но сначала у меня есть небольшая проблема, с которой я не сталкивался с другими классами в моем пакете. Чтобы иметь возможность использовать матрицу 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}

Связанный контент