矩阵乘法

单目视觉标定原理

时光怂恿深爱的人放手 提交于 2020-01-26 02:44:30
在计算机视觉中,通过相机标定能够获取一定的参数,其原理是基于三大坐标系之间的转换和摄像机的畸变参数矩阵。在实验中经常用张正友标定发,进行摄像机标定,获取到内参数矩阵和外参数矩阵以及畸变参数矩阵。在应用中要区分三者作用。这也是在程序中函数输入量。 一、三大坐标系 在计算机视觉中,利用图像中目标的二维信息获取目标的三维信息,肯定需要相机模型的之间转化。 1、图像坐标系 在计算机系统中,描述图像的大小是像素,比如图像分辨率是1240*768.也就就是以为图像具矩阵rows是1024,cols是768.那图像的原点是在图像的左上角。 以图像左上角为原点建立以像素为单位的直接坐标系u-v。像素的横坐标u与纵坐标v分别是在其图像数组中所在的列数与所在行数。这是像素坐标,而不是物理坐标,为了后续的模型转换,有必要建立图像坐标系。 图像坐标系是以图像中心为原点,X轴和u轴平行,Y轴和v轴平行。 dx和dy标示图像中每个像素在X轴和Y轴的物理尺寸,其实就是换算比例。比如图像大小是1024*768,图像坐标系x-y中大小为19*17.那么dx就是19/1024 . 则图像中的每个像素在u-v坐标系中的坐标和在x-y坐标系中的坐标之间都存在如下的关系: (上述公式中我们假设物理坐标系中的单位为毫米,那么dx的的单位为:毫米/像素。那么x/dx的单位就是像素了,即和u的单位一样都是像素) 为了使用方便

张量网络学习笔记[1]

前提是你 提交于 2020-01-25 17:23:05
0. 简介与前置知识 本笔记着重学习Zhao Qibin教授等发表的"关于利用张量网络缩减维度和大规模优化"(Tensor Networks for dimensionality Reduction and Large-Scale Optimization)等张量网络相关的内容. 就目前来看, 网上并没有公开资源, 而前述学术文章的官方中文据悉仍在制作中. 本笔记视作笔者自己的一个自学概要, 其目的为加深理解, 方便回顾. 同时, 也希望能用我自己的理解串联有关内容, 给大家呈现更清晰地知识布局. 本笔记将不是一个完整的翻译作品, 而是一个根据自己理解有选择性的, 摘要性的翻译与整理工作. 希望为互联网上, 特别是中文圈内学习张量领域的热情贡献自己的一份力量. 由于笔者写过关于张量综述的笔记, 很多入门内容就不重复记述. 若有必要, 会提及"笔记系列"以指代该系列. 如果读者不理解什么是张量(tensor) 不理解什么是CP, TUCKER, KRONECKER及KHATRI-RAO乘法, 以及张量秩, mode-n乘法以及低秩分解的基本知识, 欢迎查阅我的另外一个笔记系列, 张量学习笔记. (笔者也经常查阅, 如果不熟悉大可放心. 只要学过, 随学随查即可) 为了方便顺应原作对公式的引用及方便大家查阅原书, 会将公式在原书内的tag写出 0.1. 本文所用图表与符号

WebGL Matrix4(4*4矩阵库)

為{幸葍}努か 提交于 2020-01-25 09:33:18
Matrix4是由<<WebGL编程指南>>作者写的提供WebGL的4*4矩阵操作的方法库,简化我们编写的代码。源代码共享地址,点击链接: Matrix4源代码 。 下面罗列了Matrix4库的所有方法: 1.setIdentity() 将Matrix4实例初始化为单位阵 2.setTranslate(x, y, z) 将Matrix4实例设置为平移变换矩阵,在x轴上平移的距离为x,在y轴上平移的距离为y,在z轴上平移的距离为z 3.setRotate(angle, x, y, z) 将Matrix4实例设置为旋转变换矩阵,旋转角度为angle,旋转轴为(x, y, z)。旋转轴(x,y,z)无需归一化 4.setScale(x, y, z) 将Matrix4实例设置为缩放变换矩阵,在三个轴上的缩放因子分别为x、y、z 5.translate(x, y, z) 将Matrix4实例生意一个平移变换矩阵(该平移矩阵在x轴上的平移距离为x,在y轴上的平移距离为y,在z轴上的平移距离为z),所得到的结果存储在Matrix4中 6.rotate(angle, x, y, z) 将Matrix4实例乘以一个旋转变换矩阵(该旋转矩阵旋转的角度为angle,旋转轴为(x、y、z)。旋转轴(x、y、z)无须归一化),所得的记过还存储在Matrix4中 7.scale(x, y, z)

