Question List in November, 2022

Simple and reliable.
简单可依赖。

1、工作记录

工作内容不对外公开。

2、日常积累

2.1 VIM 命令

#vim

正常模型下的常用命令:

# 正常模式下
0  # 移动到行首
$  # 移动到行尾
gg # 移动到文件头部
G  # 移动到文件尾部
ctrl+f # 下翻一屏。
ctrl+b # 上翻一屏。

查找相关:

/something   # 后查 something
/?something  # 前查找 something
n            # 向后查找下一个
N            # 向前查找下一个
/nohl        # 退出查找的高亮

复制粘贴删除:

yy              # 复制当前行
nyy             # 复制当前开始的 n 行
p               # 粘贴
dd              # 删除一行
ndd             # 删除当前开始的 n 行
:20,30 copy 10  # 将 [20,30] 行的数据拷贝到第 10 行
:20,30 move 10  # 将 [20,30] 行的数据移动到第 10 行

撤销:

u      # 撤销上一步的操作
Ctrl+r # 恢复上一步被撤销的操作

2.2 LINUX 命令

#linux

# 查看内存占用
free -h               # 查看内存占用
top                   # 查看系统的实时负载
ps -ef | grep <name>  # 查看名为 name 的线程

2.3 GIT 命令

#git

git log                                       # 查看提交记录
git reset --hard <commit-id>                  # 回退到 <commit-id> 分支
git reset --soft <commit-id>                  # 回退 <commit-id> 版本且不修改文件
git stash                                     # 隐藏尚未 commit 的提交
git checkout -b <本地分支名> origin/<远程分支名>  # 创建本地分支并关联到远程分支
git fetch origin <远程分支名>:<本地分支名>        # 拉取远程分支到本地分支
# 先把自己本地代码存起来,然后再 pull,再 stash pop 将代码恢复
git stash
git pull
git stash pop
git stash list                                # 列举本地所有的 stash 信息

2.4 调试记录

SQLite 操作时发生 Error: database or disk is full

當你在使用 sqlite 操作 DB 時如果發生錯誤:

Error: database or disk is full

有兩種可能:

  1. 你放 DB 的磁區真的太滿了,那就清出來就好。(看操作,可能會需要數倍 DB 的空間)

  2. SQLite 使用的 temp 空間不夠大,這個狀況的解法是進入 sqlite 的 interactive mode

    並且執行(cppsqlite3 中可以用 db.execDML() 函数执行):

    PRAGMA temp_store_directory = 'directory-name';

    还原为默认目录只需要将其设置为:PRAGMA temp_store_directory = '';

    // 测试目录:PRAGMA temp_store_directory='/home/work/tongjx/tmp';

需要注意:

谨慎使用 temp_store_directory 修改临时文件存储目录!!!
对于 Unix/Linux/OSX 来说,默认可路径是 /var/tmp, /usr/tmp, /tmp 以及当前目录 current-directory 中第一个可写的目录。对于 WINDOWS NT,默认路径由 WINDOWS 决定,通常是C:\Documents and Settings\user-name\Local Settings\Temp\。
SQLite创建的临时文件在打开后会被立即删除(unlink), 这样当SQLite进程退出时,操作系统就可以自动删除这些文件。所以正常状态下,使用ls或dir命令是无法看到这些临时文件的。

经过排查,定位到代码输出错误的地方是 BD_BAC 表在与其他两个表 BD_LBR、BD_LAN 和 BD_CHA 关联时使用了三次 LEFT JOIN IN 语句,这个语句对一个 20GB 的数据库而言会产生庞大的 TMP 临时文件缓存,所以需要自定义 PRAGMA 临时文件存放目录。

SQL JOINS 语句类型

LEFT JOIN 是相当耗资源的操作,关联字段没有索引时速度很慢;故而若使用该语句时,最好用索引字段取关联,或者给关联的字段加索引。

目前的解决方案是重新指定缓存文件目录并在整个程序运行结束后销毁这个目录;更好的策略应该是修复算法,将三重 LEFT JOIN 查询给优化调。

C++ 浮点型相等判断

static inline bool double_equal(double a, double b){
    return fbs(a - b) < std::numeric_limits<double>::epsilon();
}

参考文献

  1. Visual Data Tools. MAC 论文数据图表工具 DataGraph[EB/OL].

  2. Visual Data Tools. MAC 三维数据图表工具 ImageTank[EB/OL].

  3. Visual Data Tools. LatinMordern Latex 论文字体[EB/OL].

  4. MacTEX. MAC 完整 Tex 论文运行环境[EB/OL].

  5. SciDAVis.MAC 论文数据图表工具 SciDAVis[EB/OL].

  6. CSDN 博客. VIM命令大全[EB/OL].

  7. 知乎. git如何退回到之前的代码[EB/OL].

  8. Jack Yu. Sqlite 操作時發生 Error: database or disk is full[EB/OL].

  9. 内存网. 我对SQLite的强行研究[EB/OL].

  10. gepulog. SQLite3をPythonから使っていたら、sqlite3.OperationalError database or disk is fullというエラーが出た[EB/OL].

  11. sqlite.org. pragma_temp_store_directory[EB/OL].

