autotools使用
基本流程
基本流程为:
使用autoscan生成configure.scan文件,然后重命名为configure.acconfigure.ac里面包含一些自动检查的内容
执行aclocal,configure.ac中的宏实际上是m4宏的一个封装,这条命令将会吧ac宏解析成m4宏
执行autoconf, 它会生成configure脚本
执行autoheader,它会根据configure.ac中的内容生成一些预定义信息
Makefile.am中包含了程序编译链接信息,也就是makefile的主体内容,执行automake会生成Makefile的前置文件
执行./configure会生成Makefile文件
configure是检查系统设置,库函数是否满足等运行环境判断,Makefile.am则是真正的进行编译
configure.acautoconf基于此
首先介绍m4,m4是一个宏处理器,它会扫描文本,如果遇到宏则将其展开。
我们可以简单的认为他将shell脚本套上了一层函数的壳,例如:
// 检测是否安装foo程序的shellif [ $(which foo) ]then ...
光流估计
定义光流在计算机视觉中表示物体的移动,由于相机和物体之间存在相对运动,因此多帧之间的图像像素强度值不同,通过连续检测运动物体帧之间的强度变化,可以估计出物体的运动信息。
光流法基本假设条件
亮度恒定不变: 即同一目标的不同帧之间,亮度不会改变,通过它可以得到光流法的基本方程
小范围运动: 点在相邻帧之间不会发生大范围的运动
光亮恒定不变假设产生的方程为将右侧进行泰勒展开可得
$I_x$为相邻帧之间x位置变化量,$I_t$是时间变化量,如果是后一帧则为1,前一帧则为-1其中有u和v两个变量,因此我们需要加入额外的约束条件。
不同的约束条件变产生了额外的方法
Lucas-Kanada方法L-k方法假设相邻像素之间位移相似。然后根据这一假设选取像素点附近一个窗口,这个窗口内的位移相同,然后联立这些方程可得:
这种方法的问题是需要联立矩阵求解,因此它的特征值不能过大或过小
如图是特征值对应的区域类型, Flat是平滑区域,edge是边界
此外,为了解决小范围运动的问题,可以通过建立图像金字塔解决。因为图像分辨率小,每次移动的像素点就少。
FlowNetFlowNet的结构
它还是 ...
vivado设置simulation时默认wcfg文件
set_property xsim.view F:/vivado/project/tcpu/src/testbench/dcache.wcfg
自底向上语法分析
基础例:
假定文法为:(1) S->aAcBe(2) A->b(3) A->Ab(4) B->d将abbcde归约到S栈 动作a 进aab 进abaA A->baAb 进baA A->AbaAc 进caAcd 进daAcB B->daAcBe 进eS S->aAcBe
该过程和自顶向下正好相反,它从规则右端寻找是否有匹配规则,然后将他归约成左端,最后得到起始字符为匹配完成。
因为右端可能会有多条相同规则,因此问题的关键是使用哪一个产生式进行归约。
名词定义:
短语: 文法G[S], $\alpha \beta \delta$是文法G的一个句型 且$S \overset{*}{=}> \alpha \beta \delta \, 且 \, A \overset{+}{=}> \beta$.则称$\beta$是A的短语
直接短语: 若有A=>$\beta$则称为直接短语
句柄: 一个句型的最左直接短语称为句柄
例如文法:
E->T | E+TT->F|T* ...
graph cut算法
最大流最小割问题可以参考这篇博客
graph cut思想能量函数
其中前一项是区域项。而后一项是边界项。而函数的优化目的是找能量最低的位置。
首先我们需要一些种子点标注它是前景还是背景,然后我们可以根据前景点和后景点构建概率直方图。图中的含义是p节点的前景的区域概率为p节点在前景直方图的概率的负对数。
而边界项的计算公式为
也就是说随着颜色差异和距离的增大,B在减小。
gprah cut的目的是为了区分出哪些是前景,哪些是背景来进行分割。因此我们可以采用最大流最小割的思想,将源点认为是前景,将汇点认为是背景,而图像中的像素是其他点,我们需要找到最小割将前景和背景分割开来。
定义完点之后还需要定义流量,流量分为端点到像素点之间的流量和像素点到像素点之间的流量:
端点到像素点: 这一项是前面公式中的R(L),它的定义为如果是前景种子点,则到前景流量为无穷大,到背景点流量为0.其他点到源点和汇点计算遵从上面的公式
像素点到像素点: 这一项是公式中的B(L),遵从上面公式
代码实现import osimport cv2import numpy as npimport maxflowi ...
自顶向下语法分析
语法分析基础编译的第一步是词法分析,第二步是语法分析。词法分析产生的结果是标识符,第二步是判断源程序文法是否合法。例如if{...}就是不合法的文法,但是他产生的标识符都是正确的。
工作原理: 通过上下文无关文法产生的文法式,识别输入字符串是否是一个句子。从左至右每次读入一个字符进行规则匹配。
问题及解决左递归例如
规则为P->Pa字符串为a起始非终结符为P读入a后将栈中的P展开为Pa,然后因为是从左往右匹配因此读入P,展开为Paa,如此递归,得到死循环
消除递归的方法:
消除直接左递归
经过这样的转换之后产生的语言没有改变,但是消除了直接的左递归
再将它一般化得:
\begin{aligned}
A &\to A \alpha_1 | A\alpha_2 | \dots | A \alpha_m | \beta_1 | \beta_2 | \dots | \beta_n\\
则可以改写为\\
A &\to \beta_1 A^{'} | \beta_2 A^{'} | \dots | \beta_n A^{'}\\
A &\to \alpha_1 A ...
图灵机概述
定义图灵机是一个七元组(Q, $\sum , \tau , \delta , q0 , q{accept} , q_{reject}$}
Q: 状态集
$\sum$: 输入字母表
$\tau$: 纸带字母表 $\sqcup$是空白符
$\delta$: $Q \times \tau -> Q \times \tau \times {L, R}$
$q_{reject}$: 拒绝状态
简单来说图灵机有一个纸带,并且有一个探头可以读取纸带中任意位置的数据,并且可以修改纸带中任意位置的值,纸带的初始内容就是输入的字符串,纸带上最后一个字符后的字符都是空白符。
纸带的格局(当前状态的内容):
纸带的格局由三部分内容组成,他可以使用uqv表示,其中q是读写头,uv是纸带内容
当前状态: q
当前纸带内容: uv
读写头当前位置: v的第一个字符
从当前格局跳转到下一个格局的形式化定义为:
a, b $\in \tau$, u, v $\in tau^*$, $q_i , q_j \in Q$
ua$q_i$bv 产生 u$q_j$acv 如果存在$\delta(q_i , b) ...
上下文无关语言
上下文无关文法 上下文无关文法(CFG)是一个四元组(V, $\sum$, R, S)
V是变元
$\sum$是终结符
R: 规则,每条规则都由左边的变元和右边变元和终结符组成的字符串构成
S: 起始节点
例如: S -> aSb | SS | $\varepsilon$
二义性二义性指的是一个字符串可能有多种解析方式
.
导致二义性的原因:
解析顺序不同,可能最后生成的解析树是相同的。
最后生成的解析树不同
为了消除第一种导致二义性的可能,可以使用最左推导,即每次都从最左边的变元开始解析。
二义性定义: 一个字符串可以被两个乃至更多的最左推导生成。
乔姆斯基范式一个上下文无关语言的乔姆斯基范式的形式为:
A -> BC
B -> a
S -> $\varepsilon$
证明任何上下文无关文法都可以转换成乔姆斯基范式
一个上下文无关文法可以转换成乔姆斯基范式的上下文无关文法
转换分为四个步骤:
添加一个起始变量 添加一个$S_0$和一条规则$S_0 -> S$,其中S是原来的起始变量。这条规则是为了让起始变量不出现在右边
消除 ...
K-means
概念k-means算法属于非监督学习,也就是事先不知道给的数据属于那一类,需要自己去分类。它的基本思想是把数据点密集的一群分成一类。
具体过程:
随机选择k个类的初始中心
在c次迭代中,对任意一个样本,求到各中心点之间的距离,将该样本归类到最近中心的那个类
使用均值等方法更新中心点。
如果两次更新匪类相同也结束
例如划分三个点(1, 1) (2, 3) (4, 6)是一类,那么新的中心点是((1+2+4)/3, (1+3+6)/3),不一定要在原有点上
实现import numpy as np# Function: K Means# -------------# K-Means is an algorithm that takes in a dataset and a constant# k and returns k centroids (which define clusters of data in the# dataset which are similar to one another).def kmeans(X, k, maxIt): # maxIt是初始化次数 ...
51单片机结构
端口
在复位状态下,所有的sfr为0,所有的p端口为1
p0端口: 39-52脚。可以作为通用数据io端口或者地址数据复用总线。作为通用io端口时,有8个ttl的负载,在和外部负载连接时需要外接一个上拉电阻。作为地址数据复用总线时,首先输出外部存储器的低八位地址,然后变成数据总线进行数据输入输出。当作为io端口时,控制=0,因此上面的三极管输出始终为0,因此需要一个上拉电阻提供信号,当下面三极管为0时,由上拉电阻提供电压,引脚值为1。当下面三极管为1时,电路直接从上拉电阻到接地,引脚值为0,这被称为漏极开路作为地址数据端口时,控制=1,因此mux连接上面的地址数据io。当地址或数据为1时,上面的三极管输出1,当地址或数据为0时,下面的三极管有效,对外输出为0.
输入时需要先写1: 输入也就是读引脚,如果原来锁存器是0那么下面的三极管不连通,这样会有上拉电阻的干扰导致结果一定是1。因此先需要向锁存器输入1.mov a, #0ffh;mov p0, a; 向端口p0写1,共有8个输入端口ov a, p0;从p0口输入数据到a
读引脚和读锁存器是不同的通道,凡是读-修改-写(读锁存器中的 ...