深度学习与Keras实践|第三期:全连接层简介

我与影子孤独终老i 提交于 2020-01-25 00:57:31
1. 一个相对具体的模型——如何连接: 在第一期中,我们曾实现过如下的神经网络: 输入层 - Dense 4,relu,100 输出层 - Dense 5,softmax 这两个层都是全连接层,我们采用一种更加直观的表示方式展现这两个层是如何连接在一起的: 如图所示,输入层具有四个单元,输出层具有五个单元,作为全连接层,输入层的 每个单元都与下一层的所有单元相连 ,输出层的 每个单元也都与上一层的所有单元相连 。这就是全连接层直观的特点。 当这个模型用于多分类任务时,输出层的五个单元意味着最终的输出结果可以被划分到五个类别中的一个。 2.一个更具体的模型:全连接时到底做了什么? 在上面的模型中,我们看到了采用全连接层时模型的一个稍微具体的形式。但是,我们现在的模型仅仅展示给我们许多复杂的连接线(即使在我们的简单例子中,连接线也有20条之多),而一组数据信息在经过这些连接线、从一个处理层传递到下一个处理层时到底经历了什么,我们仍然不清楚。 实际上,输入的数据经历的过程可以用下面这个数学表达式来表示: output = activation(input · kernel + bias) 其中,activation是按逐个元素来计算的激活函数;kernel是由网络层创建的权值矩阵,权值矩阵将与输入该层的input矩阵进行点乘;bias是偏置量。下面,我们将具体解析这个数学表达式

「国家集训队」矩阵乘法

此生再无相见时 提交于 2020-01-24 16:34:40
「国家集训队」矩阵乘法 传送门 还是静态区间第 \(k\) 小,只不过变成二维平面而不是序列了。 整体二分做法:就把树状数组改成二维的就好了。。。 还写主席树的话就不太好写了。。。 参考代码: #include <cstdio> #define rg register #define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout) template < class T > inline void read(T& s) { s = 0; int f = 0; char c = getchar(); while ('0' > c || c > '9') f |= c == '-', c = getchar(); while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar(); s = f ? -s : s; } const int _ = 502, __ = 310002; int n, q, res[__], tr[_][_]; int num; struct node { int x, y, v, id, a, b, c, d, k; } t[__], tt1[__], tt2[__]; inline void update(int

四元数和欧拉角

空扰寡人 提交于 2020-01-23 16:28:53
来源:http://blog.csdn.net/candycat1992/article/details/41254799 四元数介绍 旋转,应该是三种坐标变换——缩放、旋转和平移,中最复杂的一种了。大家应该都听过,有一种旋转的表示方法叫四元数。按照我们的习惯,我们更加熟悉的是另外两种旋转的表示方法——矩阵旋转和 欧拉旋转 。矩阵旋转使用了一个4*4大小的矩阵来表示绕任意轴旋转的变换矩阵,而欧拉选择则是按照一定的坐标轴顺序(例如先x、再y、最后z)、每个轴旋转一定角度来变换坐标或向量,它实际上是一系列坐标轴旋转的组合。 那么, 四元数 又是什么呢?简单来说,四元数本质上是一种高阶复数(听不懂了吧。。。),是一个四维空间,相对于复数的二维空间。我们高中的时候应该都学过复数,一个复数由实部和虚部组成,即x = a + bi,i是虚数单位,如果你还记得的话应该知道i^2 = -1。而四元数其实和我们学到的这种是类似的,不同的是,它的虚部包含了三个虚数单位,i、j、k,即一个四元数可以表示为x = a + bi + cj + dk。那么,它和旋转为什么会有关系呢? 在Unity里,tranform组件有一个变量名为rotation,它的类型就是四元数。很多初学者会直接取rotation的x、y、z,认为它们分别对应了Transform面板里R的各个分量。当然很快我们就会发现这是完全不对的

行列式和矩阵的区别

