这里充分使用了Lua的元表来实现Lua风格的面向对象程序设计,用Lua编程的感觉还是不错的。
-
#!/usr/bin/env lua
-
-
VectorMeta={}
-
-
VectorMeta.__add=function(a,b)
-
local size=table.maxn(a)
-
assert(size==table.maxn(b))
-
-
local data={}
-
for i=1,size do
-
table.insert(data,a[i]+b[i])
-
end
-
-
return Vector(data)
-
end
-
-
VectorMeta.__sub=function(a,b)
-
local size=table.maxn(a)
-
assert(size==table.maxn(b))
-
-
local data={}
-
for i=1,size do
-
table.insert(data,a[i]-b[i])
-
end
-
-
return Vector(data)
-
end
-
-
VectorMeta.__mul=function(a,b)
-
if type(a)=="number" then
-
local data={}
-
for _,v in ipairs(b) do
-
table.insert(data,a*v)
-
end
-
return Vector(data)
-
else
-
local size=table.maxn(a)
-
assert(size==table.maxn(b))
-
-
local sum=0
-
for i=1,size do
-
sum=sum+a[i]*b[i]
-
end
-
-
return sum
-
end
-
end
-
-
VectorMeta.__index=function(data,index)
-
if type(index)=="number" then
-
return data[index]
-
else
-
return VectorMeta[index]
-
end
-
end
-
-
VectorMeta.length=function(data)
-
local sum=0
-
for _,v in ipairs(data) do
-
sum=sum+v*v
-
end
-
return math.sqrt(sum)
-
end
-
-
VectorMeta.print=function(this)
-
io.write('[')
-
for i=1,table.maxn(this)-1 do
-
io.write(this[i],',')
-
end
-
io.write(this[table.maxn(this)],"]\n")
-
end
-
-
-- Use Schmitt method to orthogonalize vectors
-
VectorMeta.orthogonalize=function(...)
-
local alphas=arg
-
local betas={arg[1]}
-
for i=2,table.maxn(alphas) do
-
local beta=alphas[i]
-
for j=1,i-1 do
-
beta=beta-((alphas[i]*betas[j])/(betas[j]*betas[j]))*betas[j]
-
end
-
assert(type(beta)=="table")
-
table.insert(betas,beta)
-
end
-
return betas
-
end
-
-
Vector=function(data)
-
setmetatable(data,VectorMeta)
-
return data
-
end
-