文章目录
- 一、NeRF代码
- 1.齐次化位姿坐标
- 2.理解rays_d和rays_o
- 3.min_line_dist的函数
- 问题1:该函数的作用
- 问题2:为何要计算ray_d的外积
- ①形成投影矩阵
- (1)投影矩阵
- (2)投影矩阵的性质
- (3)投影长度的计算
- ②A_i和b_i的含义!!!
- 4.最小二乘法
- ①目标
- ②数学模型
- (1)目标函数
- (2)方程的解
- (3)残差r=Ax-b的空间意义
- 问题:什么是值域空间
- (4)目标求解
- 二、集合论到位运算
- 1.哈希表
- ①属性
- ②表现方式
- ③结构
- 2.二级制和集合论的关系
- 3.位运算的优势
- 4.集合与集合
- 交集
- 并集
- 对称差
- 差
- 包含于
- 5.集合与元素
- 单元素集合
- 全集
- 补集
- 属于
- 添加元素
- 删除元素
- 取最小元素
- 6.一些库函数
- 7.遍历集合
一、NeRF代码
def spherify_poses(poses, bds):
p34_to_44 = lambda p : np.concatenate([p, np.tile(np.reshape(np.eye(4)[-1,:], [1,1,4]), [p.shape[0], 1,1])], 1)
rays_d = poses[:,:3,2:3]
rays_o = poses[:,:3,3:4]
def min_line_dist(rays_o, rays_d):
A_i = np.eye(3) - rays_d * np.transpose(rays_d, [0,2,1])
b_i = -A_i @ rays_o
pt_mindist = np.squeeze(-np.linalg.inv((np.transpose(A_i, [0,2,1]) @ A_i).mean(0)) @ (b_i).mean(0))
return pt_mindist
1.齐次化位姿坐标
p34_to_44 = lambda p : np.concatenate([p, np.tile(np.reshape(np.eye(4)[-1,:], [1,1,4]), [p.shape[0], 1,1])], 1)
2.理解rays_d和rays_o
①rays_d表示相机坐标系的z轴向量,也就是向前向量
②rays_o表示相机坐标系在世界坐标系的原点坐标
3.min_line_dist的函数
问题1:该函数的作用
问题2:为何要计算ray_d的外积
①形成投影矩阵
(1)投影矩阵
任意向量v,左乘d的外积,形成的结果为(d·v)d,d·v是向量的点乘,是标量,也就是说结果平行于向量d,从而达到了将v向量投影到了向量d的方向上
(2)投影矩阵的性质
投影矩阵的秩为1,表示行和列都线性相关,并且都和d线性相关
(3)投影长度的计算
v·d/||d||
②A_i和b_i的含义!!!
我的理解是
A_i是一个系数
我们先看A_i@ray_o
假设绿线是光线向量。那么红线就是原点和相机原点的向量,也就是A_i中的np.eye(3)@ray_o
刚才我们已经外积是一个投影矩阵,那么外积@ray_o,就是将红线投影到绿线上,也是绿线的红线部分,那么(np.eye(3) - rays_d * np.transpose(rays_d, [0,2,1]))@ray_o,就是进行向量的减法,就是蓝线的,取反方向就是灰线
4.最小二乘法
因为这个函数在实现最小二乘法,所以我进行了具体的学习
①目标
举例
求第三个式子最小的x1,x2取值
②数学模型
(1)目标函数
最小化残差求出参数x的值
(2)方程的解
(3)残差r=Ax-b的空间意义
b正交A的值域:这里可以联想到B_id的作用
问题:什么是值域空间
(4)目标求解
二、集合论到位运算
1.哈希表
①属性
模表大小
哈希函数
键
值
②表现方式
数组+链表(解决哈希冲突)
③结构
数组 链表 哈希函数 插入 获取 删除
2.二级制和集合论的关系
也就是加入集合{0,2,4} 用二进制表示10101
3.位运算的优势
并行运算
4.集合与集合
交集
A&B
并集
A|B
对称差
A⊕B
差
A&~B
A⊕B
包含于
A&B=B
A|B=A
5.集合与元素
单元素集合
1<<2 ={2}
全集
1<<3-1 ={0,1,2}
补集
((1<<4)-1)⊕s
属于
判断i是否属于s
(s<<i)&1=1
添加元素
(1<<i)|s
删除元素
~(1<<i)&s
s⊕(1<<i)
删除最小
s&(s-1)
取最小元素
s&~(s-1)
6.一些库函数
集合大小
__builtin_popcount(s) C/C++
s.bit_count() python
二进制长度
__lg(s)+1 C++
log2(s)+1 c
s.bit_length() python
7.遍历集合
#include<stdio.h>
int main()
{
unsigned int s =5;
int n=3;
for (int i = 0; i < n; i++) {
if ((s >> i) & 1) { printf("%d in range\n",i);}
}
}
最小元素遍历
for(int s=n;s&(~s+1);s-=s&(~s+1))