线性代数学习五,向量的运算与用施密特正交化方法从线性无关组导出正交向量

这里充分使用了Lua的元表来实现Lua风格的面向对象程序设计,用Lua编程的感觉还是不错的。

  1. #!/usr/bin/env lua
  2.  
  3. VectorMeta={}
  4.  
  5. VectorMeta.__add=function(a,b)
  6.         local size=table.maxn(a)
  7.         assert(size==table.maxn(b))
  8.  
  9.         local data={}
  10.         for i=1,size do
  11.                 table.insert(data,a[i]+b[i])
  12.         end
  13.  
  14.         return Vector(data)
  15. end
  16.  
  17. VectorMeta.__sub=function(a,b)
  18.         local size=table.maxn(a)
  19.         assert(size==table.maxn(b))
  20.  
  21.         local data={}
  22.         for i=1,size do
  23.                 table.insert(data,a[i]-b[i])
  24.         end
  25.  
  26.         return Vector(data)
  27. end
  28.  
  29. VectorMeta.__mul=function(a,b)
  30.         if type(a)=="number" then
  31.                 local data={}
  32.                 for _,v in ipairs(b) do
  33.                         table.insert(data,a*v)
  34.                 end
  35.                 return Vector(data)
  36.         else
  37.                 local size=table.maxn(a)
  38.                 assert(size==table.maxn(b))
  39.                
  40.                 local sum=0
  41.                 for i=1,size do
  42.                         sum=sum+a[i]*b[i]
  43.                 end
  44.  
  45.                 return sum
  46.         end
  47. end
  48.  
  49. VectorMeta.__index=function(data,index)
  50.         if type(index)=="number" then
  51.                 return data[index]
  52.         else
  53.                 return VectorMeta[index]
  54.         end
  55. end
  56.  
  57. VectorMeta.length=function(data)
  58.         local sum=0
  59.         for _,v in ipairs(data) do
  60.                 sum=sum+v*v
  61.         end
  62.         return math.sqrt(sum)
  63. end
  64.  
  65. VectorMeta.print=function(this)
  66.         io.write('[')
  67.         for i=1,table.maxn(this)-1 do
  68.                 io.write(this[i],',')
  69.         end
  70.         io.write(this[table.maxn(this)],"]\n")
  71. end
  72.  
  73. -- Use Schmitt method to orthogonalize vectors
  74. VectorMeta.orthogonalize=function(...)
  75.         local alphas=arg
  76.         local betas={arg[1]}
  77.         for i=2,table.maxn(alphas) do
  78.                 local beta=alphas[i]
  79.                 for j=1,i-1 do
  80.                         beta=beta-((alphas[i]*betas[j])/(betas[j]*betas[j]))*betas[j]
  81.                 end
  82.                 assert(type(beta)=="table")
  83.                 table.insert(betas,beta)
  84.         end
  85.         return betas
  86. end
  87.  
  88. Vector=function(data)
  89.         setmetatable(data,VectorMeta)
  90.         return data
  91. end
  92.  

Algorithm Comments(0) 2008年8月25日 09:17