3、知识积累

3.1 高斯函数

#高斯

对于形如 \(y=e^{-x^2}\) 形式的高斯函数其具有如下的函数曲线:

高斯函数曲线

其在形式和图形表现上都近似于正态分布;高斯函数通常用来表示期望值为 \(\mu\) 且方差为 \(\sigma^2\) 的正态分布 \(N(\mu,\sigma^2)\) 的概率密度函数,即:

\[f(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}},x\in(-\infty,+\infty)\]

对高斯函数积分可以得到高斯积分,其定积分的计算结果如下:

\[\int_{-\infty}^{+\infty}e^{-x^2}dx=\sqrt{\pi}\]

而在高程对齐中,我们引入的权重计算公式如下:

\[w_i=\frac{e^{-s_i^2\cdot \alpha}}{\sum_i e^{-s_i^2\cdot \alpha}}\]

式中,\(\alpha=10^5\) 为参数权重因子,从结果上来看应该是可以决定权重的分布距离。\(\alpha\) 越小,远处高程参与计算的影响程度越高,高程越平滑,对齐后结果可能越低;\(\alpha\) 越大,远处高程参与计算的影响程度越低,高程可能就越大一些。

3.2 热力图

密度分析算法:点密度分析、线密度分析和核密度分析算法;
数据的可视化:构建 {x, y ,value} 数组,通过绘制点缓冲半径以及颜色叠加方法实现热力图;

注意:云图和热力图是很像的两种图,它们的区别在于,云图的数据源要求图的每一个区域都有数值,而热力图是在图上的某些离散点有数值;事实上,云图可以看作是高密度的热力图。

密度分析

摘自《ArcMap 密度分析工具集》:

密度分析可以对某个现象的已知量进行处理,然后将这些量分散到整个地表上,依据是在每个位置测量到的量和这些测量量所在位置的空间关系。通过简单计算和核计算均可实现密度计算。这两种工具的输出与核密度工具的输出的区别在于,对于点密度和线密度,需要指定一个邻域以便计算出各输出像元周围像元的密度。

点密度与线密度分析

在简单密度计算中,将求出落在搜索区域内的点或线的总和,然后除以搜索区域的面积从而得到各像元的密度值。

核密度分析

而核密度则可将各点的已知总体数量从点位置开始向四周分散。在核密度中,在各点周围生成表面所依据的二次公式可为表面中心(点位置)赋予最高值,并在搜索半径距离范围内减少到零。对于各输出像元,将计算各分散表面的累计交汇点总数。

点密度与线密度比较好理解,即统计邻域内要素的个数然后除以邻域面积作为该单元格的值;而核密度估计其实是对直方图的一个自然拓展,主要是对核函数的一种空间应用。将原始空间中的向量作为输入向量,并返回特征空间(转换后的数据空间,可能是高维)中向量的点积的函数称为核函数

3.3 二次曲线

二次曲线英文全称为 Quadratives Curves,其可由含有两个变量的二次方程所定义。二次曲线能够表示点、线、圆、椭圆、抛物线或双曲线,其常规数学形式如下:

\[a_{00}x_0^2+2a_{01}x_0x_1+a_{11}x_1^2+b_0x_0+b_1x_1+c=0\]

若令 \(\mathbf{A}=[a_{ij}]\) 为对称 2 \(\times\) 2 矩阵,\(\mathbf{b}=[b_i]\)\(\mathbf{x}=[x_i]\) 为 2 \(\times\) 1 向量,则可将上式转换为矩阵形式(参考自《计算机图形学的几何工具》128 页):

\[\mathbf{x}^T\mathbf{A}\mathbf{x}+\mathbf{B}^T\mathbf{x}+c=0\]

参考文献

  1. 知乎. ArcGIS密度估计/热力图分析[EB/OL].

  2. 知乎. 什么是核密度估计?如何感性认识?[EB/OL].

  3. 博客园. 热力图生成算法及其具体实现[EB/OL].

  4. ArcMap. 点密度分析、线密度分析与核密度分析之间的区别[EB/OL].

  5. ArcMap. 核密度分析的工作原理[EB/OL].

  6. Silverman, B. W. Density Estimation for Statistics and Data Analysis.New York: Chapman and Hall, 1986.

  7. CSDN 博客.对核函数 Kernel 最通俗易懂的理解[EB/OL].

  8. 知乎. Sqazine 《多边形网格处理》翻译[EB/OL].