Lua 元表和元方法
table 作为 Lua 中唯一的数据结构,我们可以利用 table 实现面向对象编程中的类、继承、多重继承等等。在这就介绍一下和 table 密切相关的 Lua 元表和元方法。
Lua 中的每个值都有一个元表。table 和 userdata 可以有各自独立的元表,而其他类型的值则共享其类型所属的单一元表。任何 table 都可以作为任何值的元表,而一组相关的 table 也可以共享一个通用的元表。一个 table 甚至可以作为它自己的元表。
通过 getmetatable 方法可以获取一个值的元表,而 setmetatable 方法则可以设置一个值的元表。
123456789t = {}print(getmetatable(t)) t1 = {}setmetatable(t, t1)assert(getmetatable(t) == t1)t2 = {}setmetatable(t2, t2)assert(getmetatable(t2) == t2)
在 Lua 代码中,只能设置 table 的元表。若要设置其他类型的值的元表,则必须通过 C 代码来完成。从下面的代码也可以看出 ...
论文阅读:Ranking vs. Regression in Machine Translation Evaluation
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
inlineMath: [['$','$']]
}
});
</script>
来源:WMT Metrics Shared Task 2008
链接:Abstract or PDF
作者:Kevin Duh
单位:UWashington
阅读基础:本文前部为读者普及了Metrics的相关知识,读之即可。另外模型中用到的RankSVM1可以看一下(不看也行,读这篇论文关注的是思想)。
WMT历年来的一个重要任务就是为翻译结果设计评价指标,即WMT Metrics Shared Task.
metrics是给定译文和参考翻译,评价参考翻译的质量。
与之不同的是,q ...
An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling
目录:
TCN 论文总结
基础知识
1. 时间序列
2. RNN, LSTM, GRU
3. CNN
TCN
Causal Convolutions
Dilate Convolutions
Residual Convolutions
TCN 的结构
实验
总结
参考文献
基础知识
对于大多数深入学习的实践者来说,序列建模是循环网络的同义词。然而,最近的研究结果表明,卷积结构在音频合成和机器翻译等任务上可以优于循环网络。给定一个新的序列建模任务或数据集,应该使用哪个体系结构?作者对用于序列建模的通用卷积和循环体系结构进行了系统评估。实验表明,一个简单的卷积结构在不同的任务和数据集范围内都优于典型的循环网络(如LSTM),同时显示出更长的有效记忆。
TCN的特点:
...
Lua 排序算法
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
算法步骤
从数列中挑出一个元素,称为 “基准”(pivot)
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
对 “基准” 左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
动画演示
Lua 实现
local function partition(list, low, high)
local low = low
local high = high
local pivotKey = list[low] -- 定义一个中介值
<span class="c1">-- 下面将中介值移动到 ...
Lua中ipairs和pairs的区别与使用
<a href="/2015/11/11/lua_cpp_toluapp_tutorial/" rel="next" title="tolua++安装">
<i class="fa fa-chevron-left"></i>
<p class="post-nav-pre-next-title">
tolua++安装
</p>
</a>
</div>
<span class="post-nav-divider"></span>
<div class="post-nav-prev post-nav-item">
...
Lua Table
前言
table 是lua中是lua中唯一的复合结构, 大多数高级语言中具有的:Array/Map/Class/Struct 数据组织结构均可通过table去实现。table核心的实现主要有:
Array part: 存储数组部分数据结构
Hash part: 存储Map相关数据
metatable: 实现核心func以及运算符重载逻辑,class的数据模式也是利用这个机制实现
数据结构定义
table也是可gc object,所以”继承”了CommonHeader,类似大多数的map/dictionary实现,lua hash部分每个kv都封装在一个Node(也就是entry)中,其中的key决定pos。
flags 8bit标记了Lua是否实现了对应的元方法,Lua一共可以实现24个元方法,其中前6个lua认为是tag method,需要标记出来,避免每次都查表
lsizenode hash部分已分配内存size的平方根(证明都是szie^2分配)
sizearray array部分已经分配的size
array 存储array数据的部分
no ...
tolua实现分析
tolua++如何将c++对象导入到lua里tolua++为每一个传入lua的对象建立一个userdata,userdata的值,是c++对象的地址。userdata的metatable,是一个tolua++建立的,记录了userdata对应c++类型信息的表格,包括导出的成员变量、成员函数等信息。
对于成员变量的读取赋值,tolua++是在metatable里新建了.get和.set两个表。两个表里分别存储了以变量名为键,以读取设置c函数为值的表项。在metatable的index和newindex里,以变量名为键,从.get和.set表里取得读取设置函数并调用。
对于成员函数的调用,只需要以函数名为键,函数为值,存储在metatable里就好了。
传入c++对象的tolua++函数是tolua_pushusertype。一般情况下,第一次使用这个函数将一个c++对象push到lua堆栈上时,才会新建userdata。tolua++会以c++对象地址为键,userdata为值,将键值对存储在tolua_ubox表里。下次推入同样的c++对象时,从这个表里取出userdata推入堆栈即 ...
xLua热更新3之生成代码
思考并回答以下问题:1.如何创建一个空表?
之前提到了生成代码的问题,是不是对这个概念很陌生?生成代码从广义上来说就是通过程序来生成代码。在xLua中也是如此,下面来看看在xLua中具体是什么。
什么是生成代码?生成代码是xLua支持的lua和C#间交互技术之一,这种技术通过生成两者间的适配代码来实现交互,性能较好,是 推荐的方式。xLua可以自动生成配置好的代码,后面会有介绍。
另一种交互技术是反射,这种方式对安装包的影响更少,可以在性能要求不高或者对安装包大小很敏感的场景下使用。
应该什么时候生成代码?开发期不建议生成代码,可以避免很多由于不一致导致的编译失败,以及生成代码本身的编译等待。
发布手机版本前必须执行生成代码,建议做成自动化的流程。
做性能调优,性能测试前必须执行生成代码,因为生成和不生成性能的区别还是很大的。
如何生成代码?生成代码的过程是自动化的,xLua提供了相关的脚本进行生成。
入口是下图的菜单栏:
但是xLua需要首先知道生成哪些代码,这就涉及到xLua的配置了。
xLua的配置xLua所有的配置都支持三种方式:打标签;静态列表;动态列表。
配置有两必须两建 ...
Lua 排序算法
选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理如下,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的序列进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
算法步骤
首先在未排序序列中找到最小元素,存放到排序序列的起始位置
再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
动画演示
Lua 实现
local function selectionSort(arr)
for i = 1, #arr-1 do
local idx = i
-- 迭代剩下的元素,寻找最小的元素
for j = i ...
Lua学习笔记三
Lua中可以用三种方式定义字符串:
单引号 ‘hello world’
双引号 “heool world”
[[ ]] [[hello world]]
字符串操作1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950print(string.upper("hello world")) --HELLO WORLD--string.lower(str)转小写print(string.lower("HELLO WORLD")) --hello world--[[string.gsub(mainStr,findStr,replaceStr,num)字符串替换,返回替换后的字符串和替换的次数 mainStr 整个需要被替换的字符串 findStr 要被替换的部分 replaceStr 新的字符串 要替换的数量,不填就是替换所有--]]print(string.gsub("aaaa"," ...