언어/lua

10. 매트릭스

조규현15 2015. 12. 1. 09:04
반응형

매트릭스 연산이 필요하지만

Lua는 내부 Lib에서 제공하지 않는다.

에서는 Table을 사용하여 Matrix를 만들 수 있다 써있지만
2차원 배열일 뿐 matrix연산은 없다.
현재 내가 필요한 연산은 Invert()와 Mul() 연산이므로
직접 구현해보겠다.

선형대수 시간에 열심히 공부했다면 이해하는데 문제가 없다 생각한다.

Matrix = {row,col,m}
Matrix.New = function(row , col , data)
local Instance = {}
Instance.row = row -- set a row
Instance.col = col -- set a col
Instance.m = {} -- set a MatrixData
for i=1, row do      
Instance.m[i] = {}     -- create a new row      
for j=1, col do
Instance.m[i][j] = data[(i-1)*col+j]     -- create a new col   
end    
end
-- Definition Method
function Instance:Print()
for i=1, self.row do
for j=1, self.col do
io.write(self.m[i][j],"\t")
end
io.write("\n")
end
end
function Instance:Inverse()
-- 2차 정각행렬일 경우만 고려한다
if self.col == self.row then
local a = self.m[1][1]
local b = self.m[1][2]
local c = self.m[2][1]
local d = self.m[2][2]
local det = a*d-b*c
if det == 0 then -- 에러 처리
print("E2")
return
end
self.m[1][1] = d/det
self.m[1][2] = -b/det
self.m[2][1] = -c/det
self.m[2][2] = a/det
else
print("sorry, this mat isn't n' square mat.")
return
end
end
function Instance:Multiply(D)
Data = {}
Index = 0
-- if self.col == D.row then -- Check the Possible
for i=1, self.row do
for j=1, D.col do
Index = Index + 1 -- Increase the Index
Data[Index] = 0
for k=1, self.col do
Data[Index] = Data[Index] + self.m[i][k] * D.m[k][j]
end
end
end

R = Matrix.New(self.row, D.col, Data)
-- Return New Matrix R
return R
end

return Instance
end

local mat = Matrix.New(
3,2,{1,4,
 2,5,
 3,6})
mat:Print()

local mat2 = Matrix.New(
2,3,{7,8,9,
 10,11,12})
mat2:Print()

local mat3 = mat:Multiply(mat2)
mat3:Print()


반응형

'언어 > lua' 카테고리의 다른 글

9. 클래스  (0) 2015.12.01
8. 함수  (0) 2015.12.01
6. 중간 정리  (0) 2015.12.01
5. 연산자  (0) 2015.12.01
4. 자료형  (0) 2015.12.01