我的未来我决定 提交于 2020-01-23 03:12:49
1,本质上 (1)行列式是一个数,一个值。当有未知数时就是一个表达式。 (2)矩阵是一个数表,一种数据结构,可以按照数据库表结构来理解,也可以理解成二维数组。 矩阵是不能像行列式那样计算的!! 2,数学符号表示上 (1)行列式是用双竖线表示的。 (2)矩阵是用括号表示的,大括号或者中括号。 3,结构上 (1)行列式的行和列数目必须相等n x n。 (2)矩阵的行和列数目不一定相等m x n,当行和列数目相等时被称为方阵n x n。 4,运算上 (1)相等: ①行列式相等,就是值相等,行和列数目不必相等,数据也不必相等。 ②矩阵相等,行和列数目必须相等,对应位置的数据也必须相等。 (2)加减: ①行列式相加减,就是两个数值相加减,结果还是数值。 ②矩阵相加减,对应位置的数据相加减。 (3)数乘: ①一个数乘以行列式,只能乘以行列式的一行或者一列。 ②一个数乘以矩阵,矩阵的每个元素都要乘上这个数。 (4)乘法 ①行列式相乘,就是两个数值相乘,结果还是数值。 ②矩阵相乘,A x B,矩阵A的行数需与矩阵B的列数相等。矩阵乘法不满足交换律,一般的, 注:行列式几何意义参考博文: https://blog.csdn.net/u010916338/article/details/104070193 来源: CSDN 作者: 无极仙翁 链接: https://blog.csdn.net

矩阵快速幂

余生颓废 提交于 2020-01-22 12:23:32
poj 3070 Fibonacci http://poj.org/problem?id=3070 模板题,矩阵都给你写好了。 1 #include<cstdio> 2 #include<cstring> 3 #define mt(a,b) memset(a,b,sizeof(a)) 4 class Matrix { ///矩阵 5 typedef int typev;///权值类型 6 static const int MV=2;///矩阵长度 7 static const int mod=10000;///%mod 8 friend Matrix operator *(const Matrix &a,const Matrix &b) { ///矩阵乘法,必须a的列等于b的行 9 Matrix ret; 10 ret.n=a.n; 11 ret.m=b.m; 12 ret.zero(); 13 if(a.m==b.n) { 14 for(int k=0; k<a.m; k++) { 15 for(int i=0; i<a.n; i++) { 16 if(a.val[i][k]) { 17 for(int j=0; j<b.m; j++) { 18 ret.val[i][j]+=a.val[i][k]*b.val[k][j]; 19 ret.val[i][j]%=mod;//

矩阵连乘问题

ⅰ亾dé卋堺 提交于 2020-01-22 03:15:11
由于矩阵乘法运算满足结合率,如果有矩阵A、B、C、D连续相乘,那么 A(BCD) = (AB)(CD) = … 。 所以可以找到一个好的加括号顺序使得计算量减少。可以使用动态规划问题解决。 动态规划解题步骤: 1, 找到最优子结构 即子问题最优可以令父问题也达到最优。本例中,若想(ABCDEFG)*(HIJKLMN)计算步骤最少,那么ABCDEFG加括号方式一定是最优的,同理HIJKLMN加括号也是最优的。可以尝试使用分治法(递归)先求出最优解。 2,使用空间换时间 使用一个空间保存子问题的解,另一个空间保存求解过程,计算某个子问题时,先判断子问题是否已经解决,如果已经解决,则直接返回已保存的解,否则计算这个子问题的解并存下。即,将上一步分治的计算结果存在一个数组里,并将分治的过程保存在另一个数组里。 3,找到最优解 根据保存的求解过程,找到最优解。 运行结果: 代码如下 # include <iostream> using namespace std ; /* 递归求解最优的加括号方式 * i 子问题下界 * j 子问题上界 * k 存储子问题的解 * s 存储子问题求解过程 * */ int mulSqlAct ( int w [ ] , int h [ ] , int i , int j , int * * k , int * * s ) { if ( j - i <= 1

【数据分析与科学计算可视化】numpy 和 matplotlib库总结

让人想犯罪 __ 提交于 2020-01-21 14:01:51
一、numpy库 numpy:科学计算包,支持N维数组运算、处理大型矩阵、成熟的广播函数库、矢量运算、线性代数、傅里叶变换、随机数生成,并可与C++/Fortran语言无缝结合。树莓派Python v3默认安装已经包含了numpy。 另: scipy:scipy依赖于numpy,提供了更多的数学工具,包括矩阵运算、线性方程组求解、积分、优化、插值、信号处理、图像处理、统计等等。 1.扩展库numpy简介 导入模板:(交换式) >>>import numpy as np 2.numpy库应用于数组 (1)简单数组的生成 >>>import numpy as np #把列表转化为数组 >>> np.array([0,1,2,3,4]) array([0, 1, 2, 3, 4])>>>np.array((0,1,2,3,4)) # 元组转化为数组array([0, 1, 2, 3, 4]) >>>np.array(range(5)) # 把range对象转换成数组 array([0, 1, 2, 3, 4]) >>>np.array([[1,2,3,4,],[5,6,7,8]]) #二维数组 array([[1, 2, 3, 4], [5, 6, 7, 8]]) >>>np.arange(8) # 类似于内置函数range() array([0,1,2,3,4,5,6,7]